本篇文章给大家谈谈redisttl,以及Redis ttl更新对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
Redis过期键删除策略和内存淘汰策略
惰性删除+定期删除
键过期后并不会立即删除,而是等到使用它时,先判断该键是否已经过期,如果过期则删除
对内存不友好,对CPU友好
redis每隔一段时间随机检测一部分数据(并不是全部)是否过期,如果已过期则删除
redis.conf中的hz参数用来配置每秒执行几次定期删除,默认值是10,即100ms/次
redis.conf中的maxmemory-samples参数用来指定每次检测几条数据,默认5
对CPU不友好,对内存友好
redis.conf中的maxmemory参数配置了redis的最大内存,maxmemory-policy配置了内存淘汰策略,当redis内存达到最大后,会根据内存淘汰策略淘汰部分数据。
redis提供了8种内存淘汰策略:
no-eviction:当内存达到最大后,新数据不能写入,会报错
allkeys-lru:当内存达到最大后,淘汰最近最少使用的数据(最常用的策略)
allkeys-random:当内存达到最大后,随机淘汰
allkeys-lfu:当内存达到最大后,淘汰最少使御纯用的数据
volatitle-lru:当内存达到最大后,从设置了过期键的数据中,淘汰最近最少使用的数据
volatitle-random:当内存达到最大后,从设置了过期键的数据中,随机淘汰
volatitle-lfu:当内存达到最大后,从设置了过期键的数据中,淘汰最少使用的数据
volatitle-ttl:当内存达到最大后,淘汰最早过期的数据
标准的LRU算法需要维护一个链表,当某个数据被使用时就把它放到链表头部,这样就保证了链表是按照使用时间排序的,当需要淘汰数据时,就从链表尾部删除部分数据。
标准LRU算法要进行大量的计算,redis采取了近似LRU算法的操作。
redis给每个键维护了一个24bit的属性字段,用来记录最后一次使用的时间戳。redis根据maxmemory-samples随机抽取仔册一部分数据,将最旧的数据淘汰,指到内存降下来。后来redis又引入了淘汰池,淘汰池内的数据量等于maxmemory-samples,每次淘汰时将随机抽取的数据和淘汰池中的数据合并,淘汰最旧的数据,然后将剩余最旧的数据维护到淘汰池中,等待下次循环。
为什么需要LFU算法?
现在假设这种场景:redis中有两个键A和B,其使用频率如上面所示,当到达$时,因为A的使用时间比B晚,按照LRU算法会淘汰B,但是从使用频率上看,B明显比A使用的更频发,应该淘汰A。
为了解决上面的问题,Redis引入了LFU算法,淘汰最少使用的数据。原理如下:
LFU给每个数据维护了一个计数器,每次使用都会使计数器增加,淘汰使用次数最少的键。但是这样又有新的问题:
①新的key如果计数器为0,可能就会一直被淘汰
redis解决方案:redis给每个新的键的计数器一个初始值
②某个键可能前一段时间被频繁使用,但是一段时间后使用频率就会下降。
镇戚咐 redis解决方案:如果某个键一段时间不使用,计数器会减小
踩坑记之redis ttl=0
最近往服务的消息推送上加了一个分布式的锁,用来防止短时间内相同消息重复处理的情况,思路是用redis的setnx 设置一个key(key值根据业务制定,需要唯一),然后设置key的超时时间为5分钟,用于防止系统异常时没有主动释放锁的防御,在线上灰度环境试运行后,手如发现两个问题,一个是程序没有主动释放锁,另一个是redis没有删除超时过期的key,导致key值一直存在,后续的操作一直被排斥。
经调查发现,第一个问题,程序没有主动释放key值,是因为key值有一部分引用了业务消息的状态,即格式为:systemA-cluster-lock-业务id-status-action,其中status在处理前后发生了变化导致没能删除原来的key,做法是通过copy多一份key值保留;
第二个问题:redis没有删除超时过期的key,通过ttl key命令查看,return 0,通过查看官方文档 ,redis的ttl返回的是剩余过期慎局时间,当key不存在时返回-2,即没有返回0的情况。继续宽薯让折腾,终于在 这边博客中找到了答案,原来和redis的配置有关,当redis为slave且read_only关闭时,redis不会删除过期的key值,此时ttl key返回0,通过查看redis配置,果然如此,于是修改redis配置,第二个问题得解。
如何查询redis的缓存文件路径
1、首先找到redis的安装目拆羡录,如下图测试环境目录,进入到/opt/install/redis-2.8.19/src,如下图所示。
2、需要注意,一般情况下是在redis的安装目录下,有时也会物辩在bin目录下,如下图所示。
3、进入到该目录后,执行旅蚂拍linux命令启动redis,命令为:./redis-cli -h 127.0.0.1 -p 6379。
4、查看当前key值:依次get这两个值:get key值。
5、ttl查询过期时间,如图通过ttl的方法加key值,就可以快速查询到过期时间。
Redis 的五大数据类型和 TTL
redis 是 key-value 的数据结构,每条数据都是⼀个键值对。
可以通过 type 命令查看 Reids key 所存储的 value 的类型。
1)字符串 string
2)哈希 hash
3)列表 list
4)集合 set
5)有慧戚顷序集合 zset
语法:
以秒为仔友单位,返回给定 key 的剩余生存时间( TTL, time to live )。
返回值:
调用 set 命令后会重置 key 的 ttl。
调用 hset 命令后不会重置 key 的 ttl。
调用 lpush 命令后不会重置 key 的 ttl。
调用 sadd 命令后前陆不会重置 key 的 ttl。
调用 zadd 命令后不会重置 key 的 ttl。
[img]redis设置键的过期时间
❑EXPIRE<key><ttl>命令用慧态于将键key的生存时间设置为ttl秒。
❑PEXPIRE<key><ttl>命令用于将键key的生存时间设置为ttl毫秒。
❑EXPIREAT<key><timestamp>命令用于将键key的手指过期时间设置为timestamp所指定的秒数时间戳。
❑PEXPIREAT<key>前薯源<timestamp>命令用于将键key的过期时间设置为timestamp所指定的毫秒数时间戳。
例如
关于redisttl和Redis ttl更新的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。