redis中数据是怎样清除的?
2019-08-09 10:36
1006 查看
1、设置过期时间
Redis中有个设置时间过期的功能,即对存储在 redis 数据库中的值可以设置一个过期时间。作为一个缓存数据库,这是非常实用的。
如我们一般项目中的 token 或者一些登录信息,尤其是短信验证码都是有时间限制的,按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能。我们 set key 的时候,都可以给一个 expire time,就是过期时间,通过过期时间我们可以指定这个 key 可以存活的时间。
redis是怎么对这批key进行删除的?
- 定期删除
redis默认是每隔 100ms 就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注意这里是随机抽取的。
为什么要随机呢?你想一想假如 redis 存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会给 CPU 带来很大的负载! - 惰性删除
定期删除可能会导致很多过期 key 到了时间并没有被删除掉。所以就有了惰性删除。假如你的过期 key,靠定期删除没有被删除掉,还停留在内存里,除非你的系统去查一下那个 key,才会被redis给删除掉。这就是所谓的惰性删除。也就是主动调用方法删除。
注意:如果定期删除漏掉了很多过期 key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?如果大量过期key堆积在内存里,导致redis内存块耗尽了。怎么解决这个问题呢?
2、redis 内存淘汰机制
怎么保证redis中的数据时热点数据?
redis 提供 6种数据淘汰策略:
- volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
- volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
- volatile-random:从已设置过期时间的数据集中随机任意选择数据淘汰
- allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)
- allkeys-random:从数据集中随机任意选择数据淘汰
- no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用!
4.0版本后增加以下两种:
- volatile-lfu:从已设置过期时间的数据集中挑选最不经常使用的数据淘汰
- allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的key
相关文章推荐
- 怎样将mysql中的数据导入redis
- 【09-Redis-分区:怎样将数据分布到多个redis实例】
- redis清除全部数据vbs脚本
- 清除redis中所有数据
- redis清除数据/xargs使用
- Swift开发教程--怎样清除模拟器的数据
- Redis数据清除问题
- Redis 设计与实现 (一)--数据结构
- 清除所有表数据
- 清除JBPM数据的SQL
- Android开发中常用计算缓存数据和清除缓存数据工具类
- 清除连接到虚拟机的 windows samba缓存数据
- 我知道点redis-数据结构与对象(对象)-对象实现
- Redis Hash类型数据常用命令总结
- 【Redis】6.Redis数据类型 散列的基本使用
- Redis 数据类型分析 字符串 哈希 列表 集合 有序集合 优缺点 分析 注意事项 存储结构
- 怎样提取Excel工作表中排名前几名的名称和数据
- Redis基本数据类型
- Redis入门教程:特性及数据类型的操作
- 五,redis数据类型-无序set