Redis数据结构详解之List(二)
序言
思来想去感觉redis中的list没什么好写的,如果单写几个命令的操作过于乏味,所以本篇最后我会根据redis中list数据类型的特殊属性,同时对比成熟的消息队列产品rabbitmq,使用redis实现一个消息队列。
为啦让本篇更有魅力,我再介绍下redis中list的基本属性,以及为什么使用redis中list列表类型,为什么使用消息队列,为什么不用rabbitmq而使用redis实现消息队列?呢,到这里为止,如果你是大咖,大牛,大神,大爷!不要听我吹牛逼啦,Close Page and forget me ! —_—
首先回答序言中的4大疑问
1、redis中的list的基本属性?
List数据结构是链表结构,这意味这无论数据量多大,头尾操作数据还是很快的,list的容量是2的32次方减1个元素,即4294967295个元素数量。
2、为什么使用redis中的list数据类型?
依靠redis内存中操作数据的优势,又提供一些列实用独特的Api操控数据,用着简便,速度又快,又能实现特有的数据特征排序读写,做时间轴数据,评论列表,消息传递等等,又提供简便的分页,读写操作。你用不用。
3、为什么使用消息队列?
举个简单的例子,功能是这样子的,你要呈现页面给用户看,在你呈现页面之前有一个很复杂耗时的运算要操作,但是这个操作不影响页面呈现的数据,也不作为页面呈现的数据。
方案一:运算完,呈现页面。
方案二:把要计算的数据,抛到持久化的消息队列中,不做耗时的运算,直接呈现页面。然后用另外一个程序来对消息队列中的数据单独做运算。
显而易见,方案二是最佳答案,你用不用消息队列。
4、为什么不使用成熟的rabbitmq而使用redis实现的消息队列?
Rabbitmq只关注数据的先进先出,没有数据优先级的概念,假如你想给那个数据来个先处理的特权,那么不好意思,我不支持,但是rabbitmq也可以变通着来处理,就是建立多个队列用程序路由来实现这个特权功能。那么redis实现的消息队列,是可以灵活掌控的,后面做示范。
Redis中关于List列表的命令详解
1、redis中list列表的数据插入命令:lpush,rpush,linsert
127.0.0.1:6379>rpush mylist 1 ---结果为:(integer) 1
127.0.0.1:6379>rpush mylist 2 ---结果为:(integer) 2
127.0.0.1:6379>rpush mylist 3 ---rpush命令:向mylist列表中,从右边插入3条数据,返回值为当前列表的容量。结果为:(integer) 3
127.0.0.1:6379>lrange mylist 0 -1 ---lrange命令:查看mylist列表中的数据,0开始位置,-1结束位置,结束位置为-1时,表示列表的最后一个位置,即查看所有。结果为:1> "1" 2> "2" 3> "3"
127.0.0.1:6379>lpush mylist 0 ---lpush命令:向mylist列表中,从左边插入一条数据为0的数据
127.0.0.1:6379>lrange mylist 0 -1 ---结果为:1>"0" 2>"1" 3>"2" 4>"3"
127.0.0.1:6379>linsert mylist after 3 4 ---linsert命令,表达式为linsert key before|after pivot value ;这句命令的意思是在key为mylist的列表中查找值为3的数据,在其后插入一条值为4的数据。
127.0.0.1:6379>lrange mylist 0 -1 ---结果为:1>"0" 2>"1" 3>"2" 4>"3" 5>"4"
127.0.0.1:6379>linsert mylist before 0 -1 ---意思是:在key为mylist的列表中查找值为0的数据,在其前插入一条值为-1的数据。
127.0.0.1:6379>lrange mylist 0 -1 ---结果为:1>"-1" 2>"0" 3>"1" 4>"2" 5>"3" 6>"4"
127.0.0.1:6379>lisert mylist after 5 8 ---结果为:-1,由于mylist列表不存在值为5的数据,所以不执行任何操作,返回状态值-1。如果key不存在时,返回错误提示。
127.0.0.1:6379>lrange mylist 0 -1 ---结果为:1>"-1" 2>"0" 3>"1" 4>"2" 5>"3" 6>"4"
2、redis中list列表的数据删除命令:lpop,rpop
127.0.0.1:6379>lpop mylist ---lpop命令:从列表中的左边移除一条数据,同时输出被删除的数据,这里输出的结果为-1
127.0.0.1:6379>lrange mylist 0 -1 ---结果为:1>"0" 2>"1" 3>"2" 4>"3" 5>"4"
127.0.0.1:6379>rpop mylist ---rpop命令:从列表的右边移除一条数据,同时输出被删除的数据,这里输出的结果为4
127.0.0.1:6379>lrange mylist 0 -1 ---结果为:1>"0" 2>"1" 3>"2" 4>"3"
127.0.0.1:6379>ltrim mylist 1 3 ----ltrim命令:保留设定的两个下标区间的值,删除不在其区间的所有值。1为开始保留的下标值,3为结束保留的下标值。
127.0.0.1:6379>lrange mylist 0 -1 ---结果为:1>"1" 2>"2" 3>"3"
3、redis中list列表的数据查看命令:lrange,llen,lindex
127.0.0.1:6379>llen mylist ---llen命令:返回列表的长度,这里mylist只剩下4条数据,故输出结果为4
127.0.0.1:6379>lindex mylist 3 ---lindex命令:获取给定位置的数据,这里坐标为3的数据是"2",所以结果为2.
4、redis中list列表数据修改命令:lset
127.0.0.1:6379>lset mylist 2 zlh ---lset命令:把下标为2的值设置为zlh,如果下标值超出范围或对一个空list列表进行lset,那么将返回一个错误提示
127.0.0.1:6379>lrange mylist 0 -1 ---结果为: 1>"1" 2>"2" 3>"zlh"
5、redis中list列表,两个列表A,B,将A列表的尾元素添加到B列表的头元素中,命令:rpoplpush
#这里我有连个列表A数据为{1,2,3} ,B列表数据为{4,5,6}
127.0.0.1:6379>rpoplpush A B
127.0.0.1:6379>lrange A ---结果为:1>"1' 2>"2"
127.0.0.1:6379>lrange B ---结果为:1>"3' 2>"4" 3>"5" 4>"6"
6、redis中的几个带阻塞的高级命令:blpop,brpop,brpoplpush
127.0.0.1:6379>blpop A 30 ---意思是:A列表有值的话,从左边移除一个数据,如果没有值的话,则等待A中插入数据为止,等待时间为30秒,如果时间设置为0表示阻塞时间无限延长
127.0.0.1:6379>blpop B30 ---意思是:A列表有值的话,从左边移除一个数据,如果没有值的话,则等待A中插入数据为止,等待时间为30秒,如果时间设置为0表示阻塞时间无限延长
127.0.0.1:6379>brpoplpush A B 30 ---意思是:将A列表的尾元素添加到B列表的头元素中,如果A列表中有值则插入,如果没值,则等待A中插入数据为止,等待时间为30秒,如果时间设置为0表示阻塞时间无限延长
Redis实现消息队列,并自带优先级功能
1、首先redis中的list是链表结构,具备消息队列中的先进先出特征。
2、从上面的几个高级命令中可以看出,list有几个自带阻塞功能,时间设置为0,可以视为永不休息的监听进程。
实现:
1、说啦以上两点我想你应该有想法啦。
2、对不起有点晚啦,明天还要上班,还要陪媳妇去吃个麻辣烫,回来睡觉啦,这里已经不难理解与实现啦,如需沟通交流学习,进左上角群,对不住啦,88,晚安。
Redis数据结构详解之List(二)的更多相关文章
- 5种Redis数据结构详解
本文主要和大家分享 5种Redis数据结构详解,希望文中的案例和代码,能帮助到大家. 转载链接:https://www.php.cn/php-weizijiaocheng-388126.html 2. ...
- redis数据结构详解之Hash(四)
序言 Hash数据结构累似c#中的dictionary,大家对数组应该比较了解,数组是通过索引快速定位到指定元素的,无论是访问数组的第一个元素还是最后一个元素,所耗费的时间都是一样的,但是数组中的索引 ...
- Redis数据结构详解,五种数据结构分分钟掌握
redis数据类型分为:字符串类型.散列类型.列表类型.集合类型.有序集合类型.redis这么火,它运行有多块?一台普通的笔记本电脑,可以在1秒钟内完成十万次的读写操作.原子操作:最小的操作单位,不能 ...
- Redis数据结构详解之Zset(五)
序言 Zset跟Set之间可以有并集运算,因为他们存储的数据字符串集合,不能有一样的成员出现在一个zset中,但是为什么有了set还要有zset呢?zset叫做有序集合,而set是无序的,zset怎么 ...
- Redis数据结构详解之Set(三)
序言 在Redis中,Set和list都是字符串序列,非常相似,不同之处在于Set是用哈希表来保持字符串的唯一性,没有先后顺序,不像list一样,可以在首尾增删数据.但是set也有自己的相应处理命令来 ...
- Redis数据结构详解(一)
前言 Redis和Memcached最大的区别,Redis 除啦支持数据持久化之外,还支持更多的数据类型而不仅仅是简单key-value结构的数据记录.Redis还支持对这些数据类型做更多的服务端操作 ...
- Redis数据结构详解(2)-redis中的字典dict
前提知识 字典,又被称为符号表(symbol table)或映射(map),其实简单地可以理解为键值对key-value. 比如Java的常见集合类HashMap,就是用来存储键值对的. 字典中的键( ...
- Redis数据结构详解(1)-redis中的字符串(SDS)
前提知识 我们先从百科上摘下Redis的解释: Redis是一个使用ANSI C编写的开源.支持网络.基于内存.分布式.可选持久性的键值对存储数据库. (不用过多在意ANSI,它只是一个标准,你可以理 ...
- redis 五种数据结构详解(string,list,set,zset,hash)
redis 五种数据结构详解(string,list,set,zset,hash) Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存 ...
随机推荐
- H5坦克大战之【建造敌人的坦克】
公司这几天在准备新版本的上线,今天才忙里偷闲来写这篇博客.接着上一篇的"H5坦克大战之[玩家控制坦克移动2]"(http://www.cnblogs.com/zhouhuan/ ...
- DailyTick 开发实录 —— 开始
2009 年我读了李笑来老师的<把时间当朋友>,知识了柳比歇夫的时间记录法.当时激动坏了,马上动手实践起来.一开始的时候,是用一个小本子,走到哪儿都带着.完成一件事,就记录一下花费的时间. ...
- 搞个这样的APP要多久?
这是一个“如有雷同,纯属巧合”的故事,外加一些废话,大家请勿对号入座.开始了…… 我有些尴尬地拿着水杯,正对面坐着来访的王总,他是在别处打拼的人,这几年据说收获颇丰,见移动互联网如火如荼,自然也想着要 ...
- 富文本编辑器Simditor的简易使用
最近打算自己做一个博客系统,并不打算使用帝国cms或者wordpress之类的做后台管理!自己处于学习阶段也就想把从前台到后台一起谢了.好了,废话不多说了,先来看看富文本编辑器SimDitor,这里是 ...
- Centos 下 mysql root 密码重置
重置mysql密码的方法有很多,官网也提供了很方便的快捷操作办法,可参考资料 resetting permissions .本文重置密码的具体步骤如下: 一.停止MySQL(如果处于运行状态) #se ...
- springMVC初探--环境搭建和第一个HelloWorld简单项目
注:此篇为学习springMVC时,做的笔记整理. MVC框架要做哪些事情? a,将url映射到java类,或者java类的方法上 b,封装用户提交的数据 c,处理请求->调用相关的业务处理—& ...
- [原]一个针对LVS的压力测试报告
LVS 测试报告 测试计划 基本功能测试 流量压力测试 响应时间测试 配置正确性测试 灾难恢复测试 测试点 基本功能测试 客户端IP地址正确性 RealServer 访问Internet测试(包括Ip ...
- 微信小程序IDE(微信web开发者工具)安装、破解手册
1.IDE下载 微信web开发者工具,本人是用的windows 10 x64系统,用到以下两个版本的IDE安装工具与一个破解工具包: wechat_web_devtools_0.7.0_x64.exe ...
- ActiveRecord模式整理
DAO Data Access Object,数据访问对象 DAO是一个软件设计的指导原则,在核心J2EE模式中是这样介绍DAO模式的:为了建立一个健壮的J2EE应用,应该将所有对数据源的访问操作抽象 ...
- android手机登录时遇到“QQ安全登录发现病毒”解决
android手机作为开源系统非常容易感染病毒,有时候我们会经常遇到手机QQ登录时检测到app被感染,一般情况是由手机感染病毒所引起的,安装腾讯管家后只能检测病毒和卸载感染病毒的软件,不能清除病毒.解 ...