redis
remote dictionary server 远程字典服务
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(trsansaction) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
String Hash List Set Sorted set Vector set Stream Bitmap Bitfield Geospatial JSON Probabilistic data types Time series
redis 协议
redis://:password@host:port 默认用户的话,需要省略 特殊符号需要编码
延时队列
使用sortedset, 时间戳做score, 消息内容作为key, 调用zadd来生产消息, 消费者使用zrangbyscore获取n秒之前的数据做轮询处理
ZADD 11 1 "1" 2 "2"
ZRANGE 11 0 -1 WITHSCORES
布隆过滤器
iredis
iredis -h xxx -p 6379 -a 'xxx' --rainbow --newbie --client_name 'test' --iredisrc '/dev/null' --prompt '{client_name} {client_addr} {host}:{port}[{db}]>'缓存击穿、缓存雪崩、缓存穿透
缓存穿透 查询不存在的key 访问缓存数据库都不存在的key 过滤 缓存预热
缓存雪崩 大量key过期、redis宕机、误删缓存数据 解决方案:多级缓存、限流 缓存预热
缓存击穿 查询缓存中失效的key 热点key过期瞬间大量请求数据库 缓存预热 互斥锁 (比如setnx),过滤器
缓存穿透是指查询不存在的数据,绕过缓存直接打到数据库,解决方案是用布隆过滤器或缓存空值。 缓存击穿是热点数据过期瞬间大量请求打到数据库,可以用互斥锁或逻辑过期解决。 缓存雪崩是大量缓存同时过期或 Redis 宕机,需要随机过期时间、多级缓存和熔断降级来防护。
twemproxy
redis代理
HyperLogLog
概率数据结构
核心思想是利用哈希函数的特性,对输入数据进行哈希转换后,观察哈希值中连续零的最长序列长度,以此来估计数据集中不同元素的数量
使用场景:
网站独立访客计数
多源数据的合并计数
PFADD key element [element …]
PFCOUNT key [key …]
PFMERGE destkey sourcekey [sourcekey …]部署方案
单机版
主从模式
哨兵模式
集群 3.0+ 默认16384个槽 最小配置6个节点以上(3主3从) 采用虚拟槽分区,所有的键根据哈希函数映射到0~16383个整数槽内,每个节点负责维护一部分槽以及槽所映射的键值数据淘汰策略
volatile-lru:LRU(Least Recently Used),最近使用。利用LRU算法移除设置了过期时间的key
allkeys-lru:当内存不足以容纳新写入数据时,从数据集中移除最近最少使用的key
volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
allkeys-random:从数据集中任意选择数据淘汰
no-eviction:禁止删除数据,当内存不足以容纳新写入数据时,新写入操作会报错
volatile-lfu:LFU,Least Frequently Used,最少使用,从已设置过期时间的数据集中挑选最不经常使用的数据淘汰。
allkeys-lfu:当内存不足以容纳新写入数据时,从数据集中移除最不经常使用的key。底层原理
String底层是简单动态字符串(SDS)
万金油类型,用于缓存、计数器、分布式锁,支持数值增减(INCR/DECR)。
Hash-底层是哈希表 + 压缩列表
适合存储对象。
小Hash用压缩列表节省内存。大Hash用哈希表 快速查找
转换条件: 元素数 > 512 或任意value长度 > 64字节
List -底层是快表
有序可重复,用于队列、时间线。
Quicklist 本质是双向链表 + 压缩列表的组合,每个节点都是一个 ziplist
Set-底层是整数集合+ 哈希表
无序不重复集合,用于标签、共同关注。
纯整数小集合:intset(有序数组,省内存)。其他情况:哈希表
ZSet-底层是压缩列表+跳表+哈希表
带分数的有序集合,用于排行榜。
小ZSet用:ziplist(按分数顺序插入,保持有序)。大ZSet用:skiplist + dict(跳表保证有序,dict 保证 O(1) 查分)
转换条件:≤128元素且member≤64字节用ziplist
BitMap(2.2新增)
本质是 String 类型。位操作节省空间,用于签到、在线状态。
HyperLogLog(2.8新增)
固定12KB,统计UV,有1%误差但极省内存。
GEO(3.2新增 )
底层基于 Sorted Set(ZSet)实现,用于附近的人、门店搜索。
Stream(5.0新增)
Redis 5.0 新增的消息流数据结构,类似消息队列。主从复制
(1) 全量同步
当从节点首次连接主节点,或主从复制关系因故障断开过久时触发。
步骤1:从节点发送 PSYNC命令请求同步。
步骤2:主节点执行 BGSAVE,在后台生成当前数据的RDB快照文件。
步骤3:主节点将RDB文件发送给从节点,从节点清空旧数据后载入RDB。
步骤4:主节点将生成RDB期间及之后接收到的新写命令,存入“复制缓冲区”。
步骤5:主节点将缓冲区内的所有写命令发送给从节点执行,从而达成数据一致。
(2) 增量同步
全量同步完成后,进入稳定工作状态。主节点每执行一个写命令,都会异步地将其发送给所有从节点,从节点执行相同命令以保持数据同步。哨兵模式
Redis Sentinel集群模式
Redis Cluster