数据类型
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)发送给从服务器,并在发送期间使用缓冲区记录执行的写命令。快照文件发送完再向从服务器发送存储在缓冲区的写命令
- 从服务器丢弃所有旧数据,载入快照文件,接收主服务器发来的写命令
- 主服务器每执行一次写命令,就向所有从服务器发送相同的写命令
主从链
- 从服务器比较多的时候,为了不影响主服务器的性能,可以设置中间层来分担主服务器的复制工作
网友评论