目录

  • 一、简介
  • 二、常用方法
    • 2.1、LPUSH、RPUSH
    • 2.2、LPUSHX、RPUSHX
    • 2.3、LPOP、RPOP
    • 2.4、RPOPLPUSH
    • 2.5、LEN
    • 2.6、LINDEX
    • 2.7、LRANGE
    • 2.8、LSET
    • 2.9、LINSERT
    • 2.10、LTRIM
    • 2.11、LREM
    • 2.12、BLPOP、BRPOP
    • 2.13、BRPOPLPUSH

一、简介

  本文今天主要是介绍Redis 列表(List)的方法的使用,以及redis对应的Java实现该怎么用。因为篇幅问题,我这里写了一个测试类,引入 RedisTemplate对象,后面例子里就不一一引入了。大家理解就行,如果大家还不到如何通过Spring Boot 整合redis则可以查看我之前的文章:SpringBoot整合redis(redis支持单节点和集群)

package com.alian.datastruct;import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.List;
import java.util.concurrent.TimeUnit;@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class RedisListTest {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;
}

二、常用方法

2.1、LPUSH、RPUSH

  • LPUSH 将一个或多个值插入到列表头部
  • RPUSH 将一个或多个值插入到列表尾部

语法

LPUSH KEY_NAME VALUE1 VALUE2.. VALUEn
RPUSH KEY_NAME VALUE1 VALUE2.. VALUEn

命令操作

127.0.0.1:6379> lpush list1 python
(integer) 1
127.0.0.1:6379> lpush list1 Java
(integer) 2
127.0.0.1:6379> rpush list1 kotlin
(integer) 3
127.0.0.1:6379> lrange list1 0 -1
1) "Java"
2) "python"
3) "kotlin"

  需要注意的是,使用LPUSH和RPUSH,如果key不存在,就会自动创建这个key,这里的key就是list1。

Java操作

    @Testpublic void leftPushAndRightPush() {String redisKey="list1";redisTemplate.delete(redisKey);// 从列表的左边插入redisTemplate.opsForList().leftPush(redisKey,"Python");redisTemplate.opsForList().leftPush(redisKey,"Java");// 从列表的右边插入redisTemplate.opsForList().rightPush(redisKey,"Kotlin");// 输出全部列表List<Object> list = redisTemplate.opsForList().range(redisKey, 0, -1);log.info("列表的信息:{}", list);}
列表的信息:[Java, python, kotlin]

2.2、LPUSHX、RPUSHX

  • LPUSHX 将一个值插入到已存在的列表头部
  • RPUSHX 将一个值插入到已存在的列表尾部

语法

LPUSHX KEY_NAME VALUE1 VALUE2.. VALUEn
RPUSHX KEY_NAME VALUE1 VALUE2.. VALUEn

命令操作

127.0.0.1:6379> lpushx list2 java
(integer) 0
127.0.0.1:6379> rpushx list2 javascript
(integer) 0
127.0.0.1:6379> lpush list2 kotlin
(integer) 1
127.0.0.1:6379> lpushx list2 go
(integer) 2
127.0.0.1:6379> rpushx list2 ios
(integer) 3
127.0.0.1:6379> lrange list2 0 -1
1) "go"
2) "kotlin"
3) "ios"
  • 使用LPUSHX和RPUSHX添加时,由于key(list2)不存在,则插入数据失败
  • 使用LPUSH加入kotlin后,就自动创建了key(list2)
  • 再使用LPUSHX和RPUSHX添加时,由于key(list2)存在,在列表的左侧插入go,右侧插入ios

