目录
(2) 只追加文件(AOF,append-only file)持久化
1、支持的数据结构
-
字符串(string)
-
列表(list)
-
集合(set)
-
散列(hash,可以看成一个map或者数据库里的一行数据)
-
有序集合(和散列类似,存放键值对,但是值只能是浮点型,且按照值排序)
2、常见应用场景
登录和cookie缓存、购物车、浏览记录、网页缓存(不用每次都请求数据、动态生成)、数据行缓存(MySQL中的一条数据)、网页分析。
3、持久化方式
(1) 快照持久化
全部数据写入数据库中;当redis、系统或者硬件出问题时,会丢失最近一次创建完照之后的所有数据。
(2) 只追加文件(AOF,append-only file)持久化
将写命令(AOF文件)加载到硬盘中,通过执行AOF中的写命令,持久化数据;AOF文件可能会比较大,导致持久化过程缓慢甚至阻塞。
4、复制
主从服务器复制、主从链、更换故障主服务器。
5、事务
使用MULTI 和 EXEC。
6、优化
使用流水线(pipeline)。
7、过期删除
(1) 立即删除
在设置键的过期时间时,创建一个回调事件,当过期时间达到时,由时间处理器自动执行键的删除操作。立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。但是立即删除对cpu是最不友好的。因为删除操作会占用cpu的时间,如果刚好碰上了cpu很忙的时候,比如正在做交集或排序等计算的时候,就会给cpu造成额外的压力。而且目前redis事件处理器对时间事件的处理方式--无序链表,查找一个key的时间复杂度为O(n),所以并不适合用来处理大量的时间事件。
(2) 惰性删除(被动删除)
键过期了就过期了,不管。每次从dict字典中按key取值时,先检查此key是否已经过期,如果过期了就删除它,并返回nil,如果没过期,就返回键值。惰性删除是指,某个键值过期后,此键值不会马上被删除,而是等到下次被使用的时候,才会被检查到过期,此时才能得到删除。所以惰性删除的缺点很明显:浪费内存。dict字典和expires字典都要保存这个键值的信息。举个例子,对于一些按时间点来更新的数据,比如log日志,过期后在很长的一段时间内可能都得不到访问,这样在这段时间内就要拜拜浪费这么多内存来存log。这对于性能非常依赖于内存大小的redis来说,是比较致命的。
(3) 定时删除(主动删除)
每隔一段时间,对expires字典进行检查,删除里面的过期键。从上面分析来看,立即删除会短时间内占用大量cpu,惰性删除会在一段时间内浪费内存,所以定时删除是一个折中的办法。定时删除是:每隔一段时间执行一次删除操作,并通过限制删除操作执行的时长和频率,来减少删除操作对cpu的影响。另一方面定时删除也有效的减少了因惰性删除带来的内存浪费。
可以看到,第二种为被动删除,第一种和第三种为主动删除,且第一种实时性更高。redis使用的过期键值删除策略是:惰性删除加上定期删除,两者配合使用。
详细redis如何设置过期时间、如何保存过期时间等见https://www.jianshu.com/p/9352d20fb2e0。