文章目录
目录
前言
主要学习了redis的数据库实现以及过期键处理策略和数据库通知功能。
一、redis服务器如何存储数据库/客户怎么切换数据库
- redisServer保存一个db数组,指向redis的所有数据库,默认数据库个数为16
- redisClient的db指针指向当前操作的数据库,即指向server的db数组中的某一个,通过select index可以改变db指针指向,实现切换数据库功能
二、数据库键空间--dict字典
- 定义
- 数据库通过字典存储键值对,这个字典dict被称为键空间
- 对数据库操作---对键空间的操作---对dict字典的操作
- 添加新键:SET key string、LPUSH key ”a“ ”b“ “b”、SADD key “a” “b”、ZSADD key “a” 10 “b” 8、HSET key k1 v1 k2 v2
- 删除键:DEL
- 更新键:像插入新键一样,只不过key已经存在了,redis会用新value覆盖旧value
- 取值:GET、LRANGE
- FLUSHDB删除某个数据库,FLUSHALL删除所有数据库
- DBSIZE计算数据库里所有键值对数量
- 对键空间的维护
- 过期键删除
- 数据库通知功能可以在键修改后,通知相应数据库
- 更新LRU最后一次使用时间
- 被WATCH的键修改会被设置为dirty
- 修改一个键,会让脏键计数器+1
三、数据库过期键---expires字典
- 过期字典expires保存过期时间
- 过期字典key:指向一个设置了过期时间的键值对
- 过期字典value:保存过期时间值
- 过期时间的操作---对expires字典的操作
- EXPIRE设置过期时间
- EXPIRE key time设置key对应值的过期时间
- 调用EXPIRE命令就是在expire字典里新建了key对应的k-v
- PERSIST移除过期时间
- PERSIST key删除过期时间,就是移除过期字典expire里key对应的k-v
- TTL返回过期时间
- TTL key / PTTL key通过key去expire字典里取得过期时间,和当前UNIX时间戳进行计算,得到还有多久存活时间
- EXPIRE设置过期时间
- 过期键删除策略
- 定时删除
- 为每一个键值对设置一个定时器,定时器时间到就删除该过期键
- 对内存友好,可以及时释放内存
- 对CPU不友好,需要维持很大数量的定时器,且如果过期键太多,CPU要花费很多时间去删除过期键
- Redis使用懒惰删除和定期删除
- 懒惰删除
- 取出键时,对键进行过期检查
- 对内存不友好,已经过期的键只有被使用时才会被发现并删除
- 对CPU友好,无需设置定时器,且只对当前处理的过期键删除,不管其他过期键
- 定期删除
- 每隔一段时间执行一次过期删除策略,只随机扫描一部分键,然后删除其中的过期键
- 对定时删除和懒惰删除的综合,即能够及时释放内存,又能使CPU不会因为删除过期键消耗太多性能
- 懒惰删除
- 定时删除
- 持久化 / 主从复制功能过期键处理
- RDB
- 生成RDB文件:只会将未过期键值对写入RDB文件,已过期键不写
- 载入RDB文件
- 主服务器模式:只会载入未过期键值对,已过期键值对不载入
- 从服务器模式:不论是否过期,一起载入
- AOF
- 过期键没有被删除对AOF文件无影响,过期键被删除时会在AOF文件内追加一条DEL命令
- AOF重写:只会重写未过期键,已过期键不写
- 服务器运行在主从复制模式
- 过期键的删除动作统一由主服务器控制,保证主从服务器数据的一致性
- 举例说明
- 向从服务器请求一个过期键可以得到这个值,且该过期键不会被删除
- 向主服务器请求一个过期键无法得到这个值,主服务器内该过期键会被删除,同时主服务器会显示的要求从服务器去删除该过期键
- RDB
四、数据库通知功能的实现
- Redis命令对数据库进行修改时,服务器根据配置向客户端发送数据库通知
- 数据库通知分类
- 键空间通知---key-space notification
- 可以知道某个键执行了哪些操作
- 键事件通知---key-event notification
- 可以知道某个命令被那些键执行了
- 键空间通知---key-space notification