Java操作

    @Testpublic void leftPushXAndRightPushX() {redisTemplate.delete(REDIS_KEY);String redisKey="list2";// 从列表的左边插入(如果key:list2存在)redisTemplate.opsForList().leftPushIfPresent(redisKey,"Java");// 从列表的右边插入(如果key:list2存在)redisTemplate.opsForList().rightPushIfPresent(redisKey,"Javascript");// 从列表的左边插入redisTemplate.opsForList().leftPush(redisKey,"kotlin");// 从列表的左边插入(如果key:list2存在)redisTemplate.opsForList().leftPushIfPresent(redisKey,"go");// 从列表的右边插入(如果key:list2存在)redisTemplate.opsForList().rightPushIfPresent(redisKey,"ios");// 输出全部列表List<Object> list = redisTemplate.opsForList().range(redisKey, 0, -1);log.info("列表的信息:{}", list);}
列表的信息:[go, kotlin, ios]

2.3、LPOP、RPOP

  • LPOP 移除列表的第一个元素,返回值为移除的元素
  • RPOP 移除列表的最后一个元素,返回值为移除的元素

语法

LPOP KEY_NAME
RPOP KEY_NAME

命令操作

127.0.0.1:6379> lpush list3 Python Java Kotlin Go
(integer) 4
127.0.0.1:6379> lpop list3
"Go"
127.0.0.1:6379> rpop list3
"Python"
127.0.0.1:6379> lrange list3 0 -1
1) "Kotlin"
2) "Java"
  • 先初始化一个列表(list3)得到:Go、Kotlin、Java、Python
  • 从列表(list3)的左边弹出 Go
  • 从列表(list3)的右边边弹出 Python
  • 剩下的列表(list3)的元素:Kotlin、Java

Java操作

    @Testpublic void leftPopAndRightPop() {String redisKey="list3";redisTemplate.delete(redisKey);// 给列表list3插入多个数据redisTemplate.opsForList().leftPushAll(redisKey,"Python","Java","Kotlin","Go");// 从列表的左边弹出数据Object leftValue = redisTemplate.opsForList().leftPop(redisKey);log.info("左边弹出的数据:{}", leftValue);// 从列表的右边边弹出数据Object rightValue = redisTemplate.opsForList().rightPop(redisKey);log.info("右边边弹出的数据:{}", rightValue);// 输出全部列表List<Object> list = redisTemplate.opsForList().range(redisKey, 0, -1);log.info("列表的信息:{}", list);}
左边弹出的数据:Go
右边边弹出的数据:Python
列表的信息:[Kotlin, Java]

2.4、RPOPLPUSH

  • RPOPLPUSH 移除列表的最后一个元素,并将该元素添加到另一个列表的头部并返回

语法

RPOPLPUSH SOURCE_KEY_NAME DESTINATION_KEY_NAME

命令操作

127.0.0.1:6379> rpush list4 Python Java Kotlin Go
(integer) 4
127.0.0.1:6379> rpoplpush list4 anotherList
"Go"
127.0.0.1:6379> lrange list4 0 -1
1) "Python"
2) "Java"
3) "Kotlin"
  • 先初始化一个列表(list4)得到:Python、Java、Kotlin、Go
  • 从列表(list4)的左边弹出 Go插入到新的列表(anotherList)
  • 剩下的列表(list4)的元素:Python、Java、Kotlin

