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 valuevalue追加到字符串key的末尾

  • getrange key start end 获取字符串中的[start, end]之间的子字符串
  • setrange key start value 将字符串keystart位置开始的子字符串设置成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中的数组、ListSet,Python中的列表,元组等...

一元数据结构多用于表示一组同类型的数据,比如某篇文章的点赞用户ID列表,某个用户的最近浏览的商品ID列表...

列表#

可以理解为一个字符串类型的链表,一堆字符串被按先后顺序连接起来,同时,你可以从这个链的头和尾部快速添加和移除内容。

  • rpush key valuevalue推向列表key的右端
  • lpush key valuevalue推向列表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 valuevalue添加到集合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 itemitem从集合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 获取散列表keyfield
  • 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,即集合中元素的分数,这个分数必须是数字形式的字符串

下面我们就基于这个最近浏览列表的例子来学习有序集合:

  1. zadd key score membermember添加到有序集合key中,指定它的分数为score
  2. zrange key start end [withscore] 查看有序集合key中的[start, end]之间的数据,withscore代表连分数一起输出
  3. zrevrange key start end [withscore] zrange的倒序形式
  4. zcard key 获取有序集合key的元素数量
  5. zincrby key increment member 将有序集合key中的member的分数加上increment
  6. zcount key min max 返回有序集合key中分值在[min, max]之间的
  7. zrank key member 返回member在有序集合key中的排名
  8. zscore key member 返回member在有序集合key中的分数

有序集合的命令还有一些,不过都比较简单,这里再介绍两个命令

  1. zinterstore destination numkeys key [key...] 将给定的numkeys个有序集合做交集运算,结果存储在有序集合destination中,并且score会累加
  2. zunionstore destination numkeys key [key...] zinterstore的并集版本

其它命令#

排序#

sort还可以对集合进行排序

事务#

MULTI:开启一个事务
EXEC:提交事务

MULTIEXEC包裹的事务中的语句不可被打断,从下图中可以看到,multi后的所有语句都进入了某种队列,而非直接执行,等到exec后它们以一种原子的,不可打断的方式执行

键的过期时间#

Redis中可以设置键的过期时间,当键过期后将被自动删除

  1. expire key second 设置key在指定秒数后过期
  2. ttl key 查看key还有多少秒过期
  3. persist key 移除key的过期时间
  4. expireat key timestamp 设置key在指定的unix时间戳时过期
  5. pttl/pexpire/pexpireat 毫秒级设置

忽略掉那条exec

posted @   yudoge  阅读(66)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示
主题色彩