Redis笔记
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。