Java操作

    @Testpublic void rightPopLeftPush() {String redisKey = "list4";redisTemplate.delete(redisKey);redisTemplate.delete("anotherList");// 给列表list4插入数据redisTemplate.opsForList().rightPushAll(redisKey,"Python","Java","Kotlin","Go");// 从列表的右边弹出一个原素,插入到另外一个列表,redisTemplate.opsForList().rightPopAndLeftPush(redisKey, "anotherList");// 输出列表信息List<Object> list = redisTemplate.opsForList().range(redisKey, 0, -1);log.info("原列表的信息:{}", list);// 输出新列表信息List<Object> anotherList = redisTemplate.opsForList().range("anotherList", 0, -1);log.info("新列表的信息:{}", anotherList);}
原列表的信息:[Python, Java, Kotlin]
新列表的信息:[Go]

2.5、LEN

  • LEN 获取列表长度

语法

LLEN KEY_NAME

命令操作

127.0.0.1:6379> rpush list5 Python Java Kotlin Go
(integer) 4
127.0.0.1:6379> llen list5
(integer) 4
127.0.0.1:6379> llen list0
(integer) 0
  • 初始化列表(list5)得到:Python、Java、Kotlin、Go
  • 通过 llen 获取列表的长度,得到 4
  • 当列表(list0)不存在,长度为0

Java操作

    @Testpublic void length() {String redisKey = "list5";redisTemplate.delete(redisKey);// 给列表list5插入数据redisTemplate.opsForList().rightPushAll(redisKey,"Python","Java","Kotlin","Go");// 获取列表的长度Long size = redisTemplate.opsForList().size(redisKey);log.info("列表的长度:{}", size);}
列表的长度:4

2.6、LINDEX

  • LINDEX 通过索引获取列表中的元素

语法

LINDEX KEY_NAME INDEX_POSITION

命令操作

  列表从左往右是从 0 开始,列表从右往左是从 -1 开始

127.0.0.1:6379> rpush list6 Python Java Kotlin Go
(integer) 4
127.0.0.1:6379> lindex list6 0
"Python"
127.0.0.1:6379> lindex list6 1
"Java"
127.0.0.1:6379> lindex list6 2
"Kotlin"
127.0.0.1:6379> lindex list6 -1
"Go"
127.0.0.1:6379> lindex list6 -2
"Kotlin"
127.0.0.1:6379> lindex list6 -3
"Java"
  • 先初始化一个列表(list6)得到:Python、Java、Kotlin、Go
  • 获取列表(list6)中索引为 0 的数据,得到 Python
  • 获取列表(list6)中索引为 1 的数据,得到 Java
  • 获取列表(list6)中索引为 2 的数据,得到 Kotlin
  • 获取列表(list6)中索引为 -1 的数据,得到 Go
  • 获取列表(list6)中索引为 -2 的数据,得到 Kotlin
  • 获取列表(list6)中索引为 -3 的数据,得到 Java

Java操作

    @Testpublic void index() {String redisKey = "list6";redisTemplate.delete(redisKey);// 给列表list6插入数据redisTemplate.opsForList().rightPushAll(redisKey,"Python","Java","Kotlin","Go");// 获取列表中索引为【0】的数据Object value0 = redisTemplate.opsForList().index(redisKey, 0);log.info("列表中索引为【0】对应的值:{}", value0);// 获取列表中索引为【1】的数据Object value1 = redisTemplate.opsForList().index(redisKey, 1);log.info("列表中索引为【1】对应的值:{}", value1);// 获取列表中索引为【2】的数据Object value2 = redisTemplate.opsForList().index(redisKey, 2);log.info("列表中索引为【2】对应的值:{}", value2);// 获取列表中索引为【-1】的数据Object value3 = redisTemplate.opsForList().index(redisKey, -1);log.info("列表中索引为【-1】对应的值:{}", value3);// 获取列表中索引为【-2】的数据Object value4 = redisTemplate.opsForList().index(redisKey, -2);log.info("列表中索引为【-2】对应的值:{}", value4);// 获取列表中索引为【-3】的数据Object value5 = redisTemplate.opsForList().index(redisKey, -3);log.info("列表中索引为【-3】对应的值:{}", value5);}
列表中索引为【0】对应的值:Python
列表中索引为【1】对应的值:Java
列表中索引为【2】对应的值:Kotlin
列表中索引为【-1】对应的值:Go
列表中索引为【-2】对应的值:Kotlin
列表中索引为【-3】对应的值:Java

2.7、LRANGE

  • LRANGE 获取列表指定范围内的元素

语法

LRANGE KEY_NAME START END

命令操作

  返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。如果是负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推

127.0.0.1:6379> rpush list7 Python Java Kotlin Go Javascript
(integer) 5
127.0.0.1:6379> lrange list7 0 -1
1) "Python"
2) "Java"
3) "Kotlin"
4) "Go"
5) "Javascript"
127.0.0.1:6379> lrange list7 1 3
1) "Java"
2) "Kotlin"
3) "Go"
127.0.0.1:6379> lrange list7 -3 -1
1) "Kotlin"
2) "Go"
3) "Javascript"
  • 先初始化一个列表(list7 )得到:Python、Java、Kotlin、Go、Javascript
  • 获取列表(list7)中索引从 0 到 -1 的列表,得到Python、Java、Kotlin、Go、Javascript
  • 获取列表(list7)中索引从 1 到 3 的列表,得到Java、Kotlin、Go
  • 获取列表(list7)中索引从 -3 到 -1 的列表,得到Kotlin、Go、Javascript

