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,晚安。

时间: 2024-10-22 22:03:47

Redis数据结构详解之List(二)的相关文章

redis数据结构详解之Hash(四)

序言 Hash数据结构累似c#中的dictionary,大家对数组应该比较了解,数组是通过索引快速定位到指定元素的,无论是访问数组的第一个元素还是最后一个元素,所耗费的时间都是一样的,但是数组中的索引却没有实际意义,他只是一个位置而已.而我们在查找某个元素时,一般都会使用有意义的字段来做索引,这就产生啦dictionary.其实dictionary的实现,就是让key跟下标索引有一定的关系,所实现的,让他的查找算法复杂度变为常数O(1). 扯完上面的蛋,我来说下今天要说redis中的Hash命令

Redis数据结构详解,五种数据结构分分钟掌握

redis数据类型分为:字符串类型.散列类型.列表类型.集合类型.有序集合类型.redis这么火,它运行有多块?一台普通的笔记本电脑,可以在1秒钟内完成十万次的读写操作.原子操作:最小的操作单位,不能继续拆分.即最小的执行单位,不会被其他命令插入.高并发下不存在竞态条件.KEY的命名:一个良好的建议是article:1:title来存储ID为1的文章的标题.一.前言.1.获取key的列表:KEYS pattern 通配符有?*[]和转义\2.key是否存在: EXISTS key 存在返回1,不

Redis数据结构详解之Set(三)

序言 在Redis中,Set和list都是字符串序列,非常相似,不同之处在于Set是用哈希表来保持字符串的唯一性,没有先后顺序,不像list一样,可以在首尾增删数据.但是set也有自己的相应处理命令来完成对自己的操作.下面我们来看下Set的命令怎么使用. 操作单个set的命令 redis中set列表的新增命令Sadd,key值相同下的value值不能重复,返回插入的数据个数,key后面可跟多个value值 127.0.0.1:6379>sadd mySet 1   ---添加key为mySet的

Redis数据结构详解(一)

前言 Redis和Memcached最大的区别,Redis 除啦支持数据持久化之外,还支持更多的数据类型而不仅仅是简单key-value结构的数据记录.Redis还支持对这些数据类型做更多的服务端操作,从而也能减少网路的IO次数与数据体积,这里也比Memcached要方便与高效,只针对这一点啊,想喷的左上角群喷.上篇吹牛逼20分钟教你做memcached大神 Redis主要支持的数据类型有5种:String ,Hash ,List ,Set ,和 Sorted Set. 下面我针对Redis支持

【转】Redis内部数据结构详解——ziplist

本文是<Redis内部数据结构详解>系列的第四篇.在本文中,我们首先介绍一个新的Redis内部数据结构--ziplist,然后在文章后半部分我们会讨论一下在robj, dict和ziplist的基础上,Redis对外暴露的hash结构是怎样构建起来的. 我们在讨论中还会涉及到两个Redis配置(在redis.conf中的ADVANCED CONFIG部分): hash-max-ziplist-entries 512 hash-max-ziplist-value 64 本文的后半部分会对这两个配

【转】Redis内部数据结构详解 -- skiplist

本文是<Redis内部数据结构详解>系列的第六篇.在本文中,我们围绕一个Redis的内部数据结构--skiplist展开讨论. Redis里面使用skiplist是为了实现sorted set这种对外的数据结构.sorted set提供的操作非常丰富,可以满足非常多的应用场景.这也意味着,sorted set相对来说实现比较复杂.同时,skiplist这种数据结构对于很多人来说都比较陌生,因为大部分学校里的算法课都没有对这种数据结构进行过详细的介绍.因此,为了介绍得足够清楚,本文会比这个系列的

[转]Redis内部数据结构详解-sds

本文是<Redis内部数据结构详解>系列的第二篇,讲述Redis中使用最多的一个基础数据结构:sds. 不管在哪门编程语言当中,字符串都几乎是使用最多的数据结构.sds正是在Redis中被广泛使用的字符串结构,它的全称是Simple Dynamic String.与其它语言环境中出现的字符串相比,它具有如下显著的特点: 可动态扩展内存.sds表示的字符串其内容可以修改,也可以追加.在很多语言中字符串会分为mutable和immutable两种,显然sds属于mutable类型的. 二进制安全(

CentOS7/RHEL7安装Redis步骤详解

CentOS7/RHEL7安装Redis步骤详解 CentOS7/RHEL7安装Redis还是头一次测试安装了,因为centos7升级之后与centos6有比较大的区别了,下面我们就一起来看看CentOS7/RHEL7安装Redis步骤详解 方法一:使用命令安装(前提是已经安装了EPEL). 安装redis: yum -y install redis 启动/停止/重启 Redis启动服务:1systemctl start redis.service停止服务: systemctl stop red

Python中的高级数据结构详解

这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考下 数据结构 数据结构的概念很好理解,就是用来将数据组织在一起的结构.换句话说,数据结构是用来存储一系列关联数据的东西.在Python中有四种内建的数据结构,分别是List.Tuple.Dictionary以及Set.大部分的应用程序不需要其他类型的数据结构,但若是真需要也有很多高级数据结构可供选择