Redis 的五种数据类型命令操作

摘要:redis 的五种数据类型命令操作,key,string、hash、list、set、sorted set 等数据类型的常用命令,以及一些数据类型在使用命令的一些注意。

文章锚点

keystringhashlistsetsorted set


redis key 的命名问题

因为 redis 是基于 key => value 的存储,所以我们要对 key 起一个好名字。

与 mysql 等关系型数据库不同的是,redis 没有命令空间,而且也没有对键名有强制要求(除了不能使用一些特殊字符)。但设计合理的键名,有利于防止键冲突和项目的可维护性,比较推荐的方式是使用“业务名:对象名:id:[属性]”作为键名(也可以不是分号)。例如 mysql 的数据库名为 s,用户表名为 user,那么对应的键可以用"vs:user:1","vs:user:1:ame"来表示,如果当前 redis 只被一个业务使用,甚至可以去掉“vs:”。如果键名比较长,例如“user:{uid}:friends:messages:{mid}”,可以在能描述键含义的前提下适当减少键的长度,例如变为“u:{uid}:fr:m:mid}”,从而减少由于键过长的内存浪费。


key:https://www.runoob.com/redis/redis-keys.html

keys *			|	返回所有的 key,当数据库中 key 数量很多时,不要使用此命令,有可能会卡死。
keys k*			|	模糊匹配,返回所有以 k 开头的 key。
dbsize 			|	返回所有数据库中 key 的总数。
exists key 		|	检测数据库中的 key 是否存在,存在返回 1 不存在返回 0。
expire key 5	|	给 key 设置 5 秒后过期,返回 1。
ttl key 		|	返回 key 的过期时间 >0 过期时间 -1 没有设置过期时间 -2 键不存在。
type key 		|	查看 key 设置的数据类型,返回 string、list、hash、set...。
del key			|	删除 k1,也可以删除多个 key,del k1 k2 k3...,返回删除的 key 个数,删除一个不存在的 key,会返回 0。
flushall		|	删除所有的 key,返回 OK。
strlen key		|	获取 key 的长度。


string:https://www.runoob.com/redis/redis-strings.html

首先键都是字符串类型,而且其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习奠定基础。

# 给 key 设置值
set key value [ex seconds] [px milliseconds] [nx|xx]
    ex seconds:为键设置秒级过期时间。
    px milliseconds:为键设置毫秒级过期时间。
    nx:键必须不存在,才可以设置成功,用于添加。
    xx:与nx相反,键必须存在,才可以设置成功,用于更新。
    
setex、setnx 和 set 的 ex、nx 选项一样。

# 设置多个值,只能设置 key、value,无法和 set 一样拥有其它选项
mset k1 v1 k2 v2 ...... 
# 设置值,并返回原值,getset 和 set 一样会设置值,但是不同的是,它同时会返回键原来的值
getset key value
# 设置指定位置字符
setrange key offeset value

# 获取单个 key,不存在返回 (nil)
get key
# 获取多个 key,碰见不存在的 key 返回 (nil)
mget k1 k2 k3 ......
# 获取部分字符串
getrange key start end

# 计数,值不是整数,返回错误;值是整数,返回自增后结果;键不存在,按照值为 0 自增,返回 1;
incr key
# 自减
decr key
# 自增指定数字
incrby key 2
# 自减指定数字
decrby key 2
# 自增浮点数
incrbyfloat key 6.8

# 追加数据
append key value


hash:https://www.runoob.com/redis/redis-hashes.html

redis 本来就是 key => value 形式,但是 hash 数据类型又是键值对结构,只不过是 hash 这种键值对映射关系,我们叫作 field => value,注意这里的 value 是指 field 对应的值,不是键对应的值,请注意 value 在不同上下文的作用。

# 设置值
hset key field value
# 获取值,如果键或 field 不存在,会返回 nil
hget key filed

# 批量设置值
hmset key field1 value1 field2 value2......
# 批量获取 field
hmget key field1 field2 field3......
# 获取所有 field
hkeys key
# 获取所有value
hvals key
# 获取所有 field value,如果生产环境哈希元素比较多,会存在阻塞 redis 的可能,如果一定要获取全部 field value,可以使用 hscan 命令,该命令会渐进式遍历哈希类型
hgetall key

