一、Redis数据结构
dict:键值对的存储空间
expires:存储某个键的过期时间,值为long long类型的绝对过期时间。
二、过期键删除策略
1.定时删除
策略:Redis设置过期时间时,同时设置一个定时器,到时间删除键。
优点:可以即时删除键值,对内存比较友好。
缺点:存在大量的定时器,对CPU行能不友好
2.惰性删除
策略:对过期的键不去处理,在下一次使用键的时候判断是否过期,若过期则删除。
优点:对CPU性能友好,不需要不断去检索过期时间。
缺点:对内存不友好,存在大量过期键,并有可能键长时间不使用产生过多无效内存。
3.定期删除
策略:规定一个时间,对所有设置了过期时间的键扫描一次,将过期的键删除。时间可以是一小时,一天,一周等等。
优点:折中方式,具备以上两种策略的所有优点。
缺点:折中方式,具备以上两种策略的所有缺点。
三、Redis使用的策略
1.惰性删除
策略:操作key时,检测key过期时间,如过期则删除。
各类操作下的实现:
RDB持久化(持久化数据到磁盘文件):在生成RDB或恢复RDB时,检测Key的过期时间,如果过期则不生成或不恢复。
AOF持久化(持久化Redis操作插入,更新和删除):在AOF写入,恢复时进行惰性删除,如果过期则不记录。
主从复制:主从复制时,主服务器每删除一个Key时会向从服务器发送一条DEL指令,从服务不会自己处理过期键,仅通过主服务发送的DEL键删除键。
2.定期删除
每次在部分数据库中随机选择一部分过期键进行删除,并不会一次删除所有的过期键,避免对大量占用CPU。
四、数据库通知
原理:Redis发布、订阅的一种使用方式,但订阅的是Redis数据库发起的事件。
命令:SUBSCRIBE keyspace@dbid:[key|event]
名词解释:
dbid:数据库实例ID
event:执行的相应命令, 如del, add等
key:订阅的key, 在对key操作时会发送通知