一、Redis简介
1. 概念:
Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。
2. 特征:
** ①**数据间没有必然的关联关系;
②内部采用单线程机制进行工作;
③高性能,官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s;
④多数据类型支持
字符串类型 string
列表类型 list
散列类型 hash
集合类型 set
有序集合类型 sorted_set
⑤持久化支持。可以进行数据灾难恢复
二、Redis删除策略
1. 什么是过期数据?
Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态。
XX :具有时效性的数据,通过下列命令来定义:
&&
setex key seconds value
&&
expire key seconds
&&
expireat key timestamp
&&
pexpire key milliseconds
&&
pexpireat key milliseconds-timestamp
- -1 :永久有效的数据
- -2 :已经过期的数据或被删除的数据或未定义的数据
过期的数据是否真的被删除了?
当 redis 需要处理某条数据的时候,发送一条指令给 CPU,CPU 轻轻松松就可以搞定,相对来说不会占用太多时间,但是如果有多个 redis 同时发送了非常多的增删查改指令过来,那 CPU 压力就会变得非常大,造成性能下降,所有操作都在排队等着 CPU 空闲处理指令。
那么,我们在这里能不能做一个优化,查数据,加数据,改数据这部分还是得正常进来处理,但是过期数据貌似就不是一个很着急的事情了。如果内存空间也不是很紧张,没达到阈值,那可以先放在内存里,等有空的时间再删掉。也就是说,当这些数据过期以后,实际上还是先放在内存里等到要删的时候再去删它。而具体怎么删,Redis 会提供相应的删除策略。
2. Redis提供的删除策略
Redis 提供了三种删除策略:a
. 定时删除
| b
. 惰性删除
| c
. 定期删除
定时删除
①含义:当
key
设置过期时间的时候,创建一个定时器事件,当
key
过期时间到达时,由定时器任务立即执行对
key
的删除操作,删除操作先删除存储空间的,再移除掉
expire
的
key
②优点:节约内存,到时就删除,快速释放掉不必要的内存占用
③缺点:
CPU
压力大,无论
CPU
此时负载量多高,都会去占用
CPU
进行
key
的删除操作,会影响
Redis
服务器响应时间和吞吐量,是一种比较低效的方式
④总结:用
CPU
性能换取内存空间,时间换空间
惰性删除
①含义:数据到达超时时间的,不立即处理,等下次访问该数据的时候,再去删除(操作会执行
expireIfNeeded()
函数去检查)
②优点:不占用
CPU
节约
CPU
性能,只在获取访问
key
的时候才判断是否过期,过期则删除,只会删除当前获取的这一个
key
,其他的
key
还是保持原样
③缺点:内存占用大,如果一直没有获取它,那么数据就会长期占用内存空间,当有大量的
key
没有被使用到,也造成了大量内存浪费,对内存数据库来说,也不太友好
④总结:空间换时间
定期删除
前面说的两种方案
1.时间换空间
,
2.空间换时间
都是两个极端方法,为避免前面方案带来的问题,Redis 引入了定期删除策略(
是他们的一个比较折中的方案
)
①含义:周期性轮询
Redis
库中的时效性数据,采取随机抽取的策略,利用过期数据占比的方式控制删除频度。
②优点:a.CPU性能占用设置有峰值,检测频度可自定义设置;b.内存压力不是很大,长期占用内存的冷数据会被持续清理.
③总结:CPU 性能占用设置有峰值,检测频度可自定义设置,内存压力不是很大,长期占用内存的冷数据会被持续清理(周期性随机抽查,重点抽查)
删除策略对比
- 定时删除(时间换空间) - 节约内存无占用- 不分时段占用 CPU 资源,频度高
- 惰性删除(空间换时间) - 内存占用高- 延迟执行,不会一直占用CPU资源,CPU 压力小,频度低
- 定期删除(周期性随机抽查) - 内存定期随机清理- 每秒花费固定 CPU 资源维护内存(清除过期数据)
版权归原作者 崇令 所有, 如有侵权,请联系我们删除。