redis的list数据类型相关命令介绍及使用


Posted in Redis onJanuary 18, 2022

list列表简介

  • list是简单的字符串列表(说通俗点,存储的还是字符串),按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),个列表最多可以包含^32-1个元素(每个列表超过40亿个元素)。
  • Redis中的list和Java中的LinkedList很像,底层都是一种链表结构,list的插入和删除操作非常快,时间复杂度为 0(1),不像数组结构插入、删除操作需要移动数据。像归像,但是redis中的list底层可不是一个双向链表那么简单。
  • 当数据量较少的时候它的底层存储结构为一块连续内存,称之为ziplist(压缩列表),它将所有的元素紧挨着一起存储,分配的是一块连续的内存;当数据量较多的时候将会变成quicklist(快速链表)结构。
  • 可单纯的链表也是有缺陷的,链表的前后指针prev和next会占用较多的内存,会比较浪费空间,而且会加重内存的碎片化。在redis 3.2之后就都改用ziplist+链表的混合结构,称之为quicklist(快速链表)。

常用命令

添加命令

lpush key value

从左边插入元素(将一个或多个值插入到列表头部)

127.0.0.1:6379> lpush ids 1
(integer) 1
127.0.0.1:6379> lrange ids 0 -1
1) "1"
127.0.0.1:6379> lpush ids 2
(integer) 2
127.0.0.1:6379> lrange ids 0 -1
1) "2"
2) "1"

rpush key value

从右边插入元素(将一个或多个值插入到列表的尾部(最右边))

127.0.0.1:6379> rpush ids 3
(integer) 3
127.0.0.1:6379> lrange ids 0 -1
1) "2"
2) "1"
3) "3"

linsert key BEFORE|AFTER pivot value
向某个元素前/后插入元素,返回结果为当前列表长度,注意列表不存在或者指定元素不存在列表中时,都将不执行任何操作。

//元素3前插入0
127.0.0.1:6379> linsert ids before 3 0
(integer) 4
127.0.0.1:6379> lrange ids 0 -1
1) "2"
2) "1"
3) "0"
4) "3"
//元素3后插入0
127.0.0.1:6379> linsert ids after 3 4
(integer) 5
127.0.0.1:6379> lrange ids 0 -1
1) "2"
2) "1"
3) "0"
4) "3"
5) "4"

查询命令

lrange key start end
获取列表中指定范围内的元素列表;若start值大于列表end值则返回空列表
如上已经展示过了

lindex key index
获取列表指定索引下标的元素

127.0.0.1:6379> lindex ids 0
"2"
127.0.0.1:6379> lindex ids -1
"4"

llen key
获取列表长度;列表不存在则返回0

127.0.0.1:6379> llen ids
(integer) 5

弹出/删除命令

lpop key
从列表左侧弹出元素并返回头部元素

127.0.0.1:6379> lpop ids
"2"
127.0.0.1:6379> lrange ids 0 -1
1) "1"
2) "0"
3) "3"
4) "4"

rpop key
从列表右侧弹出元素并返回尾部元素

127.0.0.1:6379> rpop ids
"4"
127.0.0.1:6379> lrange ids 0 -1
1) "1"
2) "0"
3) "3"

lrem key count value
从列表中找到等于value的元素进行删除,根据count的不同分为三种情况:
count > 0,从表头开始向表尾,移除数量为count个元素;
count < 0,从表尾开始向表头,移除数量为count的绝对值个元素;
count = 0,移除表中所有与 value 相等的值

127.0.0.1:6379> lrem ids 0 3
(integer) 1
127.0.0.1:6379> lrange ids 0 -1
1) "1"
2) "0"

ltrim key start end
对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除

127.0.0.1:6379> ltrim ids 0 0
OK
127.0.0.1:6379> lrange ids 0 -1
1) "1"

修改命令

lset key index value
修改指定下标的元素的值设置为value

127.0.0.1:6379> lset ids 0 0
OK
127.0.0.1:6379> lrange ids 0 -1
1) "0"

阻塞弹出命令

blpop key [key …] timeout
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时(单位秒)或发现可弹出元素为止

brpop key [key …] timeout
移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
演示:
开启三个reids连接窗口,第一个执行blpop ,第二个执行brpop ,第三个执行添加:
可以看到窗口1和2执行完都已经阻塞在这里,这是因为ids中没有元素

redis的list数据类型相关命令介绍及使用

redis的list数据类型相关命令介绍及使用

窗口3执行添加:lpush ids 1 2 3 4 5 6
可以看到窗口1和2立即弹出对应元素:

redis的list数据类型相关命令介绍及使用

redis的list数据类型相关命令介绍及使用

应用场景

消息队列:lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能

朋友圈的点赞列表、评论列表、排行榜:lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表。

到此这篇关于redis的list数据类型相关命令介绍及使用的文章就介绍到这了,更多相关redis list数据类型内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
基于Redis过期事件实现订单超时取消
May 08 Redis
Redis数据结构之链表与字典的使用
May 11 Redis
基于Redis实现分布式锁的方法(lua脚本版)
May 12 Redis
浅谈redis缓存在项目中的使用
May 20 Redis
redis客户端实现高可用读写分离的方式详解
Jul 04 Redis
Redis源码阅读:Redis字符串SDS详解
Jul 15 Redis
Window server中安装Redis的超详细教程
Nov 17 Redis
Redis超详细讲解高可用主从复制基础与哨兵模式方案
Apr 07 Redis
Redis基本数据类型Zset有序集合常用操作
Jun 01 Redis
Redis+AOP+自定义注解实现限流
Jun 28 Redis
如何使用注解方式实现 Redis 分布式锁
Jul 23 Redis
关于使用Redisson订阅数问题
Jan 18 #Redis
Redis中缓存穿透/击穿/雪崩问题和解决方法
linux下安装redis图文详细步骤
Springboot/Springcloud项目集成redis进行存取的过程解析
使用RedisTemplat实现简单的分布式锁
Nov 20 #Redis
redis缓存存储Session原理机制
CentOS8.4安装Redis6.2.6的详细过程
You might like
介绍一些PHP判断变量的函数
2012/04/24 PHP
php调整gif动画图片尺寸示例代码分享
2013/12/05 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
高质量PHP代码的50个实用技巧必备(下)
2016/01/22 PHP
PHP Cookei记录用户历史浏览信息的代码
2016/02/03 PHP
DWR Ext 加载数据
2009/03/22 Javascript
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
IE6下通过a标签点击切换图片的问题
2010/11/14 Javascript
jQuery实现鼠标滑过遮罩并高亮显示效果
2013/07/16 Javascript
解析offsetHeight,clientHeight,scrollHeight之间的区别
2013/11/20 Javascript
javascript实现获取服务器时间
2015/05/19 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
深入理解Vue 组件之间传值
2018/08/16 Javascript
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
vue中$refs, $emit, $on, $once, $off的使用详解
2019/05/26 Javascript
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
js实现盒子移动动画效果
2020/08/09 Javascript
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
OpenCV-Python实现轮廓检测实例分析
2018/01/05 Python
Python实现多条件筛选目标数据功能【测试可用】
2018/06/13 Python
python 多线程重启方法
2019/02/18 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
2019/06/12 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
Python使用matplotlib 模块scatter方法画散点图示例
2019/09/27 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
LivingSocial爱尔兰:爱尔兰本地优惠
2018/08/10 全球购物
销售类个人求职信范文
2013/09/25 职场文书
《小草和大树》教学反思
2014/02/16 职场文书
党员志愿者活动总结
2014/06/26 职场文书
农业项目合作意向书
2015/05/08 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书