设为首页 收藏本站
查看: 1176|回复: 0

[经验分享] redis 学习笔记2--List

[复制链接]

尚未签到

发表于 2016-12-18 09:48:43 | 显示全部楼层 |阅读模式
  LIST 整体结构图
  图画的太大了,只能放地址:
  http://dl.iyunv.com/upload/picture/pic/115935/8e96f42d-3a7b-3cea-85ae-997496aa9521.jpg
  LIST列表的操作,可想而知,对于列表我们需要的具备的功能列表
  加入列表:
  从头部加入   LPUSH 
  从底部加入   RPUSH
  弹出列表
  从头部弹出   LPOP
  从底部弹出   RPOP
  截取子列表     LRANGE
  计算列表的长度 LLEN
  实践:
  redis 127.0.0.1:6379> rpush l2 1     // 从底部添加一个元素
  (integer) 1
  redis 127.0.0.1:6379> rpush l2 2 
  (integer) 2
  redis 127.0.0.1:6379> lrange l2 0 -1 // 展示所有的元素  -1 代表所有
  1) "1"
  2) "2"
  redis 127.0.0.1:6379> lpush l2 3 
  (integer) 3
  redis 127.0.0.1:6379> lrange l2 0 -1 
  1) "3"
  2) "1"
  3) "2"
  redis 127.0.0.1:6379> lpop l2       // 从头部弹出一个元素
  "3"
  redis 127.0.0.1:6379> rpop l2       // 从尾部弹出一个元素
  "2"
  redis 127.0.0.1:6379> llen l2       // 计算队列的长度
  (integer) 1
  扩展
  1.1 LPUSHX  当且队列存在的情况下 在头部插入数据 
  LPUSHX key value
  实践:
  redis 127.0.0.1:6379> LLEN empty1            
  (integer) 0
  redis 127.0.0.1:6379> lpushx empty1 hh    // 将数据推入一个空的队列,结果失败
  (integer) 0
  redis 127.0.0.1:6379> lpush l3 hh 
  (integer) 1
  redis 127.0.0.1:6379> lpushx l3 hh2      // 将数据推入一个存在的队列头部,成功
  (integer) 2
  redis 127.0.0.1:6379> lrange l3 0 -1 
  1) "hh2"
  2) "hh"
  1.2 RPUSHX 当且队列存在的情况下 在尾部插入数据  基本同LPUSHX
  redis 127.0.0.1:6379> rpushx empty1 hh3    // 尝试将数据推入不存在队列的尾部,失败。
  (integer) 0
  redis 127.0.0.1:6379> rpushx l3 hh3        // 将数据推入存在队列的尾巴,成功。
  (integer) 3
  redis 127.0.0.1:6379> lrange l3 0 -1
  1) "hh2"
  2) "hh"
  3) "hh3"
  1.3 BLPOP 对于LPOP的扩展 ,阻塞式的获取数据
  BLPOP key [key ...] timeout
  它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。
  当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。
  假设现在有三个队列 job 为空 , command  request 不为空 。那么就开始轮训所有的key ,若是空,则跳过 。执行顺序为 job ==> command ==> request
  实践:
  redis 127.0.0.1:6379> del job 
  (integer) 0
  redis 127.0.0.1:6379> lpush command hh 
  (integer) 1
  redis 127.0.0.1:6379> lpush request kk 
  (integer) 1
  redis 127.0.0.1:6379> blpop job command kk 
  (error) ERR timeout is not an integer or out of range
  redis 127.0.0.1:6379> blpop job command kk  100 
  1) "command"
  2) "hh"
  redis 127.0.0.1:6379>
  查看其是如何阻塞的
  在第一个图片中,上面那个终端一直阻塞着。
DSC0000.jpg

  在第二个终端中输入数据后,上面终端取得数据并返回。
