Redis 数据类型
Redis 是一个开源的内存数据库,它支持多种数据类型,包括字符串、列表、集合、有序集合和哈希表。这些数据类型可以满足不同的需求,比如缓存、计数、排序等。本文将介绍 Redis 的常用数据类型及其用法。
字符串
字符串是 Redis 最基本的数据类型,它可以存储任意类型的数据,比如文本、数字等。字符串的最大长度是 512MB。
设置字符串
如果要设置字符串,可以使用 SET
命令:
SET key value
例如:
SET name "Alice"
如果键已经存在,SET
命令会覆盖原来的值。
值可以是任意类型的数据,比如文本、二进制数据等。值的大小不能超过 512MB。
SET
命令还有一些选项,可以用作附加参数。比较常用的选项有:EX
、PX
、NX
和 XX
,它们分别表示设置过期时间、设置过期时间(毫秒)、仅在键不存在时设置值和仅在键存在时设置值。
例如,要设置一个过期时间为 60 秒的字符串,可以使用 SET
命令的 EX
选项:
SET key value EX 60
NX
选项可以用 SETNX
命令代替:
SETNX key value
获取字符串
如果要获取字符串,可以使用 GET
命令:
GET key
如果键不存在,GET
命令会返回 nil
。
实践中,我们会有更复杂的获取字符串的需求。比如,设置一个字符串并返回旧值,可以使用 GETSET
命令:
GETSET key value
更特别的,我们可能会用到 INCR
命令,它会将键的值增加 1:
INCR key
如果键不存在,INCR
命令会将键的值设置为 1
。
修改的过程是原子的,即使多个客户端同时对同一个键执行 INCR
命令,也不会出现竞争条件。例如,不会出现客户端 A 读取到 “60”,客户端 B 读取到 “60”,然后同时增加到 “61”。这个过程的最终值总是 “62”,也就是读-增加-设置操作是在其他客户端不执行命令的情况下执行的。
类似的命令还有 DECR
、INCRBY
和 DECRBY
。
此外,我们还可能需要批量获取字符串,可以使用 MGET
命令:
MGET key1 key2 ...
MGET
命令会返回多个键的值。
如果要设置多个字符串的值,可以使用 MSET
命令:
MSET key1 value1 key2 value2 ...
MSET
命令会设置多个键的值。
删除字符串
如果要删除字符串,可以使用 DEL
命令:
DEL key
如果键不存在,DEL
命令会返回 0
,否则返回 1
。
其他的命令还有 GETDEL
等。
列表
列表是一个有序的字符串列表,它可以存储多个值。列表的最大长度是 2^32 - 1。
添加元素
要向列表中添加元素,可以使用 LPUSH
或 RPUSH
命令:
LPUSH key value1 value2 ...
RPUSH key value1 value2 ...
LPUSH
命令会将值插入到列表的头部,RPUSH
命令会将值插入到列表的尾部。
如果键不存在,LPUSH
或 RPUSH
命令会创建一个新的列表。
获取元素
要获取列表中的元素,可以使用 LRANGE
命令:
LRANGE key start stop
如果 start
和 stop
都是正数,LRANGE
命令会返回列表中从 start
到 stop
之间的元素。如果 start
是负数,表示从列表的尾部开始计数,如果 stop
是负数,表示从列表的尾部开始计数。这些规则基本上和 Python 的切片操作一样。
如果 start
大于 stop
,LRANGE
命令会返回一个空列表。
如果键不存在,LRANGE
命令会返回一个空列表。
要获取列表中的第一个元素,可以使用 LINDEX
命令:
LINDEX key index
LINDEX
命令会返回列表中指定索引的元素。
如果键不存在,LINDEX
命令会返回 nil
。
要获取列表的长度,可以使用 LLEN
命令:
LLEN key
LLEN
命令会返回列表的长度。
如果键不存在,LLEN
命令会返回 0
。
删除元素
如果要删除列表中的元素,可以使用 LPOP
或 RPOP
命令:
LPOP key
RPOP key
LPOP
命令会删除并返回列表的第一个元素,RPOP
命令会删除并返回列表的最后一个元素。
如果键不存在,LPOP
或 RPOP
命令会返回 nil
。
如果要移动元素,可以使用 LMOVE
命令:
LMOVE source destination LEFT|RIGHT LEFT|RIGHT
LMOVE
命令会将列表 source
中的第一个元素移动到列表 destination
中,并返回移动的元素。
如果 source
和 destination
是同一个列表,LMOVE
命令会将元素从列表的头部移动到尾部,或者从尾部移动到头部。
如果 source
不存在,LMOVE
命令会返回 nil
。
如果 destination
不存在,LMOVE
命令会创建一个新的列表。
这个命令可以用来实现循环队列等功能。
如果只需要保留列表的一部分元素,可以使用 LTRIM
命令:
LTRIM key start stop
LTRIM
命令会保留列表中从 start
到 stop
之间的元素,其他元素会被删除。
集合
集合是一个无序的字符串集合,它可以存储多个值。集合的最大长度是 2^32 - 1。
添加元素
如果要向集合中添加元素,可以使用 SADD
命令:
SADD key member1 member2 ...
如果键不存在,SADD
命令会创建一个新的集合。
获取元素
如果要获取集合中的元素,可以使用 SMEMBERS
命令:
SMEMBERS key
SMEMBERS
命令会返回集合中的所有元素。
如果键不存在,SMEMBERS
命令会返回一个空集合。
当然,这个命令不是很实用,因为如果集合中的元素很多,返回的结果可能会很大,对网络和内存的开销也会很大。
替代的方法是使用 SISMEMBER
命令:
SISMEMBER key member
SISMEMBER
命令会检查集合中是否存在指定的元素。
如果键不存在,SISMEMBER
命令会返回 0
。
如果只需要获取集合的元素个数,可以使用 SCARD
命令:
SCARD key
SCARD
命令会返回集合的元素个数。
如果键不存在,SCARD
命令会返回 0
。
如果要获取集合的交集、并集或差集,可以使用 SINTER
、SUNION
和 SDIFF
命令:
SINTER key1 key2 ...
SUNION key1 key2 ...
SDIFF key1 key2 ...
SINTER
命令会返回多个集合的交集,SUNION
命令会返回多个集合的并集,SDIFF
命令会返回多个集合的差集。
如果键不存在,SINTER
、SUNION
和 SDIFF
命令会返回一个空集合。
删除元素
要删除集合中的元素,可以使用 SREM
命令:
SREM key member1 member2 ...
SREM
命令会删除集合中的指定元素。
如果键不存在,SREM
命令会返回 0
,否则返回删除的元素个数。
有序集合
有序集合是一个有序的字符串集合,它可以存储多个值,并且每个值都有一个分数(浮点数)。有序集合的最大长度是 2^32 - 1。
这里的有序集合是按照分数排序的,如果两个元素的分数相同,那么按照字典序排序。
添加元素
要向有序集合中添加元素,可以使用 ZADD
命令:
ZADD key score1 member1 score2 member2 ...
如果键不存在,ZADD
命令会创建一个新的有序集合。
获取元素
要获取有序集合中的元素,可以使用 ZRANGE
命令:
ZRANGE key start stop
ZRANGE
命令会返回有序集合中从 start
到 stop
之间的元素。
如果键不存在,ZRANGE
命令会返回一个空的有序集合。
可以使用 WITHSCORES
参数来返回分数:
ZRANGE key start stop WITHSCORES
ZRANGE
命令会返回元素分数是从小到大排序的。如果要返回元素分数是从大到小排序的,可以使用 ZREVRANGE
命令。
如果需要按照分数范围获取元素,可以使用 ZRANGEBYSCORE
命令:
ZRANGEBYSCORE key min max
ZRANGEBYSCORE
命令会返回有序集合中分数在 min
和 max
之间的元素。
如果键不存在,ZRANGEBYSCORE
命令会返回一个空的有序集合。
可以使用一些特殊数值,比如 -inf
和 +inf
,分别表示负无穷和正无穷。
如果要获取有序集合中的某个元素的分数,可以使用 ZSCORE
命令:
ZSCORE key member
ZSCORE
命令会返回有序集合中指定元素的分数。
如果键不存在,ZSCORE
命令会返回 nil
。
如果要获取有序集合的排名,可以使用 ZRANK
命令:
ZRANK key member
ZRANK
命令会返回有序集合中指定元素的排名。
如果键不存在,ZRANK
命令会返回 nil
。
如果只需要获取有序集合的元素个数,可以使用 ZCARD
命令:
ZCARD key
ZCARD
命令会返回有序集合的元素个数。
如果键不存在,ZCARD
命令会返回 0
。
删除元素
如果要删除有序集合中的元素,可以使用 ZREM
命令:
ZREM key member1 member2 ...
ZREM
命令会删除有序集合中的指定元素。
如果键不存在,ZREM
命令会返回 0
,否则返回 1
。
如果要按照分数范围删除元素,可以使用 ZREMRANGEBYSCORE
命令:
ZREMRANGEBYSCORE key min max
ZREMRANGEBYSCORE
命令会删除有序集合中分数在 min
和 max
之间的元素。
如果键不存在,ZREMRANGEBYSCORE
命令会返回 0
。
哈希表
哈希表是一个键值对集合,它可以存储多个字段和值。哈希表的最大长度是 2^32 - 1。
设置字段
要设置哈希表中的字段,可以使用 HSET
命令:
HSET key field1 value1 field2 value2 ...
如果键不存在,HSET
命令会创建一个新的哈希表。
INCRBY
命令也有一个对应的 HINCRBY
命令,可以用来增加哈希表中的字段值:
HINCRBY key field increment
HINCRBY
命令会将哈希表中指定字段的值增加 increment
。
如果键不存在,HINCRBY
命令会创建一个新的哈希表。
获取字段
如果要获取哈希表中的字段,可以使用 HGET
命令:
HGET key field
HGET
命令会返回哈希表中指定字段的值。
如果键不存在,HGET
命令会返回 nil
。
如果要获取哈希表中的多个字段,可以使用 HMGET
命令:
HMGET key field1 field2 ...
HMGET
命令会返回哈希表中指定字段的值,以数组的形式返回。
如果键不存在,HMGET
命令会返回一个空数组。
如果要获取哈希表中的所有字段,可以使用 HGETALL
命令:
HGETALL key
HGETALL
命令会返回哈希表中的所有字段和值。
如果键不存在,HGETALL
命令会返回一个空数组。
如果只需要获取哈希表中的字段个数,可以使用 HLEN
命令:
HLEN key
HLEN
命令会返回哈希表中的字段个数。
如果键不存在,HLEN
命令会返回 0
。
删除字段
如果要删除哈希表中的字段,可以使用 HDEL
命令:
HDEL key field1 field2 ...
HDEL
命令会删除哈希表中的指定字段。
如果键不存在,HDEL
命令会返回 0
,否则返回删除的字段个数。
如果要删除哈希表中的所有字段,可以使用 HDEL
命令:
HDEL key *
HDEL
命令会删除哈希表中的所有字段。
如果键不存在,HDEL
命令会返回 0
。
其他
除了上面介绍的数据类型,Redis 还支持一些其他数据类型,比如位图、地理位置、流、JSON 等。这些数据类型可以满足更多的需求,比如统计、地理位置、消息队列等。
如果要使用这些数据类型,可以查看 Redis 的官方文档,了解更多的用法。
总结
Redis 支持多种数据类型,包括字符串、列表、集合、有序集合和哈希表。这些数据类型可以满足不同的需求,比如缓存、计数、排序等。在使用 Redis 时,我们需要根据实际需求选择合适的数据类型,并了解它们的用法。