美文网首页
Redis基础概要

Redis基础概要

作者: HYIndex | 来源:发表于2021-03-16 22:24 被阅读0次

    数据类型

    STRING

    • 字符串、整数、浮点数

    LIST

    • 列表

    SET

    • 集合

    ZSET

    • 有序集合

    HASH

    • 哈希表

    数据结构

    字典

    • 链地址法解决冲突
    • rehash、渐进式rehash

    跳跃表

    • 基于有序链表建多级索引

    • 相比红黑树的优点

      • 实现起来更简单
      • 范围查找更快
      • 支持无锁操作

    使用场景

    计数器

    • string可以进行自增自减运算,适合频繁读写的计数器

    缓存

    查找表

    • 类似缓存,利用快速查找特性。DNS记录

    消息队列

    • List类型可以模拟消息队列

    会话缓存

    分布式锁

    • RedLock

      • 多个redis节点,申请锁,当超过N/2个节点能获得锁则认为可以获得锁
      • 互斥:任何时刻只能有一个client获取锁
      • 避免死锁
      • 只要大部分redis节点存活就可以正常提供服务
    • SETNX命令自行实现

    其他

    • Set可以实现交集、并集实现共同关注等功能
    • ZSet有序性实现排行榜

    事务

    MUTI、EXEC将多个命令包围

    不支持回滚,当一个命令出错会继续执行剩下的命令

    WATCH命令

    • 乐观锁,可以监控一个或多个键,一旦被监控的某个键被修改,之后的事务就不会执行

    具有ACID的一致性和隔离性,当appendfsync选项设置为always时也具有持久性

    流水线方式,减少通信次数

    事件

    文件事件

    • 基于Reactor模式开发了自己的网络事件处理器,使用I/O多路复用同时监听多个套接字,并将到达的事件传送给文件事件分派器,分派器会调用对应事件类型的事件处理器

    时间事件

    • 定时事件
    • 周期性事件

    集群方案

    哨兵模式

    • Sentinel

      • 集群监控:定期ping集群中的其他服务器和哨兵,检查是否在线
      • 消息通知:如果某个redis实例故障,哨兵负责发消息给管理员
      • 故障转移:如果主节点挂了,会在从节点中选举出新的主节点
      • 配置中心:发生故障转移后通知客户端新的master地址
    • 至少要3个哨兵,保证自身的健壮性

    Redis-Cluster

    • 一共分配16383个槽位(slot)

    • 方案说明

      • 通过哈希方式将数据分片,每个节点均分存储一定哈希槽区间的数据
      • 每份数据分片会存在多个互为主从的多节点上
      • 数据写入主节点,在同步从节点,同一分片的多个节点间的数据不保持一致性
      • 读取数据时如果key没有分配在该节点会返回转向指令,指向正确的节点
      • 每个redis需要额外开放一个加1w的端口来进行节点间通信(gossip协议)

    优点

    • 无中心架构,支持动态扩容,对业务透明
    • 具备Sentinel的监控和自动故障转移能力
    • 客户端不需要连接所有节点(会自动转向)
    • 高性能,客户端直连redis服务器,免去proxy代理的损耗

    缺点

    • 运维复杂,数据迁移需要人工干预
    • 不支持批量操作(pipeline)

    缓存异常

    缓存雪崩

    • 大面积缓存失效

    • 解决方案

      • 设置随机的过期时间
      • 并发不多的时候加锁排队

    缓存穿透

    • 缓存和DB都不存在的数据

    • 解决方案

      • 接口层拦截
      • 设置空缓存,过期时间要短
      • 布隆过滤器

    缓存击穿

    • 缓存中没有,但是并发用户很多

    • 解决方案

      • 设置热点数据永不过期

        • persist key
      • 加互斥锁

      • 缓存预热

      • 缓存降级

    对比Memcached

    Memcached

    • 仅支持字符串类型
    • 不支持持久化
    • 不支持分布式

    Redis

    • 读写性能优异,Read:11w/s、Write:8.1w/s
    • 支持RDB和AOF两种持久化方式
    • 支持事务,具有原子性
    • 数据结构丰富
    • 支持主从复制

    Redis缺点

    • 内存通常比较小且贵,不适用海量数据
    • 比较难支持在线扩容

    键的过期时间

    每个键设置过期时间,过期后会自动删除

    惰性删除

    定期删除

    定时删除

    数据淘汰策略

    当内存超出容量,会施行淘汰策略

    全局键空间选择性删除

    • noevication
    • allkeys-lru
    • allkeys-random

    设置过期时间的键空间选择性移除

    • volatile-lru
    • volatile-random
    • volatile-ttl

    持久化

    RDB(默认方式)

    • 数据快照

    • 优点

      • 只有一个dump.rdb文件,方便持久化
      • 容灾兴好,一个文件可以安全的保存到磁盘
      • 单独进程处理,不会影响主进程的IO操作
      • 数据集大时比AOF启动更快
    • 缺点

      • 定期执行持久化操作,故障会丢失数据

    AOF

    • 写命令追加到AOF文件

      • always:每个写命令都同步
      • everysec:每秒同步一次
      • no:让操作系统决定何时同步
    • 优点

      • 数据安全,always模式每进行一次写命令就记录到aof文件一次
      • append模式写文件,即使中途宕机可以redis-check-aof工具解决数据一致性问题
      • AOF重写机制,减少冗余命令
    • 缺点

      • 文件大,恢复速度慢

    复制

    命令

    slaveof ${host} ${port}

    连接过程

    • 主服务器创建快照文件(rdb)发送给从服务器,并在发送期间使用缓冲区记录执行的写命令。快照文件发送完再向从服务器发送存储在缓冲区的写命令
    • 从服务器丢弃所有旧数据,载入快照文件,接收主服务器发来的写命令
    • 主服务器每执行一次写命令,就向所有从服务器发送相同的写命令

    主从链

    • 从服务器比较多的时候,为了不影响主服务器的性能,可以设置中间层来分担主服务器的复制工作

    【参考文章】GitHub-CyC2018/CS-Notes

    相关文章

      网友评论

          本文标题:Redis基础概要

          本文链接:https://www.haomeiwen.com/subject/coaqcltx.html