Java操作

    @Testpublic void range() {String redisKey = "list7";redisTemplate.delete(redisKey);// 给列表list7插入数据redisTemplate.opsForList().rightPushAll(redisKey,"Python","Java","Kotlin","Go","Javascript");// 获取指定范围的列表数据List<Object> result1 = redisTemplate.opsForList().range(redisKey, 0, -1);log.info("列表中索引为【0】到【-1】的列表值:{}", result1);List<Object> result2 = redisTemplate.opsForList().range(redisKey, 1, 3);log.info("列表中索引为【1】到【3】的列表值:{}", result2);List<Object> result3 = redisTemplate.opsForList().range(redisKey, -3, -1);log.info("列表中索引为【-3】到【-1】的列表值:{}", result3);}
列表中索引为【0】到【-1】的列表值:[Python, Java, Kotlin, Go, Javascript]
列表中索引为【1】到【3】的列表值:[Java, Kotlin, Go]
列表中索引为【-3】到【-1】的列表值:[Kotlin, Go, Javascript]

2.8、LSET

  • LSET 通过索引设置列表元素的值

语法

LSET KEY_NAME INDEX VALUE

命令操作

127.0.0.1:6379> rpush list8 Python Java Kotlin Go Javascript
(integer) 5
127.0.0.1:6379> lset list8 3 IOS
OK
127.0.0.1:6379> lset list8 4 Android
OK
127.0.0.1:6379> lrange list8 0 -1
1) "Python"
2) "Java"
3) "Kotlin"
4) "IOS"
5) "Android"
  • 先初始化一个列表(list8 )得到:Python、Java、Kotlin、Go、Javascript
  • 把列表(list8)中索引为 3 的数据改成,IOS
  • 把列表(list8)中索引为 4 的数据改成,Android
  • 获取列表(list8)中索引从 0 到 -1 的列表,得到Python、Java、Kotlin、IOS、Android

Java操作

    @Testpublic void set() {String redisKey = "list8";redisTemplate.delete(redisKey);// 给列表list8插入数据redisTemplate.opsForList().rightPushAll(redisKey,"Python","Java","Kotlin","Go","Javascript");// 把索引3和4分别设置为IOS、AndroidredisTemplate.opsForList().set(redisKey, 3, "IOS");redisTemplate.opsForList().set(redisKey, 4, "Android");// 获取列表中数据List<Object> result1 = redisTemplate.opsForList().range(redisKey, 0, -1);log.info("列表中的数据为:{}", result1);}
列表中数据为:[Python, Java, Kotlin, IOS, Android]

2.9、LINSERT

  • LINSERT 在列表的元素前或者后插入元素

语法

LINSERT key BEFORE|AFTER pivot value

命令操作

127.0.0.1:6379> rpush list9 Python Java Kotlin
(integer) 3
127.0.0.1:6379> linsert list9 before Java IOS
(integer) 4
127.0.0.1:6379> linsert list9 after Java Android
(integer) 5
127.0.0.1:6379> lrange list9 0 -1
1) "Python"
2) "IOS"
3) "Java"
4) "Android"
5) "Kotlin"
  • 先初始化一个列表(list9 )得到:Python、Java、Kotlin
  • 将IOS插入到列表(list9)中值为 Java 的前面
  • 将Android插入到列表(list9)中值为 Java 的后面
  • 获取列表(list9)中索引从 0 到 -1 的列表,得到Python、IOS、Java、Android、Kotlin

