Redis 的五种数据类型
1. 五种数据类型
- 字符串(STRING):数据存储结构可以是字符串、整数、浮点数。
- 列表(LIST):数据结构双向链表,每个节点是字符串。
- 集合(SET):数据结构哈希表,每个节点是字符串且不能重复。
- 散列(HASH):数据结构哈希表,类似一个小型的 redis 字符串类型,以 key-value 的形式存储。
- 有序集合(ZSET):数据结构哈希表,和无序集合相似,但有序集合每个节点都会关联一个分值,分值为浮点数,并根据该分值进行排序。
2. 字符串(STRING)常用命令
- GET:获取一个键的值,当不存在时返回(nil)
- SET:SET 命令在 redis 4.0 中,参数如下:SET KEY VALUE [EX seconds] [PX milliseconds] [NX|XX]
EX seconds:设置键值过期时间,单位秒,SETEX 命令相当于该参数用法。
PX milliseconds:设置键值过期时间,单位毫秒。
NX:当键值不存在时才能设置,存在原子性,SETNX 命令相当于该参数用法。
XX:当键值存在是才可设置。
- DEL:移除一个键值,支持移除多个键值。
- INCR:对整数值加1,并返回运算后的结果,非整数类型报错。
- DECR:对整数值减1,并返回运算后的结果,非整数值类型报错。
- INCRBY:对整数值加上一个整数,并返回运算后的结果,非整数值类型报错。
- DECRBY:对整数值减去一个整数,并返回运算后的结果,非整数值类型报错。
- INCRBYFLOAT:对数值加上一个浮点数,并返回运算后的结果,非数值类型报错。
注:需要注意的是这里没有 DECRBYFLOAT 命令,可以用 INCRBYFLOAT 加上一个负数来实现
- APPEND:字符串追加,拼接到已有字符串尾部,不存在则新增
- GETRANGE:字符串截取,在 redis 2.x 中为 SUBSTR ,包含 end 下标。
- SETRANGE:字符串改写,覆盖 offset 开始(包含offset),value 长度的字符串。
- STRLEN:返回键值长度。
3. 列表(LIST)常用命令
- LPUSH:将一个或多个字符串插入列表左(头)部,不存在列表则新增一个列表。
- LPUSHX:将一个或多个字符串插入列表左(头)部,不存在列表则无法新增。
- RPUSH:将一个或多个字符串插入列表右(尾)部,不存在列表则新增一个列表。
- RPUSHX:将一个或多个字符串插入列表右(尾)部,不存在列表则无法新增。
- LINDEX:获取列表指定位置的元素。
- LREM:从key对应list中删除count个和value相同的元素。count为0时候删除全部,count为正,则删除匹配count个元素,如果为负数,则是从右侧扫描删除匹配count个元素。
- LPOP:从左(头)部弹出一个元素。
- RPOP:从右(尾)部弹出一个元素。
- LRANGE:查询指定下标范围的数据,包含 end 下标,end 为 -1 时代表返回列表剩余所有数据。可用于分页。
- LTRIM:列表修剪,将列表 start end 下标(包含 start end)范围内的数据保留,其余删除。
- BLPOP:从左(头)部弹出一个元素,若元素不存在则阻塞等待。
- BRPOP:从右(尾)部弹出一个元素,若元素不存在则阻塞等待。
BLPOP 和 BRPOP 可用于实现消息队列。虽然现在各类 MQ 中间件已经十分丰富,功能也愈发强大完善,但有时候我们需求较为简单时,可考虑使用 redis 简单实现,redis 也支持发布订阅模式。
4. 集合(SET)常用命令
- SADD:将一个或多个元素加入集合,元素值重复则覆盖,若集合不存在则新建集合并加入。
- SMEMBERS:返回集合中的所有元素。
- SISMEMBER:判断某个元素是否存在于集合中。
- SREM:将一个或多个元素从集合中移除。
- SCARD:返回集合中元素数量。
- SRANDMEMBER:随机返回集合中的一个或指定数量的元素。
- SPOP:随机弹出集合中的一个或指定数量的元素。
- SMOVE:将指定元素从一个集合移动到另外一个集合。
- SDIFF:返回第一个集合和其他集合取差集后的元素。
- SDIFESTORE:将和其他集合取差集的结果写入目标集合。
- SINTER:返回第一个集合和其他集交取并集后的元素。
- SINTERSTORE:将和其他集合取交集的结果写入目标集合。
- SUNION:返回第一个集合和其他集合取并集后的元素。
- SUNIONSTORE:将和其他集合取并集的结果写入目标集合。
5. 散列(HASH)常用命令
- HSET:对一个散列设置键值,存在则覆盖。
- HGET:获取一个键的值。
- HDEL:移除一个或多个键值
- HGETALL:获取一个散列的所有键值。
- HMGET:根据多个 key 获取散列的值。
- HMSET:对一个散列设置多个个键值。
- HLEN:获取一个散列的键值数量。
- HEXISTS:判断一个散列中是否存在某个键。
- HKEYS:获取一个散列的所有 key。
- HVALS:获取一个散列的所有值。
- HINCRBY:对一个散列值为整型的值添加一个整数,非整数则报错。
- HINCRBYFLOAT:对一个散列值为数值类型的值添加一个浮点数,非数值则报错。
这里需要注意的是相比于 redis 的 DECRBY 散列并不提供 HDECRBY 的命令,如果需要做减法,可以用 HINCRBY 加上一个负数来实现。
6. 有序集合(ZSET)常用命令
- ZADD:对一个有序集合设置多个元素和排序的分数,分数可以为整型或者浮点型,支持通过 INCR 参数将命令转为 ZINCRBY。ZADD 参数较多,完整命令参数如下为 ZADD key [NX|XX] [CH] [INCR] score member [score member …],参数详解如下:
XX: 仅仅更新存在的成员,不添加新成员。
NX: 不更新存在的成员。只添加新成员。
CH: 修改返回值为发生变化的成员总数,原始是返回新添加成员的总数 (CH 是 changed 的意思)。更改的元素是新添加的成员,已经存在的成员更新分数。 所以在命令中指定的成员有相同的分数将不被计算在内。注:在通常情况下,ZADD返回值只计算新添加成员的数量。
INCR: 当ZADD指定这个选项时,成员的操作就等同ZINCRBY命令,对成员的分数进行递增操作。
- ZREM:通过多个元素批量移除。
- ZRANGE:根据排名获取集合内的元素,包含起始和终止排名位置的元素,如果传入参数 WITHSCORES 将连同分值一同返回。
- ZRANGEBYSCORE:根据分值获取集合内的元素,包含起始和终止数值的元素,如果传入参数 WITHSCORES 将连同分值一同返回,支持参数 LIMIT 用于分页,分页参数为 offset (偏移位置),count (要获取的数量),可用于分页查找。
- ZCARD:获取集合内元素数量。
- ZINCRBY:对集合内的元素分值添加一个浮点数,不存在的元素则新增。
- ZCOUNT:根据分值统计分值内的元素数量,包含分值的最大和最小值。
- ZRANK:获取某个元素在集合内的排名。
- ZSCORE:获取某个元素在集合内的分值。
- ZREVRANK:倒序(从大到小)获取某个元素在集合内的排名。
- ZREVRANGE:根据排名倒序(从大到小)获取集合内的元素,包含起始和终止排名位置的元素,如果传入参数 WITHSCORES 将连同分值一同返回。
- ZREVRANGEBYSCORE:根据分值获取集合内的元素并倒序(从大到小)输出,包含起始和终止数值的元素,如果传入参数 WITHSCORES 将连同分值一同返回,支持参数 LIMIT 用于分页,分页参数为 offset (偏移位置),count (要获取的数量),可用于分页查找。
- ZREMRANGEBYRANK:根据排名移除集合内的元素,包含起始和终止位置的排名。
- ZREMRANGEBYSCORE:根据分值移除集合内的元素,包含最小和最大的分值本身。
- ZINTERSTORE:将多个集合取交集后经过权重(比例)运算,再根据指定的求和、最大值、最小值函数,将结果写入目标集合。该命令完整参数 ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] 参数介绍如下:
destination:指定结果集保存的集合。
numkeys key [key …]:numkeys 指定有多少个集合参与交集运算(之所以需要该参数,猜测是由于 redis 的其余参数干扰), key 指定参与交集运算的集合。
[WEIGHTS weight [weight …]]:指定参与交集运算各集合 score 的权重(比例)参数,即乘积。
[AGGREGATE SUM|MIN|MAX]: 指定交集中元素的 score 的运算函数,例如:SUM 等于各集合中该元素的 score 乘以权重后求和。
- ZUNIONSTORE:将多个集合取并集后经过权重(比例)运算,再根据指定的求和、均值、最大值、最小值函数,将结果写入目标集合。该命令完整参数 ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX],详解同上。