# 删除 field,也可以删除多个 hdel key field1 field2 field3......
hdel key field

#计算 field 个数
hlen key

# 判断 field 是否存在
hexists key field

# 对 field 下面的 value 增加指定数字
hincrby key field increment 

# 对 field 下面的 value 增加指定浮点数
hincrbyfloat key field increment 

# 计算field 下面的 value 的字符串长度(需要 redis3.2 以上)
hstrlen key field


list:https://www.runoob.com/redis/redis-lists.html

列表是一种比较灵活的数据结构,它可以充当栈和队列的角色。

列表类型有两个特点:第一、列表中的元素是有序的,这就意味着可以通过索引下标获取某个元素或者某个范围内的元素列表。第二、列表中的元素可以是重复的。

# 从右边插入元素
rpush key value [value ...]
# 从左边插入元素
lpush key value [value ...]
# 向某个元素前和后插入元素
linsert key before|after pivot value

# 从左到右获取所有元素,:第一,索引下标从左到右分别是 0 到 N-1,但是从右到左分别是 -1 到 -N。第二,lrange 中的 end 选项包含了自身
lrange listkey start end
# 获取列表指定索引下标
lindex key index
# 获取列表长度
llen key

# 从列表左侧弹出
lpop key
# 从列表右侧弹出
rpop key

# 删除指定元素
lrem key count value
    count>0,从左到右,删除最多count个元素。
    count<0,从右到左,删除最多count绝对值个元素。
    count=0,删除所有。

 # 按照索引范围修剪列表 
ltrim key start end

# 修改指定索引下标的元素
lset key index newValue


set:https://www.runoob.com/redis/redis-sets.html

集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。

# 添加元素,返回结果为添加成功的元素个数,集合中无法添加相同的元素,虽然 redis 不会报错,但是返回是 0,代表插入成功 0 个元素
sadd key element [element ...]

# 删除元素,返回结果为成功删除元素个数
srem key element [element ...]

# 计算元素个数,scard的时间复杂度为 O(1),它不会遍历集合所有元素,而是直接用 redis 内部的变量
scard key

# 判断元素是否在集合中,在集合内返回 1,反之返回 0
sismember key element

# 随机从集合返回指定个数元素,[count] 是可选参数,如果不写默认为 1
srandmember key [count]
# 从集合随机弹出元素,需要注意的是 edis 从 3.2 版本开始,spop 也支持 [count] 参数
spop key
# 获取所有元素
smembers key

# 求多个集合的交集
sinter key [key ...]
# 求多个集合的并集
suinon key [key ...]
# 求多个集合的差集
sdiff key [key ...]


sorted set:https://www.runoob.com/redis/redis-sorted-sets.html

它保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数(score)作为排序的依据。有序集合中的元素不能重复,但是 score 可以重复,就和一个班里的同 132 学学号不能重复,但是名字可以相同。

有序集合相比集合提供了排序字段,但是也产生了代价,zadd 的时间复杂度为 O(log(n)),sadd 的时间复杂度为 O(1)。

# 添加成员,返回结果代表成功添加成员的个数
zadd key [NX|XX] [CH] [INCR] score member [score member ...] 
    redis3.2 为zadd 命令添加了 nx、xx、ch、incr 四个选项。
    nx:member必须不存在,才可以设置成功,用于添加。
    xx:member必须存在,才可以设置成功,用于更新。
    ch:返回此次操作后,有序集合元素和分数发生变化的个数。
    incr:对score做增加,相当于后面介绍的zincrby。
    
# 计算成员个数  
zcard key
# 计算某个成员的分数
zscore key member

# 计算成员排名,从低到高
zrank key member
# 计算成员排名,从高到低
zrevrank key member

# 删除成员
zrem key member [member ...]

# 给指定成员增加某数字
zincrby key increment member

# 返回指定范围成员排名,从低到高
zrange key start end [withscores]

# 返回指定范围成员排名,从高到低
zrevrange key start end [withscores]


参考资料:

Redis 命令手册

Redis 命令参考

结束语:感谢您对本网站文章的浏览,欢迎您的分享和转载,但转载请说明文章出处。
Top