Java操作

    @Testpublic void insert() {String redisKey = "list9";redisTemplate.delete(redisKey);// 给列表list9插入数据redisTemplate.opsForList().rightPushAll(redisKey,"Python","Java","Kotlin");// 在Java前添加IOSredisTemplate.opsForList().leftPush(redisKey,"Java","IOS");// 在Java后添加AndroidredisTemplate.opsForList().rightPush(redisKey,"Java","Android");// 获取列表中数据List<Object> result1 = redisTemplate.opsForList().range(redisKey, 0, -1);log.info("列表中数据为:{}", result1);}
列表中数据为:[Python, IOS, Java, Android, Kotlin]

2.10、LTRIM

  • LTRIM 对一个列表进行裁剪(trim),让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

语法

LTRIM KEY_NAME START STOP

命令操作

127.0.0.1:6379> rpush list10 Python Java Kotlin Go Javascript IOS Android
(integer) 7
127.0.0.1:6379> ltrim list10 2 -1
OK
127.0.0.1:6379> lrange list10 0 -1
1) "Kotlin"
2) "Go"
3) "Javascript"
4) "IOS"
5) "Android"
127.0.0.1:6379> ltrim list10 0 -3
OK
127.0.0.1:6379> lrange list10 0 -1
1) "Kotlin"
2) "Go"
3) "Javascript"
127.0.0.1:6379> ltrim list10 1 2
OK
127.0.0.1:6379> lrange list10 0 -1
1) "Go"
2) "Javascript"
  • 先初始化一个列表(list10 )得到:Python、Java、Kotlin、Go、Javascript、IOS、Android
  • 通过 ltrim 方法去除头部两个元素,得到Kotlin、Go、Javascript、IOS、Android
  • 通过 ltrim 方法去除尾部两个元素,得到Kotlin、Go、Javascript
  • 通过 ltrim 方法截取从1到2的元素,得到Go、Javascript

