Redis数据库存储和过期键实现原理
2014-10-31 20:36
204 查看
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和内存之间找到一个平衡点。
相关文章推荐
- Redis数据库存储和过期键实现原理
- Redis过期策略 实现原理
- Redis过期策略 实现原理
- Redis过期策略 实现原理
- Redis数据库的实现原理
- Redis过期策略 实现原理
- Redis过期策略 实现原理
- [转]datastage 图像数据的数据库存储实现
- 利用JSP的实现图片的数据库存储和显示
- 本文是笔者根据数据库编程经验,利用C++语言的模板、继承、授权、多态等面向对象特性,借鉴命令模式,实现了对象在关系数据中的存储,降低应用系统与数据库之间的耦合,提高开发效率。
- Redis(超高性能数据库)持久化Key-Value数据存储
- 调用存储过程,java中通过bboss persistent实现数据库存储过程的调用(位置变量绑定)
- [原创]从IO看数据库底层实现原理
- 用C#实现图片数据库存储与显示
- MySQL存储过程和触发器的实现--数据库学习笔记
- lotusscript通过ODBC实现与关系型数据库SQL的数据存储
- 存储过程调用,java中通过bboss persistent实现数据库存储过程的调用(命名变量绑定)
- 组长帮忙实现了基类传参无存储过程能多用的数据库操作
- C#实现将一个类序列化存储在数据库中
- 用C#实现图片数据库存储与显示