1.单线程:Redis是单线程来处理命令的,所以一条命令从客户端到达服务器不会立刻被执行,所有命令都会进入一个队列中,然后逐个执行。

2.Redis使用I/O多路复用技术来解决I/O的问题。

3.性能:纯内存访问、非阻塞IO,Redis使用epoll作为I/O多路复用技术的实现。单线程避免了线程切换和竞态产生的消耗。

4.单线程的问题:对于每个命令的执行时间是有要求的。如果某个命令执行过长,会造成其他命令的阻塞。致命的!

5.setnx可以作为分布式锁的一种实现方案。http://redis.io/topics/distlock

6.批量操作解决网络性能的瓶颈,Redis支持每秒数万的读写操作,网络可能会成为性能的瓶颈。

7.Redis支持简单的事务,multi开始 exec执行 discard舍弃。Redis不支持回滚功能,事务中可能第一条执行成功,第二条执行失败,第一条也会生效。

8.watch命令,确保事务中的key没有被其他客户端修改过,才执行事务,否则不执行(类似乐观锁)。

9.线上环境:redis-cli 超时的检测,timeout设置为大于0,客户端做空闲检测,jedis-pool的common-pool。

10.client pause 命令应用:让主、从保持一致。可控的将客户端连接从一个节点切换到另一个节点。线上暂停成本非常高。

11.rename-command命令重命名指令。

12.fork操作跟内存量成正比,线上建议单个Redis实例内存控制在10GB以内。

13.Redis是CPU密集型服务,不要和其他CPU密集型服务部署在一起。

14.主从:写高并发时,可以开启从的AOF,关闭主的持久化,要注意主库自动重启后没有数据,避免从库同步清空,血崩。

15.主从:读高并发时,可以让客户端从从库读取。

16.主从:写并发高的主库不适宜有多个从库。可以使用树状结构。

17.Redis执行fork操作产生的子进程,使用写时复制技术(copy-on-write),减少内存的占用。

18.尽量减少字符串频繁修改操作如append、setrange,改为直接使用set修改字符串,降低预分配带来的内存浪费和内存碎片化。

19.控制数据类型的编码来实现时间和空间的平衡。

20.键值对很多时,可以分组映射到多个hash结构中,来降低键的数量。如100W个键分组映射到1000个hash中,每个1000个field、value。

21.集群故障转移时不影响其他主节点,配置cluster-require-full-coverage no。