Java操作

    @Testpublic void trim() {String redisKey = "list10";redisTemplate.delete(redisKey);// 给列表list10插入数据redisTemplate.opsForList().rightPushAll(redisKey,"Python", "Java", "Kotlin", "Go", "Javascript","IOS","Android");List<Object> result = redisTemplate.opsForList().range(redisKey, 0, -1);log.info("初始数据为:{}", result);// 去除头部两个元素redisTemplate.opsForList().trim(redisKey,2,-1);// 获取列表中数据List<Object> result1 = redisTemplate.opsForList().range(redisKey, 0, -1);log.info("去除头部两个元素后列表中数据为:{}", result1);// 去除尾部两个元素redisTemplate.opsForList().trim(redisKey,0,-3);// 获取列表中数据List<Object> result2 = redisTemplate.opsForList().range(redisKey, 0, -1);log.info("去除尾部两个元素后列表中数据为:{}", result2);// 截取列表中索引从1到2的数据redisTemplate.opsForList().trim(redisKey, 1, 2);// 获取列表中数据List<Object> result3 = redisTemplate.opsForList().range(redisKey, 0, -1);log.info("截取列表中索引从1到2的数据后:{}", result3);}
初始数据为:[Python, Java, Kotlin, Go, Javascript, IOS, Android]
去除头部两个元素后列表中数据为:[Kotlin, Go, Javascript, IOS, Android]
去除尾部两个元素后列表中数据为:[Kotlin, Go, Javascript]
截取列表中索引从1到2的数据后:[Go, Javascript]

2.11、LREM

  • LTRIM 移除列表元素

语法

LREM KEY_NAME count VALUE
  • count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT
  • count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值
  • count = 0 : 移除表中所有与 VALUE 相等的值

命令操作

127.0.0.1:6379> rpush list11 Java Java Kotlin Java Java IOS Java
(integer) 7
127.0.0.1:6379> lrem list11 2 Java
(integer) 2
127.0.0.1:6379> lrange list11 0 -1
1) "Kotlin"
2) "Java"
3) "Java"
4) "IOS"
5) "Java"
127.0.0.1:6379> lrem list11 -1 Java
(integer) 1
127.0.0.1:6379> lrange list11 0 -1
1) "Kotlin"
2) "Java"
3) "Java"
4) "IOS"
127.0.0.1:6379> lrem list11 0 Java
(integer) 2
127.0.0.1:6379> lrange list11 0 -1
1) "Kotlin"
2) "IOS"
  • 先初始化一个列表(list11 )得到:Java、Java、Kotlin、Java、Java、IOS、Java
  • 通过 lrem 方法去除头部2个Java ,得到Kotlin、Java、Java、IOS、Java
  • 通过 lrem 方法去除尾部1个Java ,得到Kotlin、Java、Java、IOS
  • 通过 lrem 方法去除所有Java ,得到Kotlin、IOS
    Java操作
    @Testpublic void count() {String redisKey = "list11";redisTemplate.delete(redisKey);// 给列表list11插入数据redisTemplate.opsForList().rightPushAll(redisKey, "Java", "Java", "Kotlin", "Java", "Java", "IOS", "Java");// 从头部开始移除2个JavaredisTemplate.opsForList().remove(redisKey,2,"Java");// 获取列表中数据List<Object> result1 = redisTemplate.opsForList().range(redisKey, 0, -1);log.info("从头部开始移除2个Java值后:{}", result1);// 从尾部部开始移除1个JavaredisTemplate.opsForList().remove(redisKey,-1,"Java");// 获取列表中数据List<Object> result2 = redisTemplate.opsForList().range(redisKey, 0, -1);log.info("从尾部部开始移除1个Java值后:{}", result2);// 移除列表中的所有的JavaredisTemplate.opsForList().remove(redisKey,0,"Java");// 获取列表中数据List<Object> result3 = redisTemplate.opsForList().range(redisKey, 0, -1);log.info("移除列表中的所有的Java值后:{}", result3);}
从头部开始移除2个Java值后:[Kotlin, Java, Java, IOS, Java]
从尾部部开始移除1个Java值后:[Kotlin, Java, Java, IOS]
移除列表中的所有的Java值后:[Kotlin, IOS]

2.12、BLPOP、BRPOP

  • BLPOP 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
  • BRPOP 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止

语法

BLPOP LIST1 LIST2 ... LISTn TIMEOUT
BRPOP LIST1 LIST2 ... LISTn TIMEOUT

命令操作

127.0.0.1:6379> rpush list12 Java Python
(integer) 2
127.0.0.1:6379> blpop list12 10
1) "list12"
2) "Java"
127.0.0.1:6379> brpop list12 10
1) "list12"
2) "Python"
127.0.0.1:6379> blpop list12 10
(nil)
(10.01s)
127.0.0.1:6379> brpop list12 10
(nil)
(10.01s)
  • 先初始化一个列表(list12 )得到:Java、Python
  • 通过 blpop 方法弹出头部一个元素,得到Java
  • 通过 brpop 方法弹出尾部一个元素,得到Python,此时列表为空
  • 通过 blpop 方法弹出头部一个元素,结果10秒后超时(列表为空)
  • 通过 brpop 方法弹出尾部一个元素,结果10秒后超时(列表为空)

终端一

127.0.0.1:6379> blpop list12 10
(nil)
(10.05s)
127.0.0.1:6379> blpop list12 10

终端二

127.0.0.1:6379> lpush list12 Scala
(integer) 1

  此时终端一会马上得到结果,详细见下图

  • 在终端一 blpop 方法弹出空列表 list12 头部一个元素,如果没有数据则10秒后超时
  • 在终端二中我们给空列表 list12 ,插入一个数据 Scala
  • 终端一马上弹出了,终端二插入的数据 Scala ,阻塞终止

