LIST 整体结构图
图画的太大了,只能放地址:
http://dl.iteye.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>
查看其是如何阻塞的
在第一个图片中,上面那个终端一直阻塞着。
在第二个终端中输入数据后,上面终端取得数据并返回。
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
在另一个客户端添加数据后,就转移了数据
分享到:
相关推荐
Redis全套学习笔记 Redis是一种基于内存的NoSQL数据库,具有高性能、可扩展性和灵活性等特点。以下是Redis的详细知识点: 安装和启动 * 安装Redis可以通过下载软件包或使用yum、apt-get等安装工具进行安装。 * ...
在本“Redis学习笔记-包括周阳和狂神说”中,我们将深入探讨Redis的核心概念、功能特性以及实际应用。 1. Redis基本概念 - 键值对:Redis的核心数据结构,键是唯一的标识,值可以是多种类型,如字符串、哈希、列表...
redis学习笔记redis 是一个开源的 key-value 数据库。它又经常被认为是一个数据结构服务器。 因为它的 value 不仅包括基本的 string 类型还有 list,set ,sorted set 和 hash 类型。当 然这些类型的元素也都是 string...
### 超详细的Redis学习笔记知识点汇总 #### 1. Redis 的启动与停止 ##### 1.1 直接启动 Redis 服务 - **默认端口启动**:使用 `$ redis-server` 命令,默认监听端口为 `6379`。 - **指定端口启动**:使用 `$ ...
"深入redis学习(九)--redis skiplist.doc"讲解了跳跃表,这是Redis实现有序集合排序的底层数据结构,提供O(log N)的查找、插入和删除效率,比红黑树更节省内存。 "深入redis学习(十)--redis object management....
Redis作为一款高性能的键值存储数据库,支持多种数据类型,包括String、List、Set、ZSet和Hash,并且提供了数据持久化的机制,包括快照(Snapshot)和AOF(Append Only File)两种方式。在Java操作方面,可以利用...
### Redis 学习笔记知识点概览 #### 一、Redis 概述与应用场景 ##### 1.1 NoSQL 数据库简介 - **定义**: NoSQL(Not Only SQL)泛指非关系型数据库,它们通常不使用传统的表格关系来存储数据。 - **特性**: NoSQL ...
这个“redis学习笔记.zip”压缩包很可能是包含了关于Redis的学习资料,可能包括概念解释、操作教程、实践案例等内容,适合初学者和有一定基础的学习者参考。 Redis的学习可以分为以下几个主要部分: 1. **基础知识...
Redis学习笔记 Redis是基于键值对存储的NoSQL数据库,可以用来存储和检索数据。下面是Redis的基础知识点: 基础命令 * set key value:保存一个数据,重复set相同的key只会保存最新的value * get key:获取一个...
2. Redis 数据类型: - **字符串(String)**:基本的键值对,支持设置、获取、追加、长度计算、原子递增/递减等操作。 - **列表(List)**:双端队列,允许在两端插入和删除元素,支持范围查询,可用于消息队列。 - ...
这只是 Redis 学习的基础,深入使用还需要掌握更多的高级特性和最佳实践,例如集群搭建、主从复制、Lua 脚本、Pipeline 使用等。随着对 Redis 的了解加深,你可以将其应用到更复杂的系统设计中,优化性能和提高系统...
本资源包包含了关于Redis的学习笔记以及一个基于SpringBoot整合Redis的实战项目——"springboot-redisdemo",旨在帮助你深入理解和应用Redis。 首先,让我们详细探讨Redis的核心知识点: 1. **Redis的数据类型**:...
这份"redis笔记.rar"包含的"redis笔记.pdf"应该是一份详细的学习指南,非常适合初学者了解和掌握Redis的基本概念、操作命令以及实战技巧。 1. Redis基本概念: - Redis是一个开源的、基于内存的数据存储系统,支持...
在本次学习笔记中,主要介绍了String类型的命令。String是最基本的类型,可以存储任何形式的数据,如二进制数据、数字或字符串。在String类型中,可以使用set命令设置值,使用get命令获取值,append命令用于追加字符...
Redis不仅支持基本的键值对存储,还支持多种数据结构,包括字符串(strings)、散列(hash)、列表(list)、集合(set)、有序集合(sorted set)以及范围查询、位图(bitmaps)、超日志(hyperloglogs)和地理空间索引...
在“redis基本命令paper-mas开发笔记”中,我们将会探讨Redis的一些核心概念和常用命令,帮助你更好地理解和运用这个强大的工具。 1. **Redis的数据类型**: - **String**:基础类型,可以存储字符串、数字等,如`...
本开发笔记主要关注Redis的基本命令,帮助开发者更好地理解和运用这个强大的工具。 1. **连接与关闭** - `redis-cli`:命令行客户端,用于连接Redis服务器。 - `ping`:检查服务器是否在线。 - `quit`:关闭连接...