Redis 数据库知识点整理
Redis 数据库整理
1. Redis服务器默认创建16个数据库
db 是一个数组,保存服务器中所有的数据库
dbnum 表示需要创建的数据库数量
2. 切换数据库
SELECT 2 //表示选择的数据库
这时,clientServer中的db就会指向db[2]
3. 数据库中值得保存——以键值对形式保存
Redis中,每个RedisDb结构中都有dict字典,这个字典保存数据库中的所有键值对。
4. 读写键空间时的维护操作
a. 服务器读取一个键后,会根据键是否存在更新服务器中的键空间命中次数(keyspace-hits)和键空间不命中次数(keyspace-misses)。
b. 服务器在更新一个键后会更新LRU(最后一次使用)时间,用来计算键的空闲时间。
c. 如果读取时发现一个键过期,就会删除这个键,在进行其他操作。
d. 如果客户端使用WATCH见识某个键,在该键修改后会被标记为dirty。
e. 服务器每次修改一个键后都会对脏键计数器加1,用于持久化和复制操作。
f. 如果服务器开启数据库通知功能,那么对键修改后会进行相应的数据库通知。
5. 键的生存时间和过期时间
5.1 设置生存时间命令:
EXPIRE KEY 5 //设置键key的生存时间为5s
PEXPIRE KEY 5 //设置键key的生存时间为5ms
SETEX key 5 "aaa" //只针对字符串,设置键key的生存时间为5s
设置过期时间命令:过期时间是一个时间戳
EXPIREAT key 1377257300 //key到1377257300时,就会删除,时间戳以秒为单位
PEXPIREAT key 1377257300000 //key到1377257300000时,就会删除,时间戳以毫秒为单位
其他命令
TTL key //查询这个键的剩余生存时间
PTTL key //同上,但以毫秒为单位
5.2 过期时间的保存
redisdb结构中,维护一个expires字典用于保存过期时间,所以称为过期字典:
过期字典的键是一个指针,指向空间中某个键对象。
过期字典的值是一个龙long long类型的整数(以毫秒单位)
6.过期键的判定:
先判断键是否存在过期时间,如果有,获取过期时间;
判断当前时间时间戳是否大于过期时间,如果是,则认为过期。
7.过期键的删除策略
删除策略有三种:
删除策略 | 内容 | 优劣 |
---|---|---|
定时删除 | 在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作 | 过期键会被尽可能快的删除,但对CPU不友好 |
惰性删除 | 放任键的过期,在每次取键时进行判断是否过期,如果过期则删除该键,否则返回该键 | 对内存不友好,一些不太会用到的数据就不太能被删除掉,占用内存空间 |
定期删除 | 每隔一段时间,程序对数据库进行一次检查,删除里面的过期键 | 对删除执行的时长和频率需要判断 |
Redis结合惰性删除和定期删除
定期删除补充:
- 每次删除都是随机去除一定数量的键进行检查删除。
- 全局变量current_db会记录检查进度,并在下一次检查时,接着上一次的进度进行处理。
- 如果所有服务器都被检查了一遍,则current_db会重置为0,然后开始新的检查。