Java操作

    @Testpublic void bLeftPopAndBRightPop() {String redisKey = "list12";redisTemplate.delete(redisKey);// 给列表list12插入数据redisTemplate.opsForList().leftPushAll(redisKey, "Python", "Java");// 从列表头部弹出元素,超时时间为30秒Object value1 = redisTemplate.opsForList().leftPop(redisKey, 30, TimeUnit.SECONDS);log.info("从列表头部阻塞弹出元素:{}", value1);// 从列表尾部弹出元素,超时时间为30秒Object value2 = redisTemplate.opsForList().rightPop(redisKey,30, TimeUnit.SECONDS);log.info("从列表尾部阻塞弹出元素:{}", value2);try {// 此时是空列表了,继续头部弹出,此时会阻塞,如果30秒内列表还有元素,就会超时redisTemplate.opsForList().leftPop(redisKey,30, TimeUnit.SECONDS);
//            redisTemplate.opsForList().rightPop(redisKey,30, TimeUnit.SECONDS);} catch (Exception e) {log.info("阻塞弹出数据超时");}}
从列表头部阻塞弹出元素:Java
从列表尾部阻塞弹出元素:Python
阻塞弹出数据超时

2.13、BRPOPLPUSH

  • BRPOPLPUSH 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止

语法

BRPOPLPUSH LIST1 ANOTHER_LIST TIMEOUT

命令操作

127.0.0.1:6379> rpush list13 Java Python
(integer) 2
127.0.0.1:6379> brpoplpush list13 newlist 10
"Python"
127.0.0.1:6379> brpoplpush list13 newlist 10
"Java"
127.0.0.1:6379> brpoplpush list13 newlist 10
(nil)
(10.02s)
127.0.0.1:6379> lrange newlist 0 -1
1) "Java"
2) "Python"
  • 先初始化一个列表(list13 )得到:Java、Python
  • 通过 brpoplpush 方法弹出尾部一个元素,得到Python,并插入到一个新的列表 newlist
  • 通过 brpoplpush 方法弹出尾部一个元素,得到Java,并插入到一个新的列表 newlist ,此时列表list13 为空
  • 通过 brpoplpush 方法弹出尾部一个元素,结果10秒后超时(列表为空)
  • 通过 lrange 方法查看新列表( newlist )的数据,得到Java、Python

同样的,为了验证阻塞,我们开启另外一个终端,往空列表 list13 写入数据

终端二

127.0.0.1:6379> lpush list13 Scala
(integer) 1

终端一

127.0.0.1:6379> brpoplpush list13 newlist 10
(nil)
(10.05s)
127.0.0.1:6379> brpoplpush list13 newlist 10
"Scala"
(3.57s)
127.0.0.1:6379> lrange newlist 0 -1
1) "Scala"
2) "Java"
3) "Python"
  • 在终端一 brpoplpush 方法弹出空列表 list13 尾部一个元素,如果没有数据则10秒后超时
  • 在终端二中我们给空列表 list13 ,插入一个数据 Scala
  • 终端一马上弹出了,终端二插入的数据 Scala ,阻塞终止
  • 通过 lrange 方法查看新列表( newlist )的数据,得到Scala、Java、Python

