zoukankan      html  css  js  c++  java
  • redis读书笔记

    Redis 的通讯协议是文本协议,文本协议确实是会浪费流量,不过它的优点在于直观,非常的简单,解析性能极其的好,我们不需要一个特殊的 Redis 客户端仅靠 Telnet 或者是文本流就可以跟 Redis 进行通讯

    Redis 因为处理逻辑在前而记录操作日志在后,也是导致 Redis 无法进行回滚的一个原因。

    对 Redis 进行恢复时,RDB 快照直接读取磁盘即可恢复,而 AOF 需要对所有的操作指令进行重放进行恢复,这个过程有可能非常漫长。

    1 一个集合最多可以存储232-1个元素

    smemberslrangehgetall都属于比较重的命令, 如果元素过多存在阻Redis的可能性, 这时候可以使用sscan来完成
    3 分布式集群共享的数据可以放到redis中

    4 redis的nx 可以当作锁来用,一个客户端对一个key赋值后,另一个就会赋值失败

    对于字符串类型键, 执行set命令会去掉过期时间, 这个问题很容易在开发中被忽视 

    Redis不支持二级数据结构(例如哈希、 列表) 内部元素的过期功能, 例如不能对列表类型的一个元素做过期时间设置
    setex命令作为set+expire的组合, 不但是原子执行, 同时减少了一次网络通讯的时间
    除所有以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_connectionsRedis自启动以来拒绝的客户端连接数, 需要重点监控
    total_connections_receivedRedis自启动以来处理的客户端连接数总数
    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没有被其他客户端修改过,才执行事务,否则不执行(类似乐观锁)

  • 相关阅读:
    python练习册 0002随机生成验证
    女生应该找什么样的男生
    博弈论 尼姆博弈,人生第一道博弈纪念一下
    博弈论版版
    博弈论
    STL用法大全
    据说是Flord算法
    20190716-T3-奇袭
    20190716-T1-礼物
    20190716-被水题淹没
  • 原文地址:https://www.cnblogs.com/testzcy/p/11262006.html
Copyright © 2011-2022 走看看