持久化级别 redis提供如下四中持久化方案:
完全不持久化,纯内存操作。比如做缓存服务器时。
RDB持久化,配置时间间隔,异步持久化。默认的持久化方案。
AOF持久化,所有操作都是记录到日志文件,保证所有数据都被记录。 在redis重启时,会使用AOF重建数据集。
结合使用RDB和AOF的持久化方案.重启时会使用AOF重建。
RDB优缺点 优点:
结构紧凑的文件,相当与系统的实时快照,很适合做数据库备份和灾难恢复。
性能优秀,服务线程不需要处理i/o.
大数据集上重启很快。不需要重建
缺点:
间隔性同步到磁盘,导致有可能会丢失部分数据。
fork有可能堵塞导致暂不可用.
AOF优缺点 优点:
更加稳定,可以设置为 不同步/每秒同步/完全同步.
redis可以rewrite过大的AOF log.
保存了所有操作,可以从误操作中回复数据库。
缺点:
所需的文件通常比RDB更大
查询性能相对比RDB更差。
有很稀有的bug存在,RDB没有此类bug.
如何使用 如果想要更强的数据一致性,则应该组合使用AOF和RDB
如果可以容忍少量的数据丢失,可以只使用RDB.
不推荐只是AOF.
介绍一些redis部署时的注意事项
注意事项 建议使用linux部署。
sysctl vm.overcommit_memory=1 或者 vm.overcommit_memory = 1 (/etc/sysctl.conf)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
设置一个和内存一样大或更大的swap分区,不然redis有可能在内存不足时被系统杀死。
设置一个明确的maxmemory. 这样redis会在内存到限后抛出错误,而不会falling.
在写比较重的场景下需要有大约2倍于normal的内存。这些是来在内存中保留那些需要被写回磁盘的数据.
配置supervisor类工具时,设置 daemonize no
开启slave特性时,即便不使用持久化特性,redis也会perform RDB save. 除非使用实验性的diskless-sync.
开启slave特性时,要确保要么打开master节点的保存特性,要么关闭master节点的自动重启。
注意开发redis安全相关配置. require-pass/rewrite-command/bind-ip
aws注意事项 使用HWS实例,不要使用pv实例
不要使用太老的实例。 m3 good than m1
redis在EBS的持久话需要注意,EBS可能会太慢。
你可能想尝试diskless-sync. 如果replication-sync有问题的话。
redis升级或重启建议 TODO
概述 redis并不是单纯的缓存服务器,而是被设计为一个数据结构服务器。为服务提供有用高效的数据类型.
redis中主要包含如下数据类型:
字符串,二进制安全。 列表list, 链表实现。不是array. 集合set, 值不可重复. 排序集合ordered-set. 同时存储一个value和一个score. score用于排序. 字典hash, 类似python的字典和ruby的hash,但是field-key/field-value只能是字符串. bit-array或bitmaps. HyperLogLogs, 概率行数据结构. TODO 不同数据结构可以根据需要解决不同的任务集。
类型具体说明 redis-key redis-key只能是字符串,并且是2进制安全。
空字符串也能做为key. 太长的key不被推荐,compare性能不好. 太短的key不好,可读性不好 u1000flw => user:1000:followers 对键做良好的管理,引入命名空间和键前缀等概念. user:1000, comment:1234.replys 最大长度512MB, 不会成为限制。 exists判断key是否存在, del用于删除key, keys用于列出keys.type获取key类型. ttl/expire用于获取和设置过期时间. persist移除key的过期设置。pttl/pexpire返回/设置millsecond级别的过期时间. redis-string 最简单的数据结构,应该也是最常用的数据结构(缓存).
通过get/set设置和换取
set在没有key时会创建key,在key存在时做update.同时可以制定second/millsecond级别的过期时间.
可以支持incr/incrby/decr/decrby,把字符串作为数字执行原子性的+/-.底层使用的是同一个命令。
getset获取key的old-value, 同时设置为最新的value.
mset/mget一次对多个key做操作.
redis-list 列表, 链表实现, 在列表中间插入/移除元素的复杂度为O(1), 查找元素的复杂度为O(N).
大多数操作都支持左右两个方向, lpush/rpush. l->list前缀/r->reverse-order
两个方向的push/pop可以作为队列/栈使用. lrange用于获取列表内容.常用的场景:
Jan 8, 2016
1 min read