Redis实战——(三)Redis命令
数据结构篇
Redis有五种基本的数据结构,可能是由于操作它们的指令太多,所以第一次见到Redis时就被它这几种数据类型搞蒙了,常常把它们搞混,不知道哪个是哪个,哪个提供什么功能。
这里,我们把Redis的数据结构分成三类来学习,希望能起到对Redis数据类型的理解和运用的帮助。
源头:字符串
字符串在Redis中是最基本的数据类型,尽管你使用其它更加复杂的数据类型,它们其中所存储的也都是字符串。比如后面要学的列表,只不过是把一些字符串连接起来形成一批字符串,而散列表则是由一些对而字符串组成的键值对。
Redis中的字符串相当灵活,除了可以表示字符序列以外,当它的形状是一个整数时,它就可以被当作整数处理,进行整数的一些运算,当它的形状是一个浮点数时,它就可以被当作浮点数处理,进行浮点数的一些运算。
set key value设置字符串key的值为valueget key获取字符串key的值(如果没有则是nil)

incr key如果字符串是整数的话,将它的值加一decr key如果字符串是整数的话,将它的值减一incrby key increment如果字符串是整数的话,将它的值加incrementdecrby key decrement如果字符串是整数的话,将它的值减decrementincrbyfloat 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,值为valuehmset 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中是否存在域fieldhkeys key获取散列表key的所有域hvals key获取散列表key中的所有域的值hgetall key获取散列表中所有的键值对hincrby key field increment将散列表key中的field域自增incrementhincrbyfloat 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中,指定它的分数为scorezrange key start end [withscore]查看有序集合key中的[start, end]之间的数据,withscore代表连分数一起输出zrevrange key start end [withscore]zrange的倒序形式zcard key获取有序集合key的元素数量zincrby key increment member将有序集合key中的member的分数加上incrementzcount 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


浙公网安备 33010602011771号