请问哪里可以做网站,wordpress升级插件出现意外错误,怎样才能做自己的网站,快速建站框架文章目录 1. 过期key处理1.1 惰性删除1.2 周期删除 2. 内存淘汰策略 Redis 中数据过期策略采用定期删除惰性删除策略结合起来#xff0c;以及采用淘汰策略来兜底。
定期删除策略#xff1a;Redis 启用一个定时器定时监视所有的 key#xff0c;判断key是否过期#xff0c;过… 文章目录 1. 过期key处理1.1 惰性删除1.2 周期删除 2. 内存淘汰策略 Redis 中数据过期策略采用定期删除惰性删除策略结合起来以及采用淘汰策略来兜底。
定期删除策略Redis 启用一个定时器定时监视所有的 key判断key是否过期过期的话就删除。这种策略可以保证过期的 key 最终都会被删除但是也存在严重的缺点每次都遍历内存中所有的数据非常消耗 CPU 资源并且当 key 已过期但是定时器还处于未唤起状态这段时间内 key 仍然可以用。
惰性删除策略在获取 key 时先判断 key 是否过期如果过期则删除。这种方式存在一个缺点如果这个 key 一直未被使用那么它一直在内存中其实它已经过期了会浪费大量的空间。
这两种策略天然的互补结合起来之后定时删除策略就发生了一些改变不在是每次扫描全部的 key 了而是随机抽取一部分 key 进行检查这样就降低了对 CPU 资源的损耗惰性删除策略互补了为检查到的key基本上满足了所有要求。但是有时候就是那么的巧既没有被定时器抽取到又没有被使用这些数据又如何从内存中消失没关系还有内存淘汰机制当内存不够用时内存淘汰机制就会上场。
内存淘汰机制内存淘汰机制就保证了在redis的内存占用过多的时候去进行内存淘汰也就是删除一部分key保证redis的内存占用率不会过高。
redis 提供 6种数据淘汰策略volatile-lru从已设置过期时间的数据集server.db[i].expires中挑选最近最少使用的数据淘汰volatile-ttl从已设置过期时间的数据集server.db[i].expires中挑选将要过期的数据淘汰volatile-random从已设置过期时间的数据集server.db[i].expires中随机移除keyallkeys-lru当内存不足以容纳新写入数据时在键空间中移除最近最少使用的key这个是最常用的allkeys-random从数据集server.db[i].dict中任意选择数据淘汰noeviction当内存不足以容纳新写入数据时新写入操作会报错无法写入新数据一般不采用4.0版本后增加以下两种volatile-lfu从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰allkeys-lfu当内存不足以容纳新写入数据时在键空间中移除最不经常使用的key 1. 过期key处理
Redis之所以性能强最主要的原因就是基于内存存储。然而单节点的Redis其内存大小不宜过大会影响持久化或主从同步性能。我们可以通过修改配置文件来设置Redis的最大内存当内存使用达到上限时就无法存储更多数据了。为了解决这个问题Redis提供了一些策略实现内存回收内存过期策略在学习Redis缓存的时候我们说过可以通过expire命令给Redis的key设置TTL存活时间
可以发现当key的TTL到期以后再次访问name返回的是nil说明这个key已经不存在了对应的内存也得到释放。从而起到内存回收的目的。Redis本身是一个典型的key-value内存存储数据库因此所有的key、value都保存在之前学习过的Dict结构中。不过在其database结构体中有两个Dict一个用来记录key-value另一个用来记录key-TTL。
这里有两个问题需要我们思考Redis是如何知道一个key是否过期呢利用两个Dict分别记录key-value对及key-ttl对是不是TTL到期就立即删除了呢
1.1 惰性删除
惰性删除顾明思议并不是在TTL到期后就立刻删除而是在访问一个key的时候检查该key的存活时间如果已经过期才执行删除。 1.2 周期删除
周期删除顾明思议是通过一个定时任务周期性的抽样部分过期的key然后执行删除。执行周期有两种Redis服务初始化函数initServer()中设置定时任务按照server.hz的频率来执行过期key清理模式为SLOWRedis的每个事件循环前会调用beforeSleep()函数执行过期key清理模式为FAST
周期删除顾明思议是通过一个定时任务周期性的抽样部分过期的key然后执行删除。执行周期有两种Redis服务初始化函数initServer()中设置定时任务按照server.hz的频率来执行过期key清理模式为SLOWRedis的每个事件循环前会调用beforeSleep()函数执行过期key清理模式为FAST
SLOW模式规则
执行频率受server.hz影响默认为10即每秒执行10次每个执行周期100ms。执行清理耗时不超过一次执行周期的25%.默认slow模式耗时不超过25ms逐个遍历db逐个遍历db中的bucket抽取20个key判断是否过期如果没达到时间上限25ms并且过期key比例大于10%再进行一次抽样否则结束FAST模式规则过期key比例小于10%不执行 执行频率受beforeSleep()调用频率影响但两次FAST模式间隔不低于2ms执行清理耗时不超过1ms逐个遍历db逐个遍历db中的bucket抽取20个key判断是否过期如果没达到时间上限1ms并且过期key比例大于10%再进行一次抽样否则结束
小总结RedisKey的TTL记录方式在RedisDB中通过一个Dict记录每个Key的TTL时间过期key的删除策略惰性清理每次查找key时判断是否过期如果过期则删除定期清理定期抽样部分key判断是否过期如果过期则删除。定期清理的两种模式SLOW模式执行频率默认为10每次不超过25msFAST模式执行频率不固定但两次间隔不低于2ms每次耗时不超过1ms 2. 内存淘汰策略
内存淘汰就是当Redis内存使用达到设置的上限时主动挑选部分key删除以释放更多内存的流程。Redis会在处理客户端命令的方法processCommand()中尝试做内存淘汰
淘汰策略Redis支持8种不同策略来选择要删除的key
noeviction 不淘汰任何key但是内存满时不允许写入新数据默认就是这种策略不推荐使用。volatile-ttl 对设置了TTL的key比较key的剩余TTL值TTL越小越先被淘汰allkeys-random对全体key 随机进行淘汰。也就是直接从db-dict中随机挑选volatile-random对设置了TTL的key 随机进行淘汰。也就是从db-expires中随机挑选。allkeys-lru 对全体key基于LRU算法进行淘汰volatile-lru 对设置了TTL的key基于LRU算法进行淘汰allkeys-lfu 对全体key基于LFU算法进行淘汰volatile-lfu 对设置了TTL的key基于LFI算法进行淘汰比较容易混淆的有两个 LRULeast Recently Used最少最近使用。用当前时间减去最后一次访问时间这个值越大则淘汰优先级越高。LFULeast Frequently Used最少频率使用。会统计每个key的访问频率值越小淘汰优先级越高。 可以通过在Redis的配置文件中设置maxmemory-policy选项来选择合适的内存淘汰策略。
例如将其设置为allkeys-lru
maxmemory-policy allkeys-lru