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没有被其他客户端修改过,才执行事务,否则不执行(类似乐观锁)

  • 相关阅读:
    wex5 实战 框架拓展之2 事件派发与data刷新
    wex5 实战 框架拓展之1 公共data组件(Data)
    wex5 实战 HeidiSQL 导入Excel数据
    wex5 实战 手指触屏插件 hammer的集成与优劣
    wex5 实战 登陆帐号更换与用户id一致性
    wex5 实战 用户点评与提交设计技巧
    wex5 实战 省市县三级联动与地址薄同步
    wex5 实战 wex5与js的组件关系与执行顺序(父子与先后)
    wex5 实战 单页模式下的多页面数据同步
    [BZOJ]4237: 稻草人
  • 原文地址:https://www.cnblogs.com/testzcy/p/11262006.html
Copyright © 2011-2022 走看看