//为避免浪费时间,请尽快退出
为什么需要 Redis
- 数据从单表演进出分库分表
- MySQL 从单机演进出集群
- 数据量增长
- 读写数据压力不断增长 搭配 Redis 改进
- 数据分冷热
- 热数据:经常被访问到的数据
- 将热数据存储到内存中
Redis 基本工作原理
(一定程度持久化
- 数据从内存中读写
- 数据保存到硬盘上防止重启数据丢失
- 增量数据保存到 AOF 文件
- 全量数据 RDB 文件
- 单线程处理所有命令
Redis 实际应用场景
- 连续签到
- key
- value
- expireAt
string 数据结构
通常和 expire 配合使用 场景:存储计数、session
- 消息通知 list 作为消息队列
Quicklist 由一个双向链表和 listpack 实现
Listpack
- 计数
- 一个用户有多项计数需求,可通过 hash 结构存储
dict
rehash: rehash 操作是将 ht[0]中的数据,全部迁移到 ht[1]中。数据量小的场景下,直接将数据从 ht[0]拷贝到 ht[1]速度是较快的。数据量大的场景,例如存有上百万的 KV 时,迁移过程将会明显阻塞用户请求。 渐进式 rehash: 为避免出现这种情况,使用了 rehash 方案。基本原理就是,每次用户访问时都会迁移少量数据。将整个迁移过程,平摊到所有的访问用不请求过程中。
-
排行榜
-
限流
-
分布式锁
字符串 string
区分大小写
键值对存储, 以二进制形式
| 命令 | 功能 |
|---|---|
| SET | |
| GET | |
| DEL | |
| EXISTS | |
| KEYS | |
| FLUSHALL | |
| clear | |
| TTL | 查看过期时间 |
| EXPIRE/SETEX | 设置过期时间 |
| SETNS | 只有当键不存在时才设置键的值 |
| redis-cli --raw 可以显示中文 |
列表 L
| 命令 | 功能 |
|---|---|
| LPUSH/RPUSH | |
| LRANGE | |
| LPOP/RPOP | |
| LLEN | |
| LTRIM | 删除指定范围以外的数 |
集合 S
| 命令 | 功能 |
|---|---|
| SADD | |
| SMEMBERS | 查看集合元素 |
| SISMEMBER | |
| SREM | 删除集合中元素 |
| 支持集合运算 |
有序集合 Z
| 命令 | 功能 |
|---|---|
| ZADD | |
| ZRANGE (WITHSCORES) | 键值 |
| ZSCORE | 值 |
| ZRANK/ZREVRANK | 排名 |
哈希 H
同默认, 前面+H
发布订阅
| 命令 | 功能 |
|---|---|
| PUBLISH | 将消息发送到指定的频道 |
| SUBSCRIBE | 订阅频道 |
消息队列 X
stream 解决订阅消息无法持久化,无法记录历史消息等等
| 命令 | 功能 |
|---|---|
| XADD | |
| XLEN | |
| XRANGE | |
| XTRIM | 删除消息 |
| eg. XTRIM name MAXLEN 0 删除所有消息 | |
| XREAD COUNT 2 BLOCK 1000 STREAMS name 0 |
读两条 if 没读取阻塞 1000ms 从 0 读
地理空间 GEO
| 命令 | 功能 |
|---|---|
| GOPOS | 获取一个地方经纬度 |
| GEODIST | 获取两个地方直线距离 |
| GEOSEARCH | 一个地方/经纬度附近 xx 的圆形区域周围城市 |
HyperLogLog PF
是一种用来做基数统计的算法,牺牲一定精度,占用内存小,缺点是有一定的误差 基数:如果集合中的每个元素都是唯一且不重复的,那么基数就是集合中元素的个数
位图 BIT
字符串类型的拓展
| 命名 | 功能 |
|---|---|
| SETBIT | |
| GETBIT | |
| SET | 用字符串/二进制来设置 |
| BITCOUNT | |
| BITPOS | 第一个出现 0/1 的位置 |