自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(10)
  • 收藏
  • 关注

原创 redis中的分布式锁

分布式锁是一个多节点共享的同步机制,通过在多个节点之间协调访问资源,只有获取了分布式锁的节点才能访问和操作关键数据,避免了多节点同时访问操作。如果单纯只是通过setnx的添加和delete的删除来完成分布式锁的获取和释放,那可能存在一个问题就是业务逻辑中出现异常,导致无法执行释放锁的逻辑,就会造成死锁。在上述逻辑中,如果节点刚获取到锁,还没来得及给添加的键值对设定有效期就发生了异常,那么上述的解决方案仍无法解决因无法执行释放锁的逻辑造成死锁的问题。

2024-10-16 19:55:49 535

原创 关于redis中的缓存雪崩,缓存击穿,缓存穿透及内存淘汰策略

Redis使用内存存储数据,在执行每一个命令前,会调用检测内存 是否充足。如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指 令 清理存储空间。清理数据的策略称为逐出算法。《2》影响数据逐出的相关配置:《2.1》maxmemory:最大可使用内存占用物理内存的比例,默认值为0,表示不限制,生产环境中根据需求设 定,通常设置在50%以上。《2.2》每次选取待删除数据的个数。

2024-10-13 16:24:02 1001

原创 Springboot自动配置的原理分析

1.通过注解声明springboot项目的启动类2.通过注解声明此类也是一个配置类3.通过注解开启springboot的自动配置4.通过注解将要自动配置的组件注入容 器 中。5.通过类中的方法完成自动配置组件的 注 入。6.在selectImports()方法中调用方法。7.在getAutoConfigurationEntry()中又调用方法。8.在上面方法中又调用了方法。9.在方法中又调用了10. 在方法中会找到需要加载的配置类的位置:在。

2024-10-02 15:01:54 1077 1

原创 ElasticSearch的搜索原理

Elasticsearch的搜索原理主要是通过倒排索引实现的,而倒排索引是相对于像MySQL数据库搜索数据的正向索引而言的。正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程。《2》案例分析:假设在数据库中有以下数据表 :当我们给id字段添加索引后,在查询数据时,通过id字段可很快查询到相关数据,但如果我们通过title字段进行模糊查询时,则会执行以下的步骤:①用户输入搜索条件:如%手机%。

2024-09-28 22:16:31 854

原创 Bean对象的生命周期

bean对象的整个创建过程如下图所示:注意事项:bean的生命周期只针对于通过单例模式创建出来的bean对象,对于多例模式创建的bean对象而言,生命周期这个概念是没有意义的。

2024-09-21 01:36:13 861

原创 Spring框架中的循环依赖和三级缓存

三级缓存是Spring框架提供的三个Map集合,用于存储Bean对象在创建过程中形成的完整Bean对象和不完整的Bean对象。

2024-09-14 19:25:29 911

原创 关于JDBC中常见的类,接口及方法的总结

ResultSet接口:主要用于sql中的查询语句的结构接收。(4)PreparedStatement接口:继承于Statement接口,用于执行预编译sql语句 (动态的sql语句),

2024-08-14 22:29:58 887

原创 HashMpa集合的底层存储原理

后续添加元素,如果仍然在此位置发生哈希冲突,就继续往链表最后添加的元素后面连接,用p.next==null判断,在此过程中重复上面的过程,即判断后续添加的元素与前面的元素的key值是否相同,相同则覆盖原元素的value,不相同则继续进行连接。如果同一个位置的连接的元素超过8个(链表长度大于8),同时table数组的长度小于64,则需进行扩容,当同一个位置的连接的元素超过8个同时数组长度超过64,则改为红黑树的形式连接要添加的元素。还有一种情况也需要扩容,即数组中的元素个数大于扩容阈值,此时会进行扩容。

2024-07-21 21:59:16 704

原创 关于ArrlistList和LinkedList的区别

观察上面代码我们发现,当我们要在双向链表中下标值为index位置添加一个新的节点时,它先会先找到链表中原本在index位置的节点,并将其定义为节点succ,并定义一个节点pred为节点succ的上一个节点。在最下面的代码中,原本节点pred的变量next原本指向节点succ,succ的变量prev指向pred,经过此代码后,新加的节点newnode的变量prev指向了节点pred,next指向了节点succ。此时即形成了一个双向链表,在这个链表中,first指向了前面的节点,而last指向了新的节点。

2024-07-14 15:58:29 1017

原创 StringBuilder的底层存储原理

即将原初始化数组的长度*2再+2,再判断扩容之后的数组容量newCapacity是否仍然小于要存储的对象内容的最小容量minCapacity,如果是,则将要储存对象内容的容量赋值给扩容之后的数组容量,否则判断扩容之后的数组容量是否小于等于0或者大于MAX_ARRAY_SIZE(数组最大容量),如果不是则扩容后的容量即为初始化数组的容量。调用此构造方法,初始化数组value的容量为参数str的长度+16.,并在原StringBuilder实例化对象的内容后面调用append方法追加参数str的内容。

2024-07-07 14:27:17 682 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除