- 博客(26)
- 收藏
- 关注
原创 Redis真的是单线程的吗?
因为 Redis 是跑在「单线程」中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入 或 输出都是阻塞的,所以I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O阻塞导,致整个进程无法对其它客户提供服务。虽然 Redis 的主要工作(网络 /O 和执行命令)-直是单线程模型,但是在 Redis 6.0 版本之后,也采用了多个 I/0 线程来处理网络请求,这是因为随着网络硬件的性能提升,Redis的性能瓶颈有时会出现在网络 //0 的处理上.
2025-02-03 16:27:49
1275
原创 Java中的拆箱和装箱
show方法接受Integer对象作为参数,当调用 show(3)时,会将int值转换成对应的Integer对象,这就是所谓的自动装箱,show方法返回Integer对象,而 int result= show(3);另一个非常重要的原因就是在Java中绝大部分方法或类都是用来处理类类型对象的,如ArrayList集合类就只能以类作为他的存储对象,而这时如果想把一个int型的数据存入list是不可能的,必须把它包装成类也就是Integer才能被List所接受。所以Integer的存在是很必要的。
2025-01-23 11:50:54
1048
原创 BIGDECIMAL和DOUBLE
这无疑是一个很严重的问题,尤其是当电商网站的并发量上去的时候,出现的问题将是巨大的。double会出现精度丢失的问题,double执行的是二进制浮点运算,二进制有些情况下不能准确的表示一个小数,就像十进制不能准确的表示1/3(1/3=0.3333..),也就是说二进制表示小数的时候只能够表示能够用1/(2^n)的和的任意组合,但是0.1不能够精确表示,因为它不能够表示成为1/(2^n)的和的形式。然后,我们使用 add()方法计算它们的和,并使用 mu1tiply()方法计算它们的乘积。
2025-01-23 11:37:43
407
原创 回溯法及其剪枝优化
回溯法也可以叫做回溯搜索法,它是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。所以以下讲解中,回溯函数也就是递归函数,指的都是一个函数。
2025-01-21 14:54:38
1142
原创 完全解读布隆过滤器
布隆过滤器(BloomFilter)是1970年由布隆提出的,是一种非常节省空间的概率数据结构,运行速度快,占用内存小。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。主要用于判断一个元素是否在一个集合中。主要是解决大规模数据下不需要精确过滤的场景,如检查垃圾邮件地址,爬虫URL地址去重,解决缓存穿透问题等。优点●存储空间和插入/查询时间都是常数O(k)●支持海量数据场景下高效率判断元素是否存在。
2025-01-18 15:58:47
762
原创 全面解析Spring事务的失效以及如何避免
在使用Spring框架进行企业级应用开发时,事务管理是保证数据一致性和系统稳定性的关键。Spring通过提供声明式事务管理,使得开发者可以通过简单的注解(如@Transactional)来控制事务的边界,极大地简化了事务管理的复杂性。然而,在实际开发中,事务注解失效的问题时有发生,这不仅增加了系统的复杂度,也给应用的稳定性和数据的一致性带来了严重的风险。理解事务注解失效的原因及其危害,对于开发高质量、可靠的Spring应用至关重要。
2025-01-16 21:44:39
717
原创 分布式系统中的CAP理论(也称为 Brewer‘s 定理)
CAP 定理在分布式系统的设计和决策中起着重要的指导作用,不同的系统会根据业务需求和使用场景选择不同的 CAP 特性组合。选择 CP 可能适合对数据一致性要求极高的金融、票务等系统,而 AP 更适合对可用性要求高的社交、电商等系统。开发人员在设计分布式系统时,需要根据具体情况评估每个特性的重要性,在不同特性之间做出权衡,确保系统能够在复杂的网络环境下满足用户和业务的需求。
2025-01-06 22:25:40
950
原创 线程池与事务的细节问题
很多人在使用事务的时候,基本都是在方法上添加@Transactional(rollbackFor = Exception.class)注解就完事了。如果有的业务需要异步执行的话,也都是用的线程池来执行,但两者要是遇到一起了,那么遇到的问题可就没有那么简单了,而很多人都不知道其中的细节,生产上产生的问题也很多。就比如 主线程异常了,子线程的数据却没有回滚。或者主线程和子线程中的数据都没有回滚,那到底什么时候会回滚,什么时候不会回滚呢?下面我们来详细的介绍多线程操作数据库的问题。
2025-01-06 15:58:58
853
原创 二叉树遍历(递归和迭代)
此时我们用迭代法写出了二叉树的前后中序遍历,大家可以看出前序和中序是完全两种代码风格,并不像递归写法那样代码稍做调整,就可以实现前后中序。这是因为前序遍历中访问节点(遍历节点)和处理节点(将元素放进result数组中)可以同步处理,但是中序就无法做到同步!
2025-01-01 12:32:17
1990
原创 缓存雪崩及解决办法
是指在缓存系统中,由于大量缓存数据在同一时间失效,导致大量原本可以直接从缓存中获取数据的请求直接转向数据库或后端服务,从而给数据库或后端服务带来巨大的压力,甚至可能导致系统崩溃的一种现象。
2024-12-30 20:43:43
1064
原创 排序算法原理及其实现
通常选取第一个元素作为基准元素,然后从数列的两端开始向中间扫描,把比基准小的元素放到基准左边,比基准大的元素放到基准右边,经过这一趟排序后,基准元素就处在它最终排序后的正确位置上了,然后再递归地对左右两部分进行同样的操作。将两个排序好的子序列合并成一个最终的排序序列。将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面)。
2024-12-28 22:52:51
686
1
原创 MySQL锁机制
2.第二种实现方式和第一种差不多,同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致就更新,否则就是版本冲突。表级锁是mysql锁中粒度最大的一种锁,表示当前的操作对整张表加锁,资源开销比行锁少,不会出现死锁的情况,但是发生锁冲突的概率很大,因为同 一张表上任何时刻只能有一个更新在执行。表级锁速度快,但冲突多,行级冲突少,但速度慢。
2024-12-27 23:02:03
701
原创 组件讲解-图形验证码使用(应对高并发场景)
行为验证码采用嵌入式集成方式,接入方便,安全,高效。抛弃了传统字符型验证码展示-填写字符-比对答案的流程,采用验证码展示-采集用户行为-分析用户行为流程,用户只需要产生指定的行为轨迹,不需要键盘手动输入,极大优化了传统验证码用户体验不佳的问题;同时,快速、准确的返回人机判定结果。目前对外提供两种类型的验证码,其中包含滑动拼图、文字点选。
2024-12-27 22:53:03
953
原创 MYSQL-分库分表
分库分表是数据库设计中的一种策略,用于将数据分散存储在多个数据库(分库)和多个表(分表)中,以提高数据库的可扩展性、性能和可用性。这种策略通常在数据量非常大、访问量非常高的情况下使用。
2024-12-19 23:03:55
585
原创 MYSQL细琐但是常见问题
方式一:使用UNIQUE约束 在表的相关列上添加UNIQUE约束,确保每个值在该列中唯一。如果尝试插入重复的email,MySQL会返回错误。方式二:使用INSERT ... ON DUPLICATE KEY UPDATE 这种语句允许在插入记录时处理重复键的情况。方式三:使用INSERT IGNORE: 该语句会在插入记录时忽略那些因重复键而导致的插入错误。如果email已经存在,这条插入语句将被忽略而不会返回错误。选择哪种方法取决于具体的需求: 如果需要保证全局唯一性,使用UNIQUE约束是最佳做法。
2024-12-07 13:28:15
782
原创 MYSQL面试今天二十问
• 答案:MySQL主要由数据库(存储数据的逻辑容器)、表(存储数据的二维结构)、字段(表中的列,定义数据类型和属性)、索引(用于加快数据查询速度的数据结构)、视图(虚拟表,基于查询结果)等部分组成。• 答案:常见的有B - Tree索引(用于常规的比较操作,如等于、范围查询等)、哈希索引(适用于精确匹配查询)、全文索引(用于在文本数据中进行关键词搜索)和空间索引(用于处理地理空间数据)。外键是用于建立两个表之间关联的列,它的值必须在关联表的主键列或者唯一键列中存在,主要用于维护数据的参照完整性。
2024-12-04 22:05:28
1217
原创 SpringCloud
1、 Spring Cloud是一系列框架的有序集合。它利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、智能路由、消息总线、负载均衡、断路器、数据监控等,都可以用SpringBoot的开发风格做到一键启动和部署。
2024-12-01 23:04:07
855
原创 ON 、WHERE和HAVING区别
on、where、having这三个都可以加条件的子句中,on是最先执行,where次之,having最后。有时候如果这先后顺序不影响中间结果的话,那最终结果是相同的。但因为on是先把不符合条件的记录过滤后才进行统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的。根据上面的分析,可以知道where也应该比having快点的,因为它过滤数据后才进行sum,所以having是最慢的。但也不是说having没用,因为有时在步骤3还没出来都不知道那个记录才符合要求时,就要用having了。
2024-11-30 14:24:53
1192
原创 初识消息队列—RocketMQ
消息队列是一种中间件技术,它允许不同系统或组件通过异步方式交换消息,实现解耦、缓冲和异步处理,以提高应用程序的可扩展性和响应能力。
2024-11-28 20:52:10
1093
1
原创 MYSQL——索引下推
理解上面的知识后就可以回答以下问题。二级索引取出的数据是依次回表还是一次回表?答:依次回表。索引下推是为了什么发明的?答:减少回表,而不是避免回表(避免回表用覆盖索引)
2024-11-27 22:52:06
1377
原创 Redis的看门狗机制
Redis锁的延期机制,通常被称为“看门狗”机制,是为了处理持有锁的客户端在执行任务时发生崩溃或网络分区等异常情况,导致锁无法被释放,从而避免死锁的发生。
2024-11-26 17:52:40
4225
原创 ConcurrentHashMap原理
相信大家在面试的时候经常被问到类似问题:“实现HashMap线程安全的办法有哪些”“jdk1.7和jdk1.8在HashMap上面有什么区别?”“ConcurrentHashMap底层是怎么保证线程安全的”……当面试官问到HashMap的线程安全问题的时候大概率是想让你往ConcurretHashMap方向回答了(别问,问就是我已经被击穿几次了)。
2024-11-25 22:57:30
1009
原创 缓存与数据库一致性——延迟双删
延迟双删(Delay Double Delete)是一种在数据更新或删除时为了保证数据一致性而采取的策略。这种策略通常用于解决数据在缓存和数据库中不一致的问题。
2024-11-25 22:20:22
5752
原创 Java-CountDownLatch的用法
CountDownLatch也属于JUC。线程可以使用await()进行等待,多线程进行递减计数,等到计数到0的时候等待即不再阻塞,从而向下执行。 在日常开发中经常会遇到需要在主线程中开启多个线程去并行执行任务,并且主线程需要等待所有子线程执行完毕后再进行汇总的场景。
2024-11-24 16:51:05
696
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人