常见数据结构
键值类型
- Key 类型: String
- Value 类型
- 基本类型 String:hello world
- 基本类型 Hash:{ name: “Jack”, age : 21 }
- 基本类型 List:[ A → B → C → D ]
- 基本类型 Set:{ A, B, C },基本类型,无序集合
- 基本类型 SortedSet:{ A : 1, B : 2, C : 3 },有序集合
- 特殊类型 GEO:{ A : (12.3, 30.5) }
- 特殊类型 BitMap:0101010101010010101
- 特殊类型 HyperLog:0101010101010101010
其他数据库
- 文档类型 (MongoDB)
- 列类型 (HBase)
- Graph 类型 (Neo4j)
常见命令
- 特点:Redis 的所有自带的命令都是原子性的,不用担心并发问题
一、通用命令
命令 | 功能 |
---|---|
KEYS | 查看符合模板的所有 key |
SET | 添加一个 key-value 键值对,如果原本存在则会更新 key 对应的 value 和 key 对应的 EXPIRE |
DEL | 删除一个指定的 Key |
EXIST | 判断 key 是否存在 |
EXPIRE | 给 key 设置有效期(单位:sec),到期自动删除 |
PERSIST | 将 key 设置为永久有效 |
TTL | 查看 key 的有效期,-1 表示永久有效,-2 表示不存在 |
二、不同数据结构操作命令
key 格式最佳实践
:[projectName]:[serviceName]:[className]:[id]
String 类型
-
常用命令
SET 添加或修改键值对 SETNX set key-value if not exists 添加键值对,存在则不做修改 SETEX 添加键值对,指定有效期 GET 根据 key 获取 value MSET 批量添加多个 String 键值对 MGET 根据多个 key 获取多个 value INCR 整数 key 自增 1 INCRBY 整数 key 自增并自定义步长 INCRBYFLOAT 浮点数 key 自增并自定义步长 -
使用建议
:建议 SDS 长度小于 44 字节(因为 SDS < 44 byte 时会采用 EMBSTR 编码,采用连续内存空间,只需要申请一次内存,效率高) -
String 编码方式
- INT 编码:存储整数值且大小在 LONG_MAX 范围内,则直接将数据保存在 RedisObject 的 ptr 指针位置
- EMBSTR 编码:SDS 长度 ≤ 44 字节,RedisObject 和 SDS 申请连续内存空间,共 64 byte 大小,效率高
- RAW 编码:SDS 长度 > 44 字节,RedisObject 的 ptr 指针指向 SDS 独立内存空间(需要申请两次内存空间)
Hash 类型
-
定义
:value 是一个无序字典,类似 Java 中的 HashMap -
功能
:针对单个字段 CRUD 很方便,因为对象中每个字段独立存储 -
常用命令
⭐HSET key field value 添加或修改 key 的 field 字段值 ⭐HGET key field 获取 key 的 field 字段值 HMGET 批量查询多个 key 的 field 字段值 HMSET 批量添加多个 hash 类型 key 的 field 值 HGETALL HKEYS HVALS HINCRBY HSETNX -
编码方式
- ZipList 编码
- 节省内存空间,用连续的两个 entry 存储 key-value
- 要求元素个数 ≤ hash_max_ziplist_entires 个(默认512个),entry 大小 ≤ hash_max_ziplist_value 字节(默认64字节)
- ZipList 编码
List 类型
-
定义
:类似 Java 中的 LinkedList 类,可看做一个双向链表结构 -
功能
:支持正向检索和反向检索 -
特点
- 有序
- 元素可以重复
- 插入删除快
- 查询速度一般
-
常用命令
⭐LPUSH key elem1 elem2 … 向链表左侧插入一个或多个元素 ⭐RPUSH key elem1 elem2 … 向链表右侧插入一个或多个元素 ⭐BLPOP & BRPOP Block LPOP & Block RPOP,阻塞式获取,在没有元素时会等待指定时间 LPOP key 移除并返回列表左侧的第一个元素,没有则返回 nil RPOP key 移除并返回列表右侧的第一个元素,没有则返回 nil LRANGE key start end 返回一段 index 范围内的所有元素,-x 表示倒数第 x 个元素 -
底层数据结构
:QuickList
Set 类型
-
定义
:类似 Java 中的 HashSet 类,key 是 set 的名字,value 是集合中的值 -
功能
:快速获知 value 是否在当前 set 中 -
特点
- 无序
- 元素唯一
- 查找速度快
- 支持交集、并集、补集功能
-
常见命令
SADD key member … 添加元素 SREM key member … 删除元素 SCARD key 获取元素个数 SISMEMBER key member 判断一个元素是否存在于 set 中 SMEMBERS 获取 set 中所有元素 SINTER key1 key2 … 求 key1 和 key2 集合的交集 SDIFF key1 key2 … 求 key1 和 key2 集合的差集 SUNION key1 key2 …. 求 key1 和 key2 集合的并集 -
编码方式
- IntSet 编码:存储的所有数据都是整数,并且元素数量不超过 set-max-intset-entries 时,使用 IntSet 节省内存空间
- HT 编码:key 用来存元素,value 统一为 null
SortedSet 类型(ZSet)
-
定义
:有序的 set 集合,类似 Java 中的 TreeSet,每一个元素都有一个 score 属性用于排序 -
功能
:排序且元素唯一,实现排行榜类似的功能 -
特点
- 可排序
- 元素不重复
- 查询速度快
-
常用命令
ZADD key score member 添加 member 元素及其 score 值,到 key 集合中 ZREM key member 删除 member 元素 ZSCORE key member 查询 member 元素的 score 值 ZRANK key member 查询 member 元素的排名 ZREVRANK key member 查询 member 元素倒序排名 ZCARD key 获取 sorted set 中的元素个数 ZCOUNT key min max 统计 score 值在给定范围内的元素个数 ZINCRBY key increment member 指定 member 元素自增,步长为 increment ZRANGE key min max 查询指定 升序 rank 范围 内的元素(max为最大排名,min为最小排名) ZREVRANGE key max min 查询指定 降序 rank 范围 内的元素(max为最大排名,min为最小排名) ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 查询指定 升序 score 范围 内的元素 (min为最小score,max为最大score) LIMIT :条件查询 / offset:跳过的个数, 1则不含 max / num ; 的数据数量 ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT] 查询指定 降序 score 范围 内的元素 (min为最小score,max为最大score) LIMIT :条件查询 / offset:跳过的个数, 1则不含 max / num ; 的数据数量 ZDIFF & ZINTER & ZUNION 差集 & 交集 & 并集 -
编码方式
- ZipList 编码
- 用于实现排序功能 (手动实现排序) 并且减少内存消耗
- 需要根据 score 值手动实现排序功能,并通过连续存储 ele score 的方式实现键值存储
- 要求元素数量小于 zset_max_ziplist_entries 个,元素小于 zset_max_ziplist_value 字节
- SkipList 编码:用于实现排序功能,元素较多时 ZSet 会将 ZipList 编码转为 SkipList 编码
- Dict 编码:用于实现查找和元素唯一功能
- ZipList 编码