持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
strings(字符串)
strings 类型 Redis 最基本的数据类型,它是二进制安全的,即 Redis 的 string 类型可以存放任何数据,比如一张经过 base64 编码的图片或者一个序列化的 Ruby 对象。Redis 的字符串可以支持任意形式的数据,但是对于过大的文件不适合存入 Redis 中,一方面系统内存有限,另外一方面字符串类型的值最多能存储 512MB 字节的内容。接下来我们就一起来学习管理 string 类型数据的相关命令。
➡️ string 类型数据的相关命令
-
set key value:设置指定的 key 值。 -
get key:获取指定 key 的值 -
getrange key start end:返回 key 中字符串的子字符(下标从 0 开始,getrange key 0 -1表示返回整个字符串)。 -
getset key value:将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 -
getbit key offset:对 key 所储存的字符串值,获取指定偏移量上的位(bit),当偏移量offset比字符串值的长度大,或者 key 不存在时,返回 0 。 -
mget key1 [key2 ...]:获取一个或多个给定 key 的值。 -
setbit key offset value:对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit),其中 bit 值只有 0 或 1。 -
setex key seconds value:为指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX 命令将会替换旧的值。 -
setnx key value:在指定的 key 不存在时,为 key 设置指定的值。设置成功,返回 1 ; 设置失败,返回 0 。 -
setrange key offset value:指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset 开始。返回被修改后的字符串的长度。 -
strlen key:返回 key 所存储的字符串值的长度。 -
mset key value [key value ...]:同时设置一个或多个 key-value 键值对。 -
msetnx key value [key value ...]:同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。当所有 key 都成功设置,返回 1 ;如果所有给定 key 都设置失败(至少有一个 key 已经存在),那么返回 0 。 -
psetex key milliseconds value:它与setex命令类似,但其是以毫秒为单位设置 key 的生存时间。 -
incr key:将 key 中储存的数字值增一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行incr操作。返回增一之后,key 的值。 -
incrby key increment:将 key 中储存的数字加上指定的增量值。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行incrby命令。返回指定的增量值之后,key 的值。 -
incrbyfloat key increment:为 key 中所储存的值加上指定的浮点数增量值。如果 key 不存在,那么incrbyfloat会先将 key 的值设为 0 ,再执行加法操作。返回执行incrbyfloat操作之后,key 的值。 -
decr key:将 key 中储存的数字值减一。如果 key 不存在,那么 key 的值会先被初始化为 0,然后在执行decr操作。返回执行操作后的 key 的值。 -
decrby key decrement:将 key 中储存的数字减去指定的减量值。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行decrby命令。返回指定的减量值之后,key 的值。 -
append key value:为指定的 key 追加值。如果 key 已经存在并且是一个字符串,append命令将 value 追加到 key 原来的值的末尾;如果 key 不存在,append就简单地将给定 key 设为 value ,就像执行set key value一样。 string 类型常用使用场景 -
缓存:热点数据缓存(例如报表、明星新闻),对象缓存、全页缓存、可以提升热点数据的访问数据。
-
数据共享分布式:由于 Redis 是分布式的独立服务,可以在多个应用之间共享。比如:分布式 Session。
-
分布式锁:Redis 中的
setnx命令,当 key 不存在时才能添加成功,返回 1;当 key 存在时不能添加成功 ,返回 0。比如:一些热门的抢购业务,就可以使用分布式锁。 -
全局 ID:基于 incriby 命令,利用原子性。比如:分库分表的场景。
-
限流:基于 incr 命令,以访问者的 ip 和其他信息作为 key,访问一次增加一次计数,超过次数则返回 false。
-
计数器:基于 incr 命令。比如:文章的阅读量、微博点赞数、允许一定的延迟,先写入 Redis 再定时同步到数据库。
lists(列表)
Redis 中的 lists 是基于 Linked Lists 实现的。这也就意味着即使在一个 list 中有数百万个元素,在头部或尾部添加一个元素的操作,其时间复杂度也是常数级别的。但是在 linked list 实现的 list 上进行访问操作就没有那么快。如果要想访快速访问集合元素,建议使用可排序集合(sorted sets)。接下来我们就一起来学习管理 list 类型数据的相关命令。
➡️ list 类型数据的相关命令
lpush key value1 [value2 ...]:将一个或多个值插入到列表头部。 如果 key 不存在,一个空列表会被创建并执行lpush操作。 当 key 存在但不是列表类型时,返回一个错误。成功执行之后,返回列表的长度。lpushx key value:将一个或多个值插入到已存在的列表头部,列表不存在时操作无效。成功执行后,返回列表的长度。lrange key start stop:返回列表中指定区间内的元素,区间以偏移量start和end指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。blpop key1 [key2...] timeout:移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。brpop key1 [key2...] timeout:移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。brpoplpush source destination timeout:从列表中取出最后一个元素,并插入到另外一个列表的头部; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。lindex key index:通过索引获取列表中的元素。这里的索引下标可以是负数,比如 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。linsert key before|after pivot value:用于在列表的元素前或者后插入元素。当指定元素不存在于列表中时,不执行任何操作;当列表不存在时,被视为空列表,不执行任何操作;如果 key 不是列表类型,返回一个错误。llen key:返回列表的长度。 如果列表 key 不存在,则 key 被解释为一个空列表,返回 0 ; 如果 key 不是列表类型,返回一个错误。lpop key:移除并返回列表的第一个元素。lrem key count value:根据参数count的值,移除列表中与参数value相等的元素。
✨ 说明:
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。
-
lset key index value:通过索引来设置元素的值。当索引参数超出范围,或对一个空列表进行lset时,返回一个错误 -
ltrim key start stop:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 -
rpop key:用于移除列表的最后一个元素,返回值为移除的元素。返回值为被移除的元素;如果列表不存在,返回nil -
rpoplpush source destination:用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回。返回被移除的元素。 -
rpush key value1 [value2 ...]:将一个或多个值插入到列表的尾部(最右边)。如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误。成功执行命令后,返回列表的长度。 -
rpushx key value:用于将一个值插入到已存在的列表尾部(最右边)。如果列表不存在,操作无效。成功执行命令后,返回列表的长度。 ➡️ list 类型常用使用场景 -
消息排队:list 提供了两个阻塞的弹出操作(
blpop/brpop),可以设置超时时间。队列:先进先出。右边进入队列(rpush),左边出队列(blpop)。
栈:先进后出。入栈(rpush),出栈(blpop)。
hashs(哈希)
Redis 中的 hash 是一个 string 类型的 field(字段)和 value(值)的映射表,其特别适用于存储对象。可以将 hash 集合看成多个 key-value 将键值对组成的。接下来我们就一起来学习管理 hashs 类型数据的相关命令。
➡️ hash 类型数据的相关命令
-
hmset key field1 value1 [field2 value2 ...]:用于同时将多个 field-value (字段-值)对设置到哈希表中。如果哈希表中已存在此字段,则覆盖存在的字段;如果哈希表中不存在,会创建一个空哈希表,并执行hmset操作。 -
hgetall key:用于返回哈希表中,所有的字段和值。 -
hset key field value:用于为哈希表中的字段赋值。如果哈希表不存在,一个新的哈希表被创建并进行hset操作;如果字段已经存在于哈希表中,旧值将被覆盖。 -
hsetnx key field value:为哈希表中不存在的字段赋值。如果哈希表不存在,一个新的哈希表被创建并进行hsetnx操作;如果字段已经存在于哈希表中,则操作无效;如果 key 不存在,一个新哈希表被创建并执行hsetnx命令。 -
hexists key field:查看哈希表的指定字段是否存在。 -
hget key field:获取哈希表中指定字段的值。 -
hincrby key field increment:为哈希表中的字段值加上指定增量值。增量也可以为负数,相当于对指定字段进行减法操作。 -
hincrbyfloat key field increment:为哈希表中的字段值加上指定浮点数增量值。 -
hkeys key:获取哈希表中的所有字段(field)。 -
hlen key:获取哈希表中字段的数量。 -
hvals key:获取哈希表中所有的值。 -
hscan key cursor [match pattern] [count count]:用于迭代哈希表中的键值对。其中cursor表示游标,起始位置;[match pattern]表示匹配的方式,可以使用正则;[count count]表示指定从哈希表中返回多少元素,默认值为 10。 hash 类型常用使用场景 -
存储对象信息:可以存储一些用户信息以及一些经常变动的信息。
sets(集合)
Redis 中 set 相当于 Java 语言中的 HashSet,其内部的键值对是无序且唯一的。Redis 中 set 是通过哈希表实现的,故其添加、删除、查找的复杂度都是 O(1)。接下来我们就一起来学习管理 set 类型数据的相关命令。
➡️ set 类型数据的相关命令
sadd key member1 [member2 ...]:向集合中添加一个或多个元素,已经存在集合中的元素将被忽略。scard key:获取集合中元素的数量。sdiff key1 [key2]:返回第一个集合与其他集合中的差集,不存在集合 key 将被看作空集。注意,返回的差集来自前面的集合而不是后面的集合sdiffstore destination key1 [key2]:将给定集合中之间的差集存储在指定的集合中。如果指定的集合 key 已存在,则会被覆盖。sismember key member:判断元素是否是集合的成员smembers key:返回集合中的所有成员。smove source destination member:将一个存在的集合中的元素移动到另一个指定的集合中。
✨ 这里大家需要明确知道以下几点:
如果集合中的不存在或不包含指定移动的元素,则 `smove` 不做任何操作,仅返回 0;否则,将元素移动到指定的集合中,并且返回 1。
如果 `destination` 集合中已经包含了移动的元素,`smove` 命令只是简单的将 `source` 集合中的元素删除。
当 `destination` 和 `source` 不是集合类型时,会返回错误
spop key:移除指定集合中的一个或多个随机元素,移除后会返回移除的元素。srandmember key [count]:获取集合中一个或多个随机元素。
📖 注意:如果
count为正数且小于集合长度,则返回一个包含count个元素的数组,数组中的元素各不相同;如果count大于等于集合基数,那么返回整个集合;如果count为负数,则返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为count的绝对值。
-
srem key member1 [member2]:移除集合中一个或多个元素,如果元素不存在则被忽略。 -
sunion key1 [key2]:返回给定集合的并集。不存在的集合被看作空集。 -
sinter key1 [key2]:返回两个集合的交集。不存在的集合被看作空集。 -
sunionstore destination key1 [key2]:将集合中的并集存储在指定的集合destination中。如果destination已经存在,则将其覆盖。 -
sscan key cursor [match pattern] [count count]:用于迭代集合中的元素。其中cursor表示游标,起始位置;[match pattern]表示匹配的方式,可以使用正则;[count count]表示指定从集合中返回多少元素,默认值为 10。 set 类型常用使用场景 -
用户关注、推荐模型
比如:相互关注、我关注的人也关注了他(取交集)、可能认识的人(差集)等。
zsets(有序集合)
Redis 中的 zsets 集合和 set 集合一样,都是 string 类型元素的集合,并且都不允许元素重复。但是之间的区别是,zsets 集合的每个元素都会关联一个 double 类型分数,然后 Redis 就会通过这个分数来对集合中的元素进行从小到大排序。虽然 zset 集合中的元素不能重复,但是分数是可以重复的。接下来我们就一起来学习管理 zset 类型数据的相关命令。
➡️ zset 类型数据的相关命令
zadd key score1 member1 [score2 member2...]:向有序集合中添加一个或多个元素及其元素对应的分数。如果某个元素已经是有序集的成员,那么更新这个元素的分数值,并通过重新插入这个元素,来保证该元素在正确的位置上。这里分数值可以是整数,也可以是双精度浮点数。zrange key start stop [withscores]:返回有序集合中指定区间内的元素。其中成员的位置按分数值递增来排序(如果分数值相同的元素按字典顺序排列)。这里的下标可以正数,比如 0 表示第一个元素,1 表示第二个元素,以此类推;也可以是负数,比如 -1 表示最后一个元素,-2 表示倒数第二个元素,以此类推。zcard key:获取有序集合中元素的数量。zcount key min max:统计有序集合中指定分数区间的成员数量。zincrby key increment member:对有序集合中指定元素的分数加上增量。这里的增量可以是正数(表示增加),也是是负数(表示减少)。zinterstore destination numkeys key1 [key2...]:统计给定的一个或多个有序集合的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 集合中。默认情况下,结果集中某个成员的分数值是所有给定集合下该成员分数值之和。zlexcount key min max:统计有序集合中指定字典区间内成员的数量。zrangebylex key min max [limit offset count]:通过字典区间返回有序集合的成员。zrangebyscore key min max [withscores] [limit]:获取有序集合中指定分数区间的成员列表。其中成员按分数值递增来排序(如果分数值相同的元素按字典顺序排列)。zrangebyscore key min max [withscores] [limit]:获取有序集合中指定分数区间的成员列表。其中成员按分数值递增来排序(如果分数值相同的元素按字典顺序排列)。zrem key member [member ...]:用于移除有序集中的一个或多个成员,不存在的成员将被忽略。zremrangebylex key min max:移除有序集合中给定的字典区间的所有成员zremrangebyrank key start stop:用于移除有序集合中指定排名区间内的所有成员。zremrangebyscore key min max:用于移除有序集合中指定分数区间内的所有成员。zrevrange key start stop [withscores]:获取有序集合中指定区间内的成员。其中成员的位置按分数值递减来排序(如果分数值相同的元素按字典逆序排列)。zrevrangebyscore key max min [withscores]:获取有序集合中指定分数区间内的所有成员。其中成员的位置按分数值递减来排序(如果分数值相同的元素按字典逆序排列)。zrevrank key member:获取有序集合中成员的排名。其中有序集成员按分数值递减排序。排名以 0 为底,也就是说, 分数值最大的成员排名为 0 。zscore key member:返回有序集合中成员的分数值。如果成员元素不是有序集合 key 的成员,或 key 不存在,返回nil。zunionstore destination numkeys key1 [key2...]:统计给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到destination集合中。zscan key cursor [match pattern] [count count]:迭代有序集合中的成员(包括元素和分数)。其中cursor表示游标,起始位置;[match pattern]表示匹配的方式,可以使用正则;[count count]表示指定从集合中返回多少元素,默认值为 10。