Redis 的基本特性和 5 个常用数据结构
1. 基本特性
速度快
- 基于 C 语言开发,源码短小精悍
- 数据存在内存中
- 单线程(高性能,因为 Redis 一次只会运行一条命令,应避免在生产环境使用比较耗时的命令。)
支持数据持久化,异步保存到磁盘
丰富的数据结构(key-value):string、list、hash、set、zset
多语言客户端
功能丰富:发布订阅;Lua 脚本;等
简单
- 核心代码量小
- 不依赖外部库
- 单线程模型
支持主从复制
原生高可用和分布式解决方案
Redis-Sentinel
高可用v2.8+
Redis-Cluster
分布式v3.0+
2. 常用数据结构
下面是一些通用的 API(不依赖具体数据类型):
1 | # 按照规则遍历所有 key |
2.1. sting 字符串
2.1.1. 结构
- key
- value
2.1.2. 场景
- 缓存
- 计数器
- 分布式锁
- ……
2.1.3. 专有 API
1 | # key 不管是否存在,都设置:存在则更新,不存在则新增 |
子串
1 | # 追加子串 |
计数器
1 | # 递增 |
2.2. hash 哈希
2.2.1. 结构
key
value
field 不能相同
value 可以相同
2.2.3. 专有 API
基本操作
1 | # 为 key 增加一个键值对 |
查询
1 | # 获取 key 的一个键的值 |
2.3. list 列表
2.3.1. 特点
- 有序
- 可重复
- 左右两端插入、弹出
2.3.2. 场景
Stack 栈
lpush
+lpop
Queue 队列
lpush
+rpop
Capped Collection 有限队列集合(固定数量)
lpush
+ltrim
Message Queue 消息队列
lpush
+brpop
2.3.3. 专有 API
增(入)
1 | # 从列表左边添加 |
删(出)
1 | # 从列表左边弹出一个 value |
改
1 | # 修改指定下标的元素 |
查
1 | # 获取指定索引范围的所有项(包含 stop 的项) |
其它
1 | # 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 |
2.4. set 集合
2.4.1. 特点
- 无序
- 不可以重复
- 集合之间的操作
2.4.2. 场景
Tagging 标签化
sadd
Random Item 随机元素
srandmember
或spop
Social Graph 社交图谱
sadd
+sinter
2.4.3. 专有 API
1 | # 添加元素到集合中(重复的元素会被忽略) |
集合间
1 | # 获取一个集合与其它集合的差集 |
2.5. zset 有序集合
2.5.1. 特点
- 有序
- 不可以重复
- 元素多一个 score 用于排序
2.5.2. 场景
- 排行榜
2.5.3. 专有 API
基本操作
1 | # 添加元素 |
排名和分数
1 | # 返回元素分数(score) |
根据范围获取元素
1 | # 获取指定索引范围内的升序(score 从小到大)元素[分数] |
根据范围移除元素
1 | # 删除指定排名范围内的元素 |