美文网首页
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