Java操作

    @Testpublic void bRightPopAndLeftPush() {String redisKey = "list13";redisTemplate.delete(redisKey);// 给列表list13插入数据redisTemplate.opsForList().leftPushAll(redisKey, "Python", "Java", "Kotlin", "Go");// 从列表尾部弹出元素,插入到另外一个列表的头部,超时时间为30秒redisTemplate.opsForList().rightPopAndLeftPush(redisKey,"newList",30, TimeUnit.SECONDS);}

Redis 列表(List)方法使用详解相关推荐

  1. python中列表的sort方法_python中列表的sort方法使用详解

    内容简介:python中列表的sort方法使用详解 一.基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的. 排序,数字.字符 ...

  2. Redis系列教程(二):详解Redis的存储类型、集群架构、以及应用场景

    高并发架构系列 高并发架构系列:数据库主从同步的3种一致性方案实现,及优劣比较 高并发架构系列:Spring Cloud的核心成员.以及架构实现详细介绍 高并发架构系列:服务注册与发现的实现原理.及实 ...

  3. Redis环境搭建以及常见问题详解

    Redis环境搭建以及常见问题详解 环境的搭建 Redis是什么??? Redis起源 Redis 简介 Redis优势 Redis与其他key-value存储数据库的区别 Redis 下载和安装 R ...

  4. python装饰器函数-Python函数装饰器常见使用方法实例详解

    本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所 ...

  5. python列表切片后得到剩余列表_python列表切片和嵌套列表取值操作详解

    python列表切片和嵌套列表取值操作详解 给出列表切片的格式: [开头元素::步长] # 输出直到最后一个元素,(最后一个冒号和步长可以省略,下同) [开头元素:结尾元素(不含):步长] # 其中, ...

  6. layui添加复选框_对layui初始化列表的CheckBox属性详解,初始化属性

    对layui初始化列表的CheckBox属性详解,初始化属性 通常layui前端页面完全按照layui官网的例子写所有的页面初始化都没有问题,但是那只是静态页面.当加入后台去动态加载页面的时候有写样式 ...

  7. php栏目页内容排序问题,Dedecms频道列表页栏目排序问题详解

    织梦Dedecms频道列表页栏目排序问题详解,问题描述如下: 各位大大,小弟我想在首页调用6个栏目,typeid分别是1,2,3,4,5,40,默认的排序小弟不想要,希望改为1,40,3,4,5,2 ...

  8. colsure php_PHP_PHP中Closure类的使用方法及详解,Closure,匿名函数,又称为Anonym - phpStudy...

    PHP中Closure类的使用方法及详解 Closure,匿名函数,又称为Anonymous functions,是php5.3的时候引入的.匿名函数就是没有定义名字的函数.这点牢牢记住就能理解匿名函 ...

  9. 伤害世界怎么自建服务器,《伤害世界Hurtworld》服务器架设方法图文详解 怎么开服?...

    <伤害世界Hurtworld>服务器架设方法图文详解 怎么开服? 2015-12-19 22:29:52来源:贴吧编辑:评论(0) <伤害世界Hurtworld>中很多玩家不知 ...

  10. 【Redis之ZSet类型的详解ZSet类型中常用命令的实践】

    Redis之ZSet类型的详解&ZSet类型中常用命令的实践 知识回顾: 通过对Redis中的String的命令做了充分的讲解以及实践学习 通过对Redis中String类型之Bit命令的详解 ...

最新文章

  1. CISCO交换机配置命令大全
  2. linux 打开关闭文件,Linux系统编程-文件打开关闭
  3. vsftpd搭建和创建虚拟账号
  4. element ui分页怎么做_element ui里面table分页,页数从0开始的怎么做?
  5. Spring Data ElasticSearch示例--查询索引库
  6. boost::lambda::bind用法的测试程序
  7. 玩转oracle 11g(4):连接,文件操作,交互命令
  8. Python《wallpaper abyss壁纸》
  9. 20145236《网络对抗》进阶实验——64位Ubuntu 17.10.1 ROP攻击
  10. TIOBE 12 月编程语言排行榜:争夺年度编程语言,Java、C、Python、C# 即将开战!...
  11. forEach for 循环
  12. C++ 推断进程是否存在
  13. Visual C++ 时尚编程百例002(MFC窗口)
  14. 移动深度学习:人工智能的深水区
  15. 团队-科学计算器-开发环境搭建过程
  16. OV7725摄像头模块SCCB通信
  17. mysql error 1114,MySQL错误1114“表已满”使用MyISAM引擎
  18. python省略号用法
  19. LOJ#6198. 谢特(SAM+01Trie树合并)
  20. 科学网肖波:海外博后申请的一点经验与看法

热门文章

  1. ios, android平台手机游戏,《王者荣耀》ios和安卓怎么转平台 ios和安卓转平台攻略...
  2. kotlin中使用软引用
  3. windows编译 zlib
  4. 180/360度舵机控制方法
  5. 使用 youtube api封装播放器的坑
  6. php获取两个时间戳之间相隔多少天多少小时多少分多少秒
  7. 大球分析系统_走地大球分析系统app
  8. 今日话题:微信再次更新搜索框,公众号会更加火爆?
  9. Excel函数sumproduct应用案例-多条件求和
  10. LinkNet 笔记