因为redis没有返回客户端目标数据库是哪个的命令,不建议使用多数据库
redis中每个数据库用redisDb结构表示。其中redisDb结构的dict字典保存了数据库中所有键值对。也就是键空间。
增删改查都是通过键空间字典进行操作实现的。
1 添加新键
将新的键值对添加到键空间字典里面
2 删除键
在键空间删除对应键值对对象
3 更新键
对键空间里面键所对应的值对象进行更新
4 取值
取出制定键的值对象
键的过期时间:
过期时间是一个UNIX时间戳
1 数据库如何保存键的生存时间和过期时间
在 redisDb结构的 expires字典中保存了数据库中所有键的过期时间,称之为过期字典。
过期字典的键是一个指针,指向键空间中指定键对象。
过期字典值是一个long类型的整数,保存了键所指向的数据库键的过期时间-->毫秒精度的UNIX时间戳
键空间中的键与过期字典中的键指向同一键对象,因此不会出现重复对象,节约内存空间。
过期键删除策略:
1 定时删除:创建定时任务,在该键过期时间到达时立即执行删除操作。
(对cpu不友好 将过多的cpu时间用于处理过期键而不是客户请求上 影响服务器的 1 响应速度 2 吞吐量
时间事件:通过无序链表进行实现,查找一个事件的时间复杂度O(N),不能高效处理大量时间事件
)
2 惰性删除: 键过期后也不主动处理,当有请求访问键空间的该键时,进行检查该键是否已过期。如过期则删除,返回无此键。
(惰性删除会存储大量已经过期的键,造成空间浪费)
3 定时删除: 根据一定策略,每隔一定时间,对数据库检查一次,删除一定的过期键。
(性能考虑,只清除部分过期键)
redis 采用2 惰性删除以及3 定时删除,两种方法相结合进行过期键删除。