侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Redis列表类型的常用命令小结

Redis  /  管理员 发布于 5年前   364

列表类型介绍

列表类型也是一个我们很长要用到的一个类型。比如我们发博客,要用到博客列表。如果没有列表我们就只能遍历键来获取所有文章或一部分文章了,这个语法是keys,但是这个命令需要遍历数据库中的所有键,处于性能方面的考虑,在生产环境是不推荐使用的。

列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加、删除、获取元素,或者某个片段。在redis中,实际上是使用双向链表的方式实现的,所以在列表两端添加删除元素的时间复杂度是O(1),获取的元素越接近两端,速度越快。但是通过索引访问元素就会很慢,尤其是列表很长的时候。但是如果只是获得队列开头或结尾的前多少个元素,这个就和队列长度无关了。所以这里队列非常适合我们的评论功能,以及一些新鲜事等功能的开发,记录日志也很好用。

1、增加元素命令

向列表两端添加元素:

redis> lpush key value [value ...]redis> rpush key value [value ...]

这里也很容易明白,lpush的l是left,向列表左边添加元素,r自然就是right右边的意思了。  (lpush,rpush 类似于操作队列,往左边push,往右边push)

C:\Program Files\Redis>redis-cli.exe127.0.0.1:6379> keys *(empty list or set)127.0.0.1:6379> lpush mylist 0(integer) 1127.0.0.1:6379> rpush mylist 1(integer) 2127.0.0.1:6379> lpush mylist -1 -2(integer) 4127.0.0.1:6379> lrange mylist 0 -11) "-2"2) "-1"3) "0"4) "1"

返回值是列表的长度。这里push的值可以是多个,但是有一点要说明一下。像是上面这样左边push了两个值-1、-2,实际上现在列表的值是这样排序的,-2、-1、0、1,所以就算是同时push多个,实际上也是一个一个插入列表的,只不过这些操作都会是原子的。

2、弹出元素命令

redis> lpop keyredis> rpop key

这里就很好理解了,分别是从左弹出,从右弹出,返回值是弹出的值。(弹出的意思就是把值移除并返回值)

127.0.0.1:6379> lrange mylist 0 -11) "-2"2) "-1"3) "0"4) "1"127.0.0.1:6379> lpop mylist"-2"127.0.0.1:6379> rpop mylist"1"127.0.0.1:6379> lrange mylist 0 -11) "-1"2) "0"

综合上面四条命令,可以实现栈和队列了。

栈:lpush和lpop或者使用rpush和rpop。

队列:lpush和rpop或者使用rpush和lpop。

3、获取列表中元素的个数

redis> llen key

当键不存在是返回0,这个如果一路学下来都可以猜到了。这里redis执行这条命令的时间复杂度是O(1),不像关系型数据库中的O(N)。

127.0.0.1:6379> llen mylist(integer) 2

4、获取列表片段

redis> lrange key start stop

lrange命令比较常用,返回从start到stop的所有元素的列表,start和stop都是从0开始。

127.0.0.1:6379> lrange mylist 0 -11) "-1"2) "0"

lrange还支持负值索引,这里是负值大家可以把负号加值直接理解成从从右数第多少个。

例如现在numbers的值是-2、-1、0、1,我们要是执行lrange numbers -2 -1,就会得到最后两个值。还有lrange numbers 0 -1是我们常用的用来获取全部列表的命令。

这里有两点要注意一下:

    (1)如果start索引比stop索引位置靠后(这里说的是位置,不是索引值的大小),则会返回空列表(empty list or set)。

    (2)如果stop大于实际的索引范围,则会返回列表最后变的元素。

5、删除列表中指定值

redis> lrem key count value

lrem命令会删除列表中前count个值为value的元素,返回实际删除的元素个数。实际count大小不同,执行方式不同。

     (1)count > 0:从列表左边开始删除前count个值为value的元素

     (2)count < 0:从右边开始删除

     (3)count = 0:删除所有

返回值是删除值的个数。

6、获得/设置指定索引的元素值

redis> lindex key indexredis> lset key index value

这里应该很好理解了,特殊说明一下index如果是负值的话就是从右边开始计算索引,和lrange的负值是一个意思。

127.0.0.1:6379> lrange mylist 0 -11) "0"2) "-1"3) "-2"4) "-3"127.0.0.1:6379> lindex mylist 0"0"127.0.0.1:6379> lindex mylist 3"-3"127.0.0.1:6379> lindex mylist -1"-3"

7、只保留列表中指定的片段

redis> ltrim key start end

这里也不做特殊说明了。

127.0.0.1:6379> lrange mylist 0 -11) "0"2) "-1"3) "-2"4) "-3"127.0.0.1:6379> lindex mylist 0"0"127.0.0.1:6379> lindex mylist 3"-3"127.0.0.1:6379> lindex mylist -1"-3"127.0.0.1:6379> ltrim mylist 0 2OK127.0.0.1:6379> lrange mylist 0 -11) "0"2) "-1"3) "-2"

8、向列表中插入元素

现在我们列表中的值是0,-1,-2

redis> linsert key before|after pivot value
127.0.0.1:6379> linsert mylist before 0 1(integer) 4 //在0值前面插入1127.0.0.1:6379> lrange mylist 0 -11) "1"2) "0"3) "-1"4) "-2"127.0.0.1:6379> linsert mylist after 1 1(integer) 5 //在值为1的后面插入1127.0.0.1:6379> lrange mylist 0 -11) "1"2) "1"3) "0"4) "-1"5) "-2"127.0.0.1:6379> linsert mylist after -1 -1.5(integer) 6 //在值为-1的后面插入-1.5127.0.0.1:6379> lrange mylist 0 -11) "1"2) "1"3) "0"4) "-1"5) "-1.5"6) "-2"

现在列表中的值为1,1,0,-1,-1.5,-2 。linsert命令会先从列表中查找值为pivot的元素,然后根据是before还是after在前或是后添加元素。

9、将元素从一个列表转储到另一个列表

redis> rpoplpush source destination

这个命令非常有意思,先执行rpop再执行lpush。这个命令会先从source右边弹出一个元素插入到destination列表的左边,并返回这个元素的值。整个过程同样是原子的。

总结

到这里我们列表类型的命令就都介绍完了,是不是很简单呢~希望这篇文章对大家的学习或者工作能带来一定的帮助,如果有问题大家可以留言交流。


  • 上一条:
    redis列表类型
    下一条:
    Redis利用Pipeline加速查询速度的方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在Redis中能实现的功能、常见应用介绍(0个评论)
    • 2024年Redis面试题之一(0个评论)
    • 在redis缓存常见出错及解决方案(0个评论)
    • 在redis中三种特殊数据类型:地理位置、基数(cardinality)估计、位图(Bitmap)使用场景介绍浅析(2个评论)
    • Redis 删除 key用 del 和 unlink 有啥区别?(1个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2017-12
    • 2020-03
    • 2020-05
    • 2021-04
    • 2022-03
    • 2022-05
    • 2022-08
    • 2023-02
    • 2023-04
    • 2023-07
    • 2024-01
    • 2024-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客