Redis实战——(三)Redis命令
数据结构篇#
Redis有五种基本的数据结构,可能是由于操作它们的指令太多,所以第一次见到Redis时就被它这几种数据类型搞蒙了,常常把它们搞混,不知道哪个是哪个,哪个提供什么功能。
这里,我们把Redis的数据结构分成三类来学习,希望能起到对Redis数据类型的理解和运用的帮助。
源头:字符串#
字符串在Redis中是最基本的数据类型,尽管你使用其它更加复杂的数据类型,它们其中所存储的也都是字符串。比如后面要学的列表,只不过是把一些字符串连接起来形成一批字符串,而散列表则是由一些对而字符串组成的键值对。
Redis中的字符串相当灵活,除了可以表示字符序列以外,当它的形状是一个整数时,它就可以被当作整数处理,进行整数的一些运算,当它的形状是一个浮点数时,它就可以被当作浮点数处理,进行浮点数的一些运算。
set key value
设置字符串key
的值为value
get key
获取字符串key
的值(如果没有则是nil)
incr key
如果字符串是整数的话,将它的值加一decr key
如果字符串是整数的话,将它的值减一incrby key increment
如果字符串是整数的话,将它的值加increment
decrby key decrement
如果字符串是整数的话,将它的值减decrement
incrbyfloat key increment
如果字符串是整数或浮点数的话,将它的值加increment
如果字符串已经是浮点数了,只能使用
incrbyfloat
对其进行自增自减操作
如果字符串为nil串,在进行自增自减时,当它是0,实际上
nil
也具有零值的语义
append key value
将value
追加到字符串key
的末尾
getrange key start end
获取字符串中的[start, end]之间的子字符串setrange key start value
将字符串key
从start
位置开始的子字符串设置成value
bitcount key
获得字符串key
的二进制形式中 为1的位的个数getbit key index
获得字符串key
的二进制形式中 第index
位的值
不管你的字符串是不是数字形式,它的二进制形式都和数字所代表的二进制无关,而是字符串中每个字符的二进制表示。比如上图,字符“1”转换成二进制是49,二进制是0011 0001,正和我们获取出来的一致。
setbit key index value
设置字符串key
的二进制表示中的第index
位为value
上面我们把字符“1”的二进制0011 0001换成了字符“2”的二进制0011 0010,最后得出了266.99$
一元数据结构#
一元数据结构是一种线性的数据结构,即一批字符串。我们可以使用一些其它编程语言中的概念来帮助理解它们,比如Java中的数组、List
、Set
,Python中的列表,元组等...
一元数据结构多用于表示一组同类型的数据,比如某篇文章的点赞用户ID列表,某个用户的最近浏览的商品ID列表...
列表#
可以理解为一个字符串类型的链表,一堆字符串被按先后顺序连接起来,同时,你可以从这个链的头和尾部快速添加和移除内容。
rpush key value
将value
推向列表key
的右端lpush key value
将value
推向列表key
的左端 -lrange key start end
将返回列表key
中[start, end]的值,和Python一样,负数下标i表示倒数第i个元素
lpop key
将列表key
左边的一个值弹出rpop key
将列表key
右边的一个值弹出lindex key offset
获取列表key
中的第offset
个值ltrim key start end
保留列表key
中[start, end]范围的值,其它丢弃
blpop key [key...] timeout
从第一个非空列表中弹出左端,如果在timeout秒内所有列表都是空的,阻塞timeout秒后退出brpop key [key...] timeout
同上,是右端rpoplpush source-key dest-key
从列表source-key
右端弹出一个元素,将它添加到列表dest-key
的左端lrpoplpush source-key dest-key timeout
从列表source-key
右端弹出一个元素,将它添加到列表dest-key
的左端,如果在timeout秒内源列表是空的,阻塞timeout秒后退出
上图中的
products
已经是空的了,调用blpop
的客户端将阻塞,此时打开另一个客户端,使用lpush
向其中添加元素,之前的客户端将解除阻塞
集合#
Redis中的另一个一元数据结构是集合,和集合的数学定义一样,集合保存一些不重复元素,并且多个集合之间可以方便的进行交并差运算。
对于源于字符串的redis来说,集合自然是字符串的集合
sadd key value
将value
添加到集合key
中smembers key
查看集合key
的元素srem key item [item...]
移除集合key
中的元素sismember key item
检查元素item
是否在集合key
中scard key
返回集合key
中的元素数量srandmember key count
从集合key
中随机返回count
个元素,如果count是正数不会出现重复,反之可能出现重复spop key
随机移除集合key
中的一个元素,并返回被移除的元素smove source-key dest-key item
将item
从集合source-key
中移动到集合dest-key
sdiff key [key...]
返回存在于第一个集合不存在于其它集合中的元素,相当于差集
sinter key [key...]
返回所有集合的交集sunion key [key...]
返回所有集合的并集
sdiffstore / sinterstore / sunionstore
差交并操作,并将结果保存成一个新的集合
二元数据结构#
下面介绍Redis中的二元数据结构,二元数据结构以键值对形式存在,而非一元的线性形式。
二元数据结构可以用来表示某种映射关系,比如一个字段(name)和一个值(zhangsan)的映射,比如一个文章和它创建时间的映射。
二元数据结构像一个Redis中的Redis,这句话现在来看还有点抽象,但是当用过散列表之后就会恍然大悟。
散列表#
散列表和Java中的HashMap
、Python中的字典差不多,你给它一个键,并且给它这个键映射到的值,稍后你就可以用这个键来查询这个值。
你也可以把一个散列表看作一个Java中的对象,所以你可以把一张散列表中的键看作是面向对象中对象的域(属性),可以把值看作是对象的属性值
官方有的地方把散列表的键(key)写成面向对象中的域(field),而有时又写成键(key),这里我们也会混用这两个术语,读者需要知道它们是一个意思
下面我们用散列表来记录一个用户zhangsan
的身份信息:
hset key field value
向散列表key
中添加映射,域为field
,值为value
hmset key field value [field value ...]
hset
的批量版本hget key field
获取散列表key
的field
域hmget key field [field...]
hget
的批量版本
hdel key field
删除散列表key
中的field
域hlen key
获取散列表key
的长度
hexists key field
获取散列表key
中是否存在域field
hkeys key
获取散列表key
的所有域hvals key
获取散列表key
中的所有域的值hgetall key
获取散列表中所有的键值对hincrby key field increment
将散列表key
中的field
域自增increment
hincrbyfloat key field increment
不解释
所以,散列表这种二元数据结构想不想Redis中的Redis!
有序集合(Sorted Set)#
有序集合也是一种二元数据结构,我们可以把它看作可以根据值来排序的散列表。
不过既然官方将其命名为集合,就表明官方绝对不希望我们把它当成类似散列表的方式来用,官方希望我们还是用它来保存一元的数据,不过我们可以为每一条数据携带一个值来作为它们排序的依据。
实际上,官方并没有什么一元、二元数据结构的概念,这是我为了方便记忆而分的类,读者不要以为真的有这么个东西存在。如果这种记忆方式帮助了你加强了对Redis数据结构的理解和记忆那当然是最好了,如果你觉得没什么用,那忽略它就是了。
有序集合适合存储这样的数据,下面的数据是某个用户最近浏览的商品ID列表:
product:209841 -> 1650266154
product:209820 -> 1650266168
product:209814 -> 1650266172
我们存的数据是最近浏览的商品ID列表,也就是product:xxxxxx
,而有序集合允许它携带一个值用于排序,这里的一串数字是秒级的unix时间戳,根据这个时间戳,我们能对用户最近浏览的商品列表基于时间先后来排序。这个携带的值,官方称它为score
,即集合中元素的分数,这个分数必须是数字形式的字符串。
下面我们就基于这个最近浏览列表的例子来学习有序集合:
zadd key score member
将member
添加到有序集合key
中,指定它的分数为score
zrange key start end [withscore]
查看有序集合key
中的[start, end]之间的数据,withscore
代表连分数一起输出zrevrange key start end [withscore]
zrange
的倒序形式zcard key
获取有序集合key
的元素数量zincrby key increment member
将有序集合key
中的member
的分数加上increment
zcount key min max
返回有序集合key
中分值在[min, max]之间的zrank key member
返回member
在有序集合key
中的排名zscore key member
返回member
在有序集合key
中的分数
有序集合的命令还有一些,不过都比较简单,这里再介绍两个命令
zinterstore destination numkeys key [key...]
将给定的numkeys
个有序集合做交集运算,结果存储在有序集合destination
中,并且score会累加zunionstore destination numkeys key [key...]
zinterstore
的并集版本
其它命令#
排序#
sort
还可以对集合进行排序
事务#
MULTI
:开启一个事务
EXEC
:提交事务
被MULTI
和EXEC
包裹的事务中的语句不可被打断,从下图中可以看到,multi
后的所有语句都进入了某种队列,而非直接执行,等到exec
后它们以一种原子的,不可打断的方式执行
键的过期时间#
Redis中可以设置键的过期时间,当键过期后将被自动删除
expire key second
设置key在指定秒数后过期ttl key
查看key还有多少秒过期persist key
移除key的过期时间expireat key timestamp
设置key在指定的unix时间戳时过期pttl/pexpire/pexpireat
毫秒级设置
忽略掉那条exec
作者:Yudoge
出处:https://www.cnblogs.com/lilpig/p/16159954.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎按协议规定转载,方便的话,发个站内信给我嗷~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)