[TOC]
1. 基本特性
-
速度快
- 基于 C 语言开发,源码短小精悍
- 数据存在内存中
- 单线程(高性能,因为 Redis 一次只会运行一条命令,应避免在生产环境使用比较耗时的命令。)
-
支持数据持久化,异步保存到磁盘
-
丰富的数据结构(key-value):string、list、hash、set、zset
-
多语言客户端
-
功能丰富:发布订阅;Lua 脚本;等
-
简单
- 核心代码量小
- 不依赖外部库
- 单线程模型
-
支持主从复制
-
原生高可用和分布式解决方案
Redis-Sentinel
高可用v2.8+
Redis-Cluster
分布式v3.0+
<!-- more -->
2. 常用数据结构
下面是一些通用的 API(不依赖具体数据类型):
# 按照规则遍历所有 key
# ⚠️ 注意:生产环境禁用,可以用 scan 替代,或只在从节点执行
> keys [patern]
> scan cursor [MATCH pattern] [COUNT count]
# 返回 key 的数据类型
> type key
# 检查 key 是否存在
> exists key [key ...]
# 删除
> del key [key ...]
# 统计 key 的数量
# 时间复杂度 O(1),通过内部计数器使用
> dbsize
# 设置过期时间(单位:秒),到期后自动删除
> expire key seconds
# 查看 key 的剩余过期时间
# > 0 剩余时间
# -1 key 存在,但没有设置过期时间
# -2 key 过期后被自动删除
> ttl key
# 去除 key 的过期时间
> persist key
2.1. sting 字符串
2.1.1. 结构
- key
- value
2.1.2. 场景
- 缓存
- 计数器
- 分布式锁
- ……
2.1.3. 专有 API
# key 不管是否存在,都设置:存在则更新,不存在则新增
> set key value
# key 不存在才设置 <==> 新增
> setnx key value
# key 存在才设置 <==> 更新
> set key value xx
# 获取指定 key 的 value
> get key
# 批量设置
> mset key value [key value ...]
# 批量获取
> mget key [ key ...]
# 获取字符串长度
> strlen key
子串
# 追加子串
# 返回追加成功的字符串长度
> append key value
# 获取子串
> getrange key start end
# 覆盖子串
> setrange key offset value
计数器
# 递增
# 不能超过 Long.Max 9223372036854775807
> incr key
> incrby key increment
# 递减
# 不能低于 Long.Min -9223372036854775808
> decr key
> decrby key decrement
2.2. hash 哈希
2.2.1. 结构
-
key
-
value
-
field 不能相同
-
value 可以相同
-
2.2.3. 专有 API
基本操作
# 为 key 增加一个键值对
# field 存在则修改,不存在,则新增
> hset key field value
# field 不存在才设置 <==> 新增
> hsetnx key field value
# 为 key 增加多个键值对
> hmset key field value [field value ...]
# 删除 key 中指定的键
> hdel key field [field ...]
# 递增
> hincrby key field increment
> hincrbyfloat key field increment
查询
# 获取 key 的一个键的值
> hget key field
# 获取 key 的多个键的值
> hmget key field [field ...]
# 获取 key 的所有 field 和 value
> hgetall key
# 返回所有 field
> hkeys key
# 返回所有 value
> hvals key
# 判断 hash 中的一个 field 是否存在
> hexists key field
# 判断 hash 中所有 field 的数量
> hlen 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
增(入)
# 从列表左边添加
> lpush key value [value ...]
# 从列表右边添加
> rpush key value [value ...]
# 在列表元素 pivot 的前面或后面插入一个新元素
> linsert key BEFORE|AFTER pivot newValue
删(出)
# 从列表左边弹出一个 value
> lpop key
# 从列表右边弹出一个 value
> rpop key
# 删除所有 value 相等的项
> lrem key count value
# count = 0 删除所有 value 相等的项
# count > 0 从左到右,删除最多 count 个 value 相等的项
# count < 0 从右到左,删除最多 Math.abs(count) 个 value 相等的项
# 按照索引范围修剪列表
> ltrim key start stop
改
# 修改指定下标的元素
> lset key index newValue
查
# 获取指定索引范围的所有项(包含 stop 的项)
> lrange key start stop
# 查询一个 key 下的所有项
> lrange key 0 -1
# 获取指定下标的项
> lindex key index
# 获取列表长度
> llen key
其它
# 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
# timeout 单位:秒
# lpop 的阻塞版本
> blpop key [key ...] timeout
# rpop 的阻塞版本
> brpop key [key ...] timeout
2.4. set 集合
2.4.1. 特点
- 无序
- 不可以重复
- 集合之间的操作
2.4.2. 场景
-
Tagging 标签化
sadd
-
Random Item 随机元素
srandmember
或spop
-
Social Graph 社交图谱
sadd
+sinter
2.4.3. 专有 API
# 添加元素到集合中(重复的元素会被忽略)
> sadd key member [member ...]
# 从集合中删除元素
> srem key member [member ...]
# 计算集合中元素个数
> scard key
# 检查集合中是否存在指定的元素
> sismember key member
# 从集合中随机取出 count 个元素
# 不会破坏集合
> srandmember key [count]
#从集合中随机弹出 count 个元素
#会破坏集合(元素的顺序)
> spop key [count]
# 取出集合中所有元素
> smembers key
# 注意:1. 获取到的元素是无序的;2. 元素较多时会阻塞其它操作
# 替代:sscan ?
集合间
# 获取一个集合与其它集合的差集
> sdiff key [key ...]
# 获取一个集合与其它集合的交集
> sinter key [key ...]
# 获取一个集合与其它集合的并集
> sunion key [key ...]
2.5. zset 有序集合
2.5.1. 特点
- 有序
- 不可以重复
- 元素多一个 score 用于排序
2.5.2. 场景
- 排行榜
2.5.3. 专有 API
基本操作
# 添加元素
# score 可重复,member 不可以重复
> zadd key score member [score member ...]
# 删除元素
> zrem key member [member ...]
# 增加或减少元素的分数(score)
# increment 传负数表示减少
> zincrby key increment member
# 返回元素总个数
> zcard key
排名和分数
# 返回元素分数(score)
> zscore key member
# 获取元素的升序(score 从小到大)排名
> zrank key member
# 获取元素的降序(score 从大到小)排名
> zrevrank key member
# 获取指定分数间的成员数量
> zcount
根据范围获取元素
# 获取指定索引范围内的升序(score 从小到大)元素[分数]
# star 0 第一条;stop -1 最后一条
zrange key start stop [withscores]
# 获取指定索引范围内的降序(score 从大到小)元素[分数]
zrevrange key start stop [withscores]
# 返回指定分数(score)范围内的升序元素[分数]
> zrangebyscore key min max [withscores]
# 返回指定分数(score)范围内的降序元素[分数]
> zrevrangebyscore key max min [withscores]
根据范围移除元素
# 删除指定排名范围内的元素
> zremrangebyrank key start stop
# 删除指定分数范围内的元素
> zremrangebyscore key min max