redis读书笔记
Redis 的通讯协议是文本协议,文本协议确实是会浪费流量,不过它的优点在于直观,非常的简单,解析性能极其的好,我们不需要一个特殊的 Redis 客户端仅靠 Telnet 或者是文本流就可以跟 Redis 进行通讯
Redis 因为处理逻辑在前而记录操作日志在后,也是导致 Redis 无法进行回滚的一个原因。
对 Redis 进行恢复时,RDB 快照直接读取磁盘即可恢复,而 AOF 需要对所有的操作指令进行重放进行恢复,这个过程有可能非常漫长。
1 一个集合最多可以存储232-1个元素
2 smembers和lrange、 hgetall都属于比较重的命令, 如果元素过多存在阻塞Redis的可能性, 这时候可以使用sscan来完成
3 分布式集群共享的数据可以放到redis中
4 redis的nx 可以当作锁来用,一个客户端对一个key赋值后,另一个就会赋值失败
5
6 对于字符串类型键, 执行set命令会去掉过期时间, 这个问题很容易在开发中被忽视
7 Redis不支持二级数据结构(例如哈希、 列表) 内部元素的过期功能, 例如不能对列表类型的一个元素做过期时间设置
8 setex命令作为set+expire的组合, 不但是原子执行, 同时减少了一次网络通讯的时间
9 除所有以video字符串开头的键 :redis-cli keys video* | xargs redis-cli del
10 由于Redis的单线程架构, 所以需要每个命令能被快速执行完, 否则会存在阻塞Redis的可能
11persist命令可以删除任意类型键的过期时间, 但是set命令也会删除字符串类型键的过期时间
12 查看活跃的频道 pubsub channels ,所谓活跃的频道是指当前频道至少有一个订阅者
13 查看频道订阅数 pubsub numsub [channel ...]
14 client list中qbuf和qbuf-free分别代表这个缓冲区的总容量和剩余容量,每个客户端缓冲区的大小不能超过1G, 超过后客户端将被关闭
15 输入缓冲区过大主要是因为Redis的处理速度跟不上输入缓冲区的输入速度, 并且每次进入输入缓冲区的命令包含了大量
bigkey, 从而造成了输入缓冲区过大的情况。 还有一种情况就是Redis发生了阻塞, 短期内不能处理命令
16
client list中如果fd=-1代表当前客户端不是外部客户端, 而是Redis内部的伪装客户端。
client list中qbuf和qbuf-free分别代表这个缓冲区的总容量和剩余容量,
client list中的obl代表固定缓冲区的长度, oll代表动态缓冲区列表的长度, omem代表使用的字节数
client list中的age和idle分别代表当前客户端已经连接的时间和最近一次的空闲时间。当age等于idle时,说明连接一直处于空闲状态
client list中的flag是用于标识当前客户端的类型,
17 Redis提供了maxclients参数来限制最大客户端连接数,默认值是10000, 可以通过info clients来查询当前Redis的连接数:
18 monitor命令能够监听其他客户端正在执行的命令, 并记录了详细的时间戳
19
20 info stats中还包含了两个客户端相关的统计指标
rejected_connections: Redis自启动以来拒绝的客户端连接数, 需要重点监控
total_connections_received: Redis自启动以来处理的客户端连接数总数
21 杀掉异常客户端 client kill ip:port
22 专业的Redis运维工具:CacheCloud
23 用完之后,记得关闭客户端
24
RDB持久化是把当前进程数据生成快照保存到硬盘的过程
执行bgsave命令, Redis父进程判断当前是否存在正在执行的子进程, 如RDB/AOF子进程, 如果存在bgsave命令直接返回
Redis加载RDB恢复数据远远快于AOF的方式
RDB方式数据没办法做到实时持久化/秒级持久化。
AOF的主要作用是解决了数据持久化的实时性, 目前已经是Redis持久化的主流方式
redis重启后,优先加载AOF文件
slaveof配置都是在从节点发起
可以使用info replication命令查看复制相关状态
25
若主节点之前没有开启持久化功能自动重启后数据集为空, 这时从节点如果继续复制主节点会导致从节点数据也被清空的情况, 安全的做法是在从节点上执行
slaveof no one断开与主节点的复制关系, 再重启主节点
26 数据延迟
对于无法容忍大量延迟场景, 可以编写外部监控程序监听主从节点的复制偏移量, 当延迟较大时触发报警或者通知客户端避免读取延迟过高的从节点
27 作者的建议:一个redis够用就用一个,一个不够就用redis cluster,若还不行再用主从
Redis本身的性能非常高, 开发人员在使用额外的从节点提升读性能之前, 尽量在主节点上做充分优化,当主节点优
化空间不大时再考虑扩展。 笔者建议大家在做读写分离之前, 可以考虑使用Redis Cluster等分布式解决方案
28
低一致性业务建议配置最大内存和淘汰策略的方式使用
高一致性业务可以结合使用超时剔除和主动更新, 这样即使主动更新出了问题, 也能保证数据过期时间后删除脏数据
29
30 缓存优化
1)存储空置,并设置 较短的超时时间 2)布隆过滤器拦截
31 “无底洞”就是说投入越多不一定产出越多。
32 雪崩指的是缓存层宕掉后, 流量会像奔逃的野牛一样, 打向后端存储
要尽量使缓存高可用,避免雪崩;
出现雪崩后,为后端限流并降级 。比如推荐服务中, 如果个性化推荐服务不可用, 可以降级补充热点数据, 不至于造成前端页面是开天窗
33 redis单实例多数据库的弊端:因为redis是单线程的数据库,一旦一个数据库卡住,其他数据库也就卡住了
=============
latency有三个选项, 分别是--latency、 --latency-history、 --latency-dist。它们都可以检测网络延迟
原生批量命令是原子的, Pipeline是非原子的
原生批量命令是一个命令对应多个key, Pipeline支持多个命令
Redis提供了简单的事务功能, 将一组需要一起执行的命令放到multi和exec两个命令之间。 multi命令代表事务开始, exec命令代表事务结束
对用语法错误,事务不会执行;对于运行时错误(如sadd写成了zadd),会有部分命令被执行,开发人员需要自己修复这类问题
watch确保事务中的key没有被其他客户端修改过,才执行事务,否则不执行(类似乐观锁)