Redis相关

发布时间 2023-12-26 10:35:48作者: java奇才

2023.12.26 臭宝今天早上起床没拉粑粑,so  sad     o(╥﹏╥)o

 

1.Redis为什么快?

Redis是存在内存中的,Redis是单线程的,避免上下文切换。

渐进式Rehash

Redis的所有数据都是存在一个hash数组上的,hash数组每个元素都是一个链表(所有类型都是,如String,hash,list,set,zset,bitmap),类似于hashmap的结构。

数组的长度一开始很小,随着数据不断插入,数组需要扩容,扩容后需要对所有元素进行Rehash,把1万个数据的Rehash分成1万条请求来执行,旧的hash数组和新的hash数组都可以用来查询,

因为redis是单线程的,所以在Rehash的过程中也可以对数据进行操作,避免了rehash导致卡顿的问题。

缓存时间戳

使用Redis很多情况下都需要设置过期时间,而Redis在设置过期时间的过程中,需要调用系统的时间函数,这个过程很耗费时间,所以Redis后台有个定时任务来每毫秒读取时间存到缓存,从而提高插入速度

 

  2. Redis过期策略和内存淘汰机制

Redis过期策略:

  定期删除:Redis会将所有设置了过期时间的key放到一个过期字典中,默认每秒进行10次扫描过期的key,每次扫描删除20个已过期的key,如果删除的key数量超过总数量的1/4,那么再次进行扫描。所以Redis设置过期时间时,要给过期时间加上一个随机数范围,防止定时任务持续扫描卡顿。

  上面说的是主库的删除策略,从库的过期策略是,在主库的key过期删除后,会在AOF文件中新增一条del删除指令,然后把这条指令同步到所有备库,因为是异步的,所以可能会存在主从数据不一致问题。

  惰性删除:过期的key在被访问的时候才删除

  因为定期删除可能会存在部分过期key没有被删除的情况,所以reds的过期策略是这两种删除策略的结合。

未完待续!