Redis常用理论

原创
2021/01/11 17:20
阅读数 652

Redis

数据结构

string

  • 二进制安全,可以存储任何数据

    • Sesion
    • 访问次数-incr
    • 长期存在,修改并不频繁
    • 限制IP次数

hash

  • 适合对象存储

    • 购物车,id field,value

list

  • 链表数据结构

    • lrange可以进行分页
    • 消息队列的简单应用

set

  • hastTab的一种实现,无序不重复

    • 唯一性统计,例如共同好友等

zset

  • set增加一个权重,有序不重复

    • 排行榜

持久化

RBD

  • 生成快照的方式进行存储

    • 优点

      • 文件紧凑,方便存储
      • 性能优,在保存文件时fork子进程进行处理
    • 缺点

      • 对数据完整度较高不适用
      • 在数据集非常庞大时,fork可能会比较耗时

AOF

  • 记录每次写指令

    • 优点

      • fsync策略可以自己设置,数据完整度保存较好
      • 对AOF文件写入不需要seek,同时只要aof文件存在,重写都可以还原。
      • AOF文件过大,可以自动在后台对aof文件重写
    • 缺点

      • AOF文件通常大于Rdb
      • 性能相对较差
      • 恢复速度相对较慢

增量和全量

  • sync/psync

集群

主从

  • 优点

    • 避免Redis单点故障
    • 构建读写分离架构,满足读多写少的应用场景
  • 缺点

    • 数据一致性,复制数据的效率
    • 容错/恢复,维护过程需要人为
    • master 单点性能瓶颈

哨兵

  • 优点

    • 主从的升级版,提供了可用性和性能,能自动进行故障恢复
    • 哨兵的存在可以及时发现系统问题
  • 缺点

    • 增加了系统复杂度,需要同时维护哨兵
    • master节点故障的恢复时间长
    • master单节点写瓶颈

cluster

  • 优点

    • 无中心,数据分片
    • 动态扩展能力
  • 缺点

    • 数据一致性
    • slave的使用,没有释放master的读压力

缓存问题

缓存穿透

  • 用户的请求的数据没命中缓存同时DB也不存在,每次返回nil

    • 设置AUTH拦截
    • 设置Jey-nil每次返回空拦截
    • 布隆过滤器

缓存击穿

  • 用户请求的数据没有命中缓存,每次在DB中查询

    • 热点数据的过期时间管理
    • 设置锁机制,第一次读取DB后,存储在缓存。其他人等待读取缓存

缓存雪崩

  • 同一时期,大批数据到过期时间,查询数据巨大,从而导致DB压力过大甚至宕机

    • 数据设置随机过期时间
    • 将热点数据分布在不同物理机
    • 互斥锁,类似穿透
    • 双层缓存机制

缓存预热

  • 系统上线后,将相关的缓存数据直接加载到缓存系统,这样就可以避免在用户请求的时候

内存淘汰机制

noeviction

  • 默认机制,写操作直接报错,不进行淘汰

allkeys-lru

  • 最近最少使用,从所有的KEY中进行LRU算法淘汰

    • Redis中LRU类似随机,应随便选取5个KEY,从里面淘汰掉最近最少使用的key

      • 可以通过设置maxmemory-samples调整取样数量
      • Redis实现LRU设置了一个24bit的字段来存储最后一次访问KEY的时间
      • Redis3.0进行优化,池中的数据根据访问时间进行排序,第一次随机选取的key都会放入池中,随后每次随机选取的key只有在访问时间小于池中最小的时间才会放入池中,直到候选池被放满。当放满后,如果有新的key需要放入,则将池中最后访问时间最大(最近被访问)的移除

volatile-lru

  • 从设置了过期时间的EKY进行LRU算法淘汰

allkeys-random

  • 随机淘汰,从所有KEY随机淘汰

volatile-random

  • 随机淘汰,从设置了过期时间的KEY随机淘汰

volatile-ttl

  • 生存周期,根据过期时间淘汰,越早过期的越早淘汰。

allkeys-lfu

  • 最少使用频率,从所有KEY中进行LFU算法淘汰

    • Redis4.0新加的一种淘汰机制。

volatile-lfu

  • 最少使用频率,从设置了过期时间的KEY中进行LFU算法淘汰

事务

redis支持事务

  • multi
    • 开启一个事务,每条指令都有server缓冲,保持原子性,谁出错谁负责原理。不支持回滚
  • pipeline
    • 开启一个通道,利用client缓冲,没有原子性
展开阅读全文
加载中

作者的其它热门文章

打赏
0
1 收藏
分享
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部