DSC0001.jpg

  1.4 BRPOP 对于rpop的扩展,原理基本同BLPOP
  2.LREM
  语法:LREM key count value
  释义:根据参数 count 的值,移除列表中与参数 value 相等的元素。
  count 的值可以是以下几种:
  count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
  count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
  count = 0 : 移除表中所有与 value 相等的值。
  实践:
  redis 127.0.0.1:6379> lpush l1 hello 
  (integer) 1
  redis 127.0.0.1:6379> lpush l1 world 
  (integer) 2
  redis 127.0.0.1:6379> lpush l1 hello 
  (integer) 3
  redis 127.0.0.1:6379> lpush l1 world 
  (integer) 4
  redis 127.0.0.1:6379> lpush l1 hello 
  (integer) 5
  redis 127.0.0.1:6379> lrange l1 0 -1 
  1) "hello"
  2) "world"
  3) "hello"
  4) "world"
  5) "hello"
  redis 127.0.0.1:6379>                       // 数据准备完成
  redis 127.0.0.1:6379> lrem l1 2 hello      // 从头部开始扫描,移除了两个hello 
  (integer) 2
  redis 127.0.0.1:6379> lrem l1 -1 hello     // 从尾部开始扫描,移除了一个hello
  (integer) 1
  redis 127.0.0.1:6379> lrange l1 0 -1       // 现在只剩下 world了
  1) "world"
  2) "world"
  redis 127.0.0.1:6379> lrem l1 0 world     // 移除队中所有的world 
  (integer) 2
  redis 127.0.0.1:6379> lrange l1 0 -1      // 已经被清空了。
  (empty list or set)
  redis 127.0.0.1:6379> 
  3.LSET
  语法:LSET key index value
  释义:将列表 key 下标为 index 的元素的值设置为 value 。
  实践:
  redis 127.0.0.1:6379> lpush l1 hello 
  (integer) 1
  redis 127.0.0.1:6379> lpush l1 world 
  (integer) 2
  redis 127.0.0.1:6379> lset l1 1  ---      // 下标为1的数据被替换成 --- 了
  OK
  redis 127.0.0.1:6379> lrange l1 0 -1
  1) "world"
  2) "---"
  redis 127.0.0.1:6379> lset l1 3 hh       // 超出下标进行设置的话,报错
  (error) ERR index out of range
  redis 127.0.0.1:6379> exist l2 
  (error) ERR unknown command 'exist'
  redis 127.0.0.1:6379> exists l2          // 对不存在的队列进行设置的话,报错
  (integer) 0
  redis 127.0.0.1:6379> lset l2 0 hh 
  (error) ERR no such key
  redis 127.0.0.1:6379> 
  4 LTRIM
  语法:LTRIM key start stop
  释义:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
  超出范围的下标值不会引起错误。
  如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大,或者 start > stop , LTRIM 返回一个空列表(因为 LTRIM 已经将整个列表清空)。
  如果 stop 下标比 end 下标还要大,Redis将 stop 的值设置为 end 
  实践:
  redis 127.0.0.1:6379> lrange l1 0 -1    // 新建一个队列 
  1) "h"
  2) "e"
  3) "l"
  4) "l"
  5) "o"
  redis 127.0.0.1:6379> ltrim l1 0 3     // 只截取前四个 
  OK
  redis 127.0.0.1:6379> lrange l1 0 -1
  1) "h"
  2) "e"
  3) "l"
  4) "l"
  redis 127.0.0.1:6379> ltrim l1 0 10    // stop下标大于队列长度 则 stop=队列长度
  OK
  redis 127.0.0.1:6379> lrange l1 0 -1
  1) "h"
  2) "e"
  3) "l"
  4) "l"
  redis 127.0.0.1:6379> lset l1 10 20  // start stop 都大于 队列长度 且 start < stop 清空队列
  (empty list or set)
  redis 127.0.0.1:6379> ltrim l1 3 1     // start  < stop 清空队列
  OK
  redis 127.0.0.1:6379> lrange l1 10 20 
  (empty list or set)
  5.LINDEX
  语法:LINDEX key index
  释义:返回列表 key 中,下标为 index 的元素。
  下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
  你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
  实践:
  redis 127.0.0.1:6379> lpush l1 1 
  (integer) 1
  redis 127.0.0.1:6379> lpush l1 2
  (integer) 2
  redis 127.0.0.1:6379> lpush l1 3
  (integer) 3
  redis 127.0.0.1:6379> lindex l1 0            // 取下标为0的数据
  "3"
  redis 127.0.0.1:6379> lrange l1 0 -1 
  1) "3"
  2) "2"
  3) "1"
  redis 127.0.0.1:6379> lindex l1 -1          // 取最后一个数据
  "1"
  redis 127.0.0.1:6379> 
  6. LINSERT  类似于LSET,一个是根据下标来插入,一个是根据pivot来插入数据。
  语法:LINSERT key BEFORE|AFTER pivot value
  释义:将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
  当 pivot 不存在于列表 key 时,不执行任何操作。
  当 key 不存在时, key 被视为空列表,不执行任何操作。
  如果 key 不是列表类型,返回一个错误。
  实践:
  redis 127.0.0.1:6379> lrange l1 0 -1 
  1) "redis"
  2) "hello"
  3) "world"
  4) "hello"
  redis 127.0.0.1:6379> linsert l1 after hello after-insert          // 在第一个找到的hello后面插入了一个数据 
  (integer) 5
  redis 127.0.0.1:6379> lrange l1 0 -1 
  1) "redis"
  2) "hello"
  3) "after-insert"
  4) "world"
  5) "hello"
  redis 127.0.0.1:6379> linsert l1 before hello before-insert       // 在第一个找到的hello前面插入了一个数据 
  (integer) 6
  redis 127.0.0.1:6379> lrange l1 0 -1 
  1) "redis"
  2) "before-insert"
  3) "hello"
  4) "after-insert"
  5) "world"
  6) "hello"
  redis 127.0.0.1:6379> linsert l1 before hoho before-insert       // 对于 pivot 不存在的列表,插入失败
  (integer) -1
  redis 127.0.0.1:6379> lrange l1 0 -1 
  1) "redis"
  2) "before-insert"
  3) "hello"
  4) "after-insert"
  5) "world"
  6) "hello"
  redis 127.0.0.1:6379> linsert l2 before hoho before-insert       // 插入一个空列表,直接报错
  (integer) 0
  7. RPOPLPUSH 
  语法:RPOPLPUSH source destination
  释义:
  命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:
  将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。
  将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。
  举个例子,你有两个列表 source 和 destination , source 列表有元素 a, b, c , destination 列表有元素 x, y, z ,执行 RPOPLPUSH source destination 之后, source 列表包含元素 a, b , destination 列表包含元素 c, x, y, z ,并且元素 c 会被返回给客户端。
  如果 source 不存在,值 nil 被返回,并且不执行其他动作。
  如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。
  实践:
  redis 127.0.0.1:6379> lrange l1 0 -1 
  1) "c"
  2) "b"
  3) "a"
  redis 127.0.0.1:6379> lrange l2 0 -1
  1) "3"
  2) "2"
  3) "1"
  redis 127.0.0.1:6379> rpoplpush l1 l2     //将l1尾部的数据弹出进入l2的头部,并将这个弹出的数据返回
  "a"
  redis 127.0.0.1:6379> lrange l1 0 -1 
  1) "c"
  2) "b"
  redis 127.0.0.1:6379> lrange l2 0 -1 
  1) "a"
  2) "3"
  3) "2"
  4) "1"
  redis 127.0.0.1:6379>
  8. BRPOPLPUSH 
  语法:BRPOPLPUSH source destination timeout
  释义:BRPOPLPUSH 是 RPOPLPUSH 的阻塞版本,当给定列表 source 不为空时, BRPOPLPUSH 的表现和 RPOPLPUSH 一样。
  当列表 source 为空时, BRPOPLPUSH 命令将阻塞连接,直到等待超时,或有另一个客户端对 source 执行 LPUSH 或 RPUSH 命令为止。
  超时参数 timeout 接受一个以秒为单位的数字作为值。超时参数设为 0 表示阻塞时间可以无限期延长(block indefinitely) 。
  实践:
  我们设置等超时时间为1000 
DSC0002.jpg

  在另一个客户端添加数据后,就转移了数据
DSC0003.jpg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-315859-1-1.html 上篇帖子: redis全部key莫名消失——redis被攻击 下篇帖子: Redis数据结构分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表