---
url: /redis.md
---
# redis

remote dictionary server 远程字典服务

Redis 是一个开源（BSD许可）的，内存中的数据结构存储系统，它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构，如 字符串（strings）， 散列（hashes）， 列表（lists）， 集合（sets）， 有序集合（sorted sets） 与范围查询， bitmaps， hyperloglogs 和 地理空间（geospatial） 索引半径查询。 Redis 内置了 复制（replication），LUA脚本（Lua scripting）， LRU驱动事件（LRU eviction），事务（transaction） 和不同级别的 磁盘持久化（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业务场景与数据类型对照表

| 业务场景         | 推荐数据类型 | 常用命令                     | 选型原因                           |
|------------------|--------------|------------------------------|-------------------------------------|
| 排行榜/热搜      | 有序集合     | ZADD, ZINCRBY, ZREVRANGE      | 支持排序、范围查询、实时更新         |
| 购物车           | 哈希         | HINCRBY, HDEL, HGETALL        | 字段级操作，避免整体序列化           |
| 抽奖/去重集合     | 集合         | SADD, SPOP, SRANDMEMBER       | 天然去重、随机弹出                   |
| 共同好友/标签交集 | 集合         | SINTER, SUNION, SDIFF         | 内置集合运算                         |
| 异步任务队列     | 列表         | LPUSH, BRPOP                  | FIFO特性，支持阻塞弹出                 |
| 分布式锁          | 字符串       | SET NX EX                     | 原子操作实现互斥与超时控制             |
| 计数器（阅读量/点赞） | 字符串     | INCR, INCRBY                  | 原子自增，保证并发安全                |
| 点赞/收藏判重     | 集合或布隆过滤器 | SADD/SISMEMBER 或 BF.ADD/BF.EXISTS | 小数据量用集合精确判重，大数据量用布隆过滤器节省内存 |
| 用户签到记录      | Bitmap       | SETBIT, BITCOUNT              | 高效存储与统计（单用户年数据仅46字节） |
| 附近的人         | GEO          | GEOADD, GEORADIUS             | 支持地理位置计算                     |

## redis 协议

redis://:password@host:port
默认用户的话，需要省略
特殊符号需要编码

## 延时队列

使用sortedset，
时间戳做score,
消息内容作为key,
调用zadd来生产消息，
消费者使用zrangbyscore获取n秒之前的数据做轮询处理

ZADD 11 1 "1" 2 "2"

ZRANGE 11 0 -1 WITHSCORES

## 布隆过滤器

https://hur.st/bloomfilter/

## 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



```

## Redis RateLimiter

主要基于以下几种算法实现：

‌令牌桶（Token Bucket）‌：如 Redisson 的 RRateLimiter，按固定速率生成令牌，请求需消耗令牌，支持突发流量 ‌‌

‌固定窗口（Fixed Window）‌：使用 Redis 的 INCR + EXPIRE 计数器，统计单位时间内的请求数，简单但存在窗口边缘突发问题 ‌‌

‌滑动窗口（Sliding Window）‌：基于 Redis Sorted Set 记录每个请求的时间戳，按时间衰减计算，精度更高但内存开销略大 ‌‌

## 延迟双删

延迟双删的核心思想：等一等，让并发的读请求都结束了，再把缓存清掉。

1. 先删除缓存
2. 更新数据库
3. 休眠/等待一段时间（比如 200ms~1s）
4. 再次删除缓存

## nosql

1、键值（Key-Value）存储数据库：常见的键值存储数据库有Tokyo Cabinet / Tyrant、Berkeley DB、MemcacheDB、Redis等。
2、列存储数据库：如HBase、Cassandra、Riak等。
3、文档型数据库：常见的文档型数据库有MongoDB、CouchDB、SequoiaDB等。
4、图（Graph）数据库：诸如Neo4J、InfoGrid、Infinite Graph等。
