Redis基本操作命令学习(三)之对List(链表类型)数据操作命令

List类型是redis数据库的5大类型之一,List底层是一个数组,也可看做类似LinkedList;

1.新建一个key并添加数据(LPUSH、RPUSH)

LPUSH:从list左侧新增一个元素,可一次插入多个元素(每次新增的元素都在链表左侧插入)
RPUSH:从list右侧新增一个元素

127.0.0.1:6379> lpush list 0  // 第一步 : 0
(integer) 1
127.0.0.1:6379> lpush list 1  // 第二步 :1  0
(integer) 2
127.0.0.1:6379> rpush list 2  // 第二步 :1  0  2
(integer) 3
127.0.0.1:6379> llen list     // 获取list的长度
(integer) 3
127.0.0.1:6379> lrange list 0 5 // 获取list的偏移范围
1) "1"
2) "0"
3) "2"
2.从链表中提取数据(LPOP、RPOP)

LPOP:从list的左侧取出第一个元素,元素取出后将会从list中剔除
RPOP:从list的右侧取出第一个元素,元素取出后将会从list中剔除

127.0.0.1:6379> lpop list
"1"
127.0.0.1:6379> lrange list 0 5
1) "0"
2) "2"
127.0.0.1:6379> rpop list
"2"
127.0.0.1:6379> lrange list 0 5
1) "0"
3.通过索引获取列表中的元素(LINDEX key index)

注意:index值不能超过列表总长度,列表左侧下标从0开始,右侧从-1开始

127.0.0.1:6379> lindex list 0      // 获取下标索引为0的元素
"0"
127.0.0.1:6379> rpush list redis   // 我们再来添加几个元素
(integer) 2
127.0.0.1:6379> rpush list mongo
(integer) 3
127.0.0.1:6379> lpush list postgresql
(integer) 4                      // 代表添加新的元素后,列表的当前长度
127.0.0.1:6379> lrange list 0 9  // 获取列表指定范围内的元素(相当于JAVA中的
截取数据)
1) "postgresql"
2) "0"
3) "redis"
4) "mongo"
 // 列表元素: "postgresql"   "0"    "redis"    "mongo"
 下标分析:         0          1        2          3
                 -4          -3       -2         -1
127.0.0.1:6379> lindex list 6     // 获取下标索引为6的元素,已经超出列表总长度,返回空
(nil)
127.0.0.1:6379> lindex list 3
"mongo"
127.0.0.1:6379> lindex list -1
"mongo"
127.0.0.1:6379> lindex list -4
"postgresql"
4.修改某个元素值(LSET key index newValue)

注意:index下标值不能越界

127.0.0.1:6379> lrange list 0 9 
1) "postgresql"
2) "0"
3) "redis"
4) "mongo"
127.0.0.1:6379> lset list 1 kafka  // 修改下标为1的元素值
OK
127.0.0.1:6379> lrange list 0 9    // 查看一下,修改成功
1) "postgresql"
2) "kafka"
3) "redis"
4) "mongo"
5.获取列表长度(LLEN key)
127.0.0.1:6397> llen list
(integer) 4
6.获取列表指定范围内的数据(LRANGE key start stop )

注意:start值要小于等于stop值(start下标值始终要在stop下标值的左侧,类似String类型的getrange命令),且不能超过列表总长度,否则获取不到任何数据

127.0.0.1:6379> lrange list 3 2   // start下标值大于stop下标值
(empty list or set)
127.0.0.1:6379> lrange list 3 5   // 获取元素时start和stop下标元素包含在获取范围内
1) "mongo"
127.0.0.1:6379> lrange list 0 -1  // 0是从列表左侧开始,-1从列表右侧开始
1) "postgresql"
2) "kafka"
3) "redis"
4) "mongo"
127.0.0.1:6397> lrange list 5 9   // 下标值超出列表长度
(empty list or set)
7.在某个元素之前或之后插入一个新的元素(LINSERT key BEFORE | AFTER oldValue newValue)

oldValue : 代表现有的某个元素值,不是下标值,如果oldValue不存在则返回-1;
newValue:代表要插入的新值
BEFORE | AFTER:代表要在现有值之前还是之后插入

127.0.0.1:6379> lrange list 0 -1
1) "postgresql"
2) "kafka"
3) "redis"
4) "mongo"
127.0.0.1:6379> linsert list before kafka drools
5
127.0.0.1:6379> lrange list 0 -1
1) "postgresql"
2) "drools"
3) "kafka"
4) "redis"
5) "mongo"

8.删除链表中某个元素(LREM key count value)

LREM :是List 和 remove 两个单词的拼合组成;
value:代表要删除的那个元素值;
count:在此处有2个作用,第一:当count > 0时,从链表的左侧开始删除;当count < 0时,从链表的右侧开始删除;当count = 0时,从链表中删除与value值相同的全部元素值; 第二:count是几就删除几个与value值相同的元素,如果count大于当前value值在链表中的个数时,则有几个与value相同的值就删除几个;

