您的位置:首页 > 数据库 > Redis

Redis数据库存储和过期键实现原理

2017-09-14 15:11 351 查看

redis数据库

切换数据库


Redis是一个键值对数据库,读写效率很高,又有过期机制,所以经常被用来做缓存。很多人不知道,其实Redis和mysql一样,也是分数据库的,只不过我们一般使用的都是默认数据库而已。redis默认有16个数据库,编号分别为0,1,2...15,可以在redis客户端使用select命令切换数据库。

如图所示:

       


执行了“select 1”命令之后成功切换到了1号数据库,在提示符的后面的方括号中显示了当前数据库的编号,使用默认的0号数据库时没有这个提示。

数据库作用

redis分数据库的作用是隔离命名空间,在某一个数据库插入的数据在其他数据库是访问不到的:
        


redis数据保存方式

redis是键值对数据库,所以数据的保存方式也是按键值对保存的。redis底层使用哈希表保存数据,哈希表就像java中的map结构一样,他们的键都是一个字符串,键的值可以是很多类型的数据,比如字符串,列表,集合,有序集合等等。后续的数据的增删改查操作都是在这个哈希表上操作。

redis过期机制

redis支持键过期机制,也就是可以为一个键定义个一个过期时间,当到这个时间点时,这个键自动失效。设置一个键过期时间可以使用exipre命令:
     

 

     上图的第一条命令设置一个键值对,x的值为5,第二条命令为键x设置过期时间为5秒,第三条命令是在第二条命令执行之后的5秒内执行的,所以此时x还未过期,能够得到x的值5,5秒之后再获取x的值,已经过期,得到nil值。

     过期机制实现

     redis会跟存数键值一样生成一个哈希表,专门存储键的过期时间,那么,redis是怎么删除已经过期的键值的呢?一般来说,删除一个过期键有三种方式:
1. 定期删除:设置键过期时间的同时设置一个定时器,当时间到时定时删除键;
2. 定期删除:设置一个周期值,redis服务每隔一段时间执行一次过期检测,遍历一遍键值,将过期的键删除;
3. 惰性删除:将删除操作分摊到后续的操作中,每次增删改查数据库的时候都先检测一下键值是否已经过期,如果过期,先删除键值再执行常规后续操作。

这三种方式各有利弊:
1. 因为要为每一个键设置一个定时器,比较耗费CPU,但是因为键值一过期就立即删除,所以比较节省内存。
2. CPU和内存的消耗在三种方式中都处于居中水平。
3. 因为键值过期时候并不能够及时删除,并且如果有些键过期之后可能永远都不被访问,就导致这些垃圾数据常驻内存,成为另一种内存泄露,这种方式CPU耗费最小,内存消       耗最大。

redis过期机制中同时使用了第二种和第三种方法。在CPU和内存之间找到一个平衡点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: