Redis 最新官网有关数据结构的介绍:Understand Redis data types。
按照最新的官网介绍,我这里提炼总结一下,Redis 的 key 一般是 String 类型,value 可以有如下类型:
下面针对常用的一些命令进行介绍。
字符串类型,是Redis中最简单的存储类型,不超过 512 MB。根据字符串的格式不同,又可以分为:
- SET:添加或者修改键值对
- GET:根据 key 获取值
- MSET:批量添加多个键值对
- MGET:根据多个 key 获取多个值
- INCR:整型的 key 的值增1
- INCRBY: 整型的key增加指定步长
- INCRBYFLOAT:浮点类型的数字增指定步长
- SETNX:仅当这个 key 不存在才添加键值对
- SETEX:添加键值对,并且指定有效期
例如:
SET name "John"
GET name
SETNX user_id 123456
SETEX session 30 "user_id=123456&username=John"
List 结构是一种双端链表,支持在两端插入和删除元素。它具有以下特点:
- LPUSH key value ... :向列表左侧插入一个或多个元素
- LPOP key:移除并返回列表左侧的第一个元素,没有则返回 nil
- RPUSH key value ... :向列表右侧插入一个或多个元素
- RPOP key:移除并返回列表右侧的第一个元素
- LRANGE key star end:返回一段角标范围内的所有元素
- BLPOP 和 BRPOP:给定列表内没有任何元素可供弹出的时候,连接将被阻塞,直到超时或有元素可弹出为止
例如:
LPUSH myqueue item1
RPOP myqueue
BLPOP mylist 0 # 阻塞式获取列表 mylist 中的元素,直到有元素可弹出或超时时间为0(永久阻塞)
Redis 的 Sets 是一个无序的、不重复的元素序列。它底层其实是一个 value为 null 的hash表,所以添加、删除、查找的复杂度都是 O(1)。Redis Sets 提供的功能包括:
- SADD key member [member ...]:命令用于向集合中添加一个或多个元素。如果集合不存在,则会创建一个新的集合
- SADD key member [member ...] : 移除指定元素
- SCARD key: 返回集合的成员数
- SISMEMBER key member:判断一个元素是否存在于集合中
- SMEMBERS:返回集合的所有元素
- SINTER key1 key2 ... :求key1与key2的交集
例子:
SADD myset "apple" "banana" "cherry"
SCARD myset
SISMEMBER myset "banana"
通过键值对的形式保存数据。在 Redis 中,Hashes 可以被视为 Java 中的HashMap,通过 key-value 的形式保存数据。
Hash的常见命令有:
- HSET key field value:添加或者修改 key 的 field 值
- HGET key field:获取 key 的 field 的值
- HMSET:批量添加多个 key的 field 的值
- HMGET:批量获取多个 key 的 field 的值
- HGETALL:获取 key 中的所有的 field 和 value
- HKEYS:获取 hash 类型的 key 中的所有的 field
- HINCRBY: 让 key 的字段值自增并指定步长
- HSETNX:仅当 field 存在,添加 key 的 field 值,否则不执行
例子:
HSET user:1 name "John"
HSET user:1 age 25
HSET user:1 address "New York"
HGET user:1 name
HGETALL user:1
Sorted sets 是一个可排序的 Set 集合。Sorted sets 中的每一个元素都带有一个 score 属性,可以基于 score 属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。
Sorted sets 具备下列特性:
Sorted sets 的常见命令有:
- ZADD key score member:添加一个或多个元素到 Sorted sets,如果已经存在则更新其 score 值
- ZREM key member:删除 Sorted sets 中的一个指定元素
- ZSCORE key member : 获取 Sorted sets 中的指定元素的 score 值
- ZRANK key member:获取 Sorted sets 中的指定元素的排名
- ZCARD key:获取 Sorted sets t中的元素个数
- ZCOUNT key min max:统计 score 值在给定范围内的所有元素的个数
- ZINCRBY key increment member:让 Sorted sets 中的指定元素自增,步长为指定的increment值
- ZRANGE key min max:按照 score 排序后,获取指定排名范围内的元素
- ZRANGEBYSCORE key min max:按照 score 排序后,获取指定 score范围内的元素
- ZDIFF、ZINTER、ZUNION:求差集、交集、并集
例如:
假设我们有一个 Sorted sets,成员是游戏玩家的得分,我们需要根据得分对玩家进行排序。使用 ZADD 命令将玩家的得分添加到 Sorted sets 中:
ZADD players 90 "Alice"
ZADD players 80 "Bob"
ZADD players 85 "Charlie"
接下来,使用 ZRANGE 命令获取所有成员及其分数:
ZRANGE players 0 -1 WITHSCORES
这将返回 “players” Sorted sets 中所有成员及其分数,按分数从小到大排序。
想要查找特定得分的玩家,我们可以使用 ZRANGEBYSCORE 命令:
ZRANGEBYSCORE players 80 90 WITHSCORES
返回 “players” Sorted sets 中分数在80到90之间的所有成员及其分数。
Redis Streams 允许存储和检索大量的数据。
Streams 的常见命令有:
- XADD stream_name field value [field value ...]:创建 Stream。其中,stream_name 是 Stream 的名称,field 是数据的字段,value 是字段的值,可以一次添加多个字段和值
- XREAD COUNT 0 STREAMS stream_name [stream_name ...] ID [ID ...]:读取 Stream。其中,COUNT 是读取的记录数量,0表示读取所有记录;STREAMS 是要读取的 Stream 的名称;ID 是你要读取的记录的 ID。可以指定要读取的记录的 ID 范围。
- XDEL stream_name [id [id ...]]:删除 Stream。其中,stream_name 是 Stream 的名称;id 是要删除的记录的 ID。可以指定要删除的记录的 ID 范围。
例子:
假设我们有一个名为 “my_stream” 的 Stream,用于存储用户的登录记录。
XADD my_stream *user_id 123 *timestamp 1625555555
这个命令将一个记录添加到 “my_stream” 中,包含字段 “user_id” 和 “timestamp”,它们的值分别为 123 和 1625555555。
XREAD COUNT 1 STREAMS my_stream 0
这个命令从 “my_stream” 中读取一条记录,起始 ID 为0。
XDEL my_stream 1625555555
这个命令从 “my_stream” 中删除 ID 为1625555555的记录。