127.0.0.1:6379> rpush test a b c d s a c x c a  // 先创建一个名为test的链表
(integer) 10
127.0.0.1:6379> lrange test 0 -1   // 查看链表所有元素
1) "a"
2) "b"
3) "c"
4) "d"
5) "s"
6) "a"
7) "c"
8) "x"
9) "c"
10) "a"
127.0.0.1:6379> lrem test 2 a    // 要删除的元素值为a,2代表:从链表左侧开始并且删除2个元素为a的值
(integer) 2
127.0.0.1:6379> lrange test 0 -1 // 我们再次查看链表,发现确实删掉了2个元素值为a的
1) "b"
2) "c"
3) "d"
4) "s"
5) "c"
6) "x"
7) "c"
8) "a"
127.0.0.1:6379> lrem test -1 c  // 我们再次测试一下,从链表右侧开始删除一个元素
(integer) 1
127.0.0.1:6379> lrange test 0 -1
1) "b"
2) "c"
3) "d"
4) "s"
5) "c"
6) "x"
7) "a"
127.0.0.1:6379> lrem test 0 c     // 来测试count值为0时的情况
(integer) 2
127.0.0.1:6379> lrange test 0 -1  // 发现确实把元素值为c的全部删掉了
1) "b"
2) "d"
3) "s"
4) "x"
5) "a"
9.对链表进行截取,将截取后的值重新赋给key(LTRIM key start stop )

start 、stop:代表要截取的起始、结束下标值;stop值大于start值时会返回空;start和stop值都大于链表长度时会返回空;

// 对链表现有元素下标分析:b  d  s  x  a 
    下标:              0  1  2  3  4

127.0.0.1:6379> ltrim test 2 -1   // 解析截取操作
OK
127.0.0.1:6379> lrange test 0 -1  // 截取完成后,链表的值就是截取后的新链表值(原来为 b d s x a,截取后变为 s x a)
1) "s"
2) "x"
3) "a"
10.移除源链表的最后一个元素,并将该元素添加到另一个链表的头部并返回(RPOPLPUSH sourceList targetList)

sourceList :源链表
targetList:目标链表

127.0.0.1:6379> rpush source a b c f  // 新建一个链表 作为源
(integer) 4
127.0.0.1:6379> rpush targer g p s  // 再新增一个链表 作为目标
(integer) 3 
127.0.0.1:6379>rpoplpush source target  // 进行操作,把源链表的最右侧一个元素取出放入目标链表的头部
"f"
127.0.0.1:6379>lrange source 0 -1
1)"a"
2)"b"
3)"c"
127.0.0.1:6379>lrange target 0 -1
1)"f"
2)"g"
3)"p"
4)"s"
11.删除某一个链表(DEL key)
12.命令移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止(BRPOP key time / BLPOP key time);在线聊天场景适合使用此命令来进行设计

time为0时会一直处于阻塞状态,直到从链表中获取到数据为止;单位为秒(s)

127.0.0.1:6379> lpush demo a b c
(integer) 3
127.0.0.1:6379> brpop demo 10 // 链表中有数据,即使设置了阻塞时间也会取出第一个元素
"c"
127.0.0.1:6379> brpop demo 10 // 链表中有数据,即使设置了阻塞时间也会取出第一个元素
"b"
127.0.0.1:6379> brpop demo 10 // 链表中有数据,即使设置了阻塞时间也会取出第一个元素
"a"
127.0.0.1:6379> brpop demo 10 //此时链表中已经没有数据了,会阻塞10s,如果10s内获取不到数据的话会结束本次命令的执行,返回nil
(nil)
(10s)
127.0.0.1:6379> brpop demo 0 // 链表中已经没有数据了,会一直处于阻塞状态,直到取出数据才结束本次命令的执行

示例:可以同时打开2个redis客户端,对同一个key进行操作,使用blpop / brpop 命令进行操作查看效果(在一个客户端进行阻塞操作,在另一个客户端为key进行添加元素操作)


总结 : 命令归结起来就增删改查这4种,
(1)新增:
LPUSH (从链表左侧新增数值)、 RPUSH、
LINSERT(向链表中插入数值)、
RPOPLPUSH(将一个链表中的值取出后插入到另一个链表头部)
(2)修改: LSET(根据下标去修改某个数值)
(3)删除: LREM(删除链表中指定的那个数值)、DEL(删除key)
(4)查询:
LPOP(从链表左侧弹出第一个数值)、RPOP、
LRANGE(获取某个key的全部元素)、
BRPOP(延时弹出最右侧数值)、BLPOP、
LTRIM(根据下标截取元素后再重新赋给key)、
LINDEX(根据下标值获取某个数值)、
LLEN(查看key的拥有元素个数)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章