Spring Boot(二十二):RedisTemplate的List类型操作

RedisTemplate和StringRedisTemplate的系列文章详见:

Spring Boot(十七):集成和使用Redis

Spring Boot(十八):RedisTemplate和StringRedisTemplate

Spring Boot(十九):StringRedisTemplate的常用方法和注意事项

Spring Boot(二十):RedisTemplate的序列化

Spring Boot(二十一):RedisTemplate的String和Hash类型操作

RedisTemplate支持Redis提供的所有数据类型(包括String、Hash、List、Set和ZSet等),并提供灵活的配置选项和事务支持,方便开发者与Redis交互。

Redis中​的List类型是一个双向链表结构,​支持在头部或尾部进行元素的插入和删除操作,常用于实现队列、栈等场景。RedisTemplate对Redis中的List类型提供了多种操作方法,​通过opsForList(),​可以进行List的增删查操作。

一、基本操作

1、添加元素

1)将元素添加到列表的头部

Long leftPush(K var1, V var2);

返回值:操作后的列表长度

2)将元素添加到列表的尾部

Long rightPush(K var1, V var2);

返回值:操作后的列表长度

3)将多个元素批量添加到列表的头部

Long leftPushAll(K var1, V... var2);

返回值:操作后的列表长度

4)将多个元素批量添加到列表的尾部

Long rightPushAll(K var1, V... var2);

返回值:操作后的列表长度

示例:

复制代码
// 将元素添加到列表的头部
Long listLength = redisTemplate.opsForList().leftPush("news:user:1001", "news1");
log.info("leftPush listLength: {}", listLength);
// 将元素添加到列表的尾部
listLength = redisTemplate.opsForList().rightPush("news:user:1001", "news2");
log.info("rightPush listLength: {}", listLength);
// 将多个元素批量添加到列表的头部
listLength = redisTemplate.opsForList().leftPushAll("news:user:1001", "news3", "news4", "news5");
log.info("leftPushAll listLength: {}", listLength);
// 将多个元素批量添加到列表的尾部
listLength = redisTemplate.opsForList().rightPushAll("news:user:1001", "news6", "news7", "news8");
log.info("rightPushAll listLength: {}", listLength);

2、获取元素

1)根据索引获取列表中的元素

V index(K var1, long var2);

参数K var1:键值

参数long var2:索引(包含),为0时从头部第一个元素开始,可以为负数,-1表示最后一个元素

返回值V:指定索引的元素值

2)获取列表中指定范围的元素

List<String> range(K key, long start, long end);

参数:

key:键

start:起始索引(包含),为0时从头部第一个元素开始,可以为负数,-1表示最后一个元素

end:结束索引(包含),如果结束索引大于list的长度,则取从起始索引往后的所有数据

示例:

复制代码
// 根据索引获取列表中的元素
String value1 = redisTemplate.opsForList().index("news:user:1001", 0).toString();
log.info("index 0: {}", value1);
String valueInverse1 = redisTemplate.opsForList().index("news:user:1001", -1).toString();
log.info("index -1: {}", valueInverse1);
// 获取列表中指定范围的元素
List<String> values = redisTemplate.opsForList().range("news:user:1001", 0, 2);
log.info("values 0 2 : {}", values.toString());
values = redisTemplate.opsForList().range("news:user:1001", 0, 9);
log.info("values 0 9 : {}", values.toString());
values = redisTemplate.opsForList().range("news:user:1001", 0, -1);
log.info("values 0 -1 : {}", values.toString());
values = redisTemplate.opsForList().range("news:user:1001", 0, -3);
log.info("values 0 -3 : {}", values.toString());
values = redisTemplate.opsForList().range("news:user:1001", -3, -1);
log.info("values -3 -1 : {}", values.toString());

3、删除元素

1)从列表中删除指定值的元素

Long remove(K key, long count, Object value);

count > 0:从头部开始删除前count个匹配元素

count < 0:从尾部开始删除后count个匹配元素

count = 0:删除所有匹配元素

value:要删除的值

返回值:被删除的元素数量

2)从列表头部弹出一个元素

V leftPop(K key);

返回值:弹出的元素值

3)从列表尾部弹出一个元素

V rightPop(K key);

返回值:弹出的元素值

4、列表修剪

void trim(K key, long start, long end);

保留指定索引范围内的元素,其余删除

5、获取列表长度

Long size(K key);

返回值:列表的长度

6、设置列表中指定索引位置的元素值

void set(K key, long index, V value);

index:元素的索引

value:要设置的值

二、适用场景

1、消息队列

List类型可以用来实现简单的消息队列,生产者将消息放入队列,消费者从队列中取出消息进行处理

场景:异步任务处理、订单排队等需要先进先出的场景

2、栈

撤销操作、浏览历史记录等后进先出的场景

3、缓存最近访问的记录

可以使用List类型来缓存最近访问的记录,例如用户最近浏览的商品

4、任务调度

List类型可以用来实现任务调度,将任务放入队列中,然后由工作线程依次处理

5、分页查询

需要分页查询的数据也可以放到List中,如商品列表、评论

三、注意事项

1、索引范围

Redis的List的索引从0开始,-1表示最后一个元素,-2表示倒数第二个,以此类推

2、性能考虑

频繁的插入/删除操作在长列表中部时性能较低(链表结构特性)

使用trim和range时注意范围,避免全表扫描

相关推荐
2501_916007477 小时前
Windows OpenSSL 生成 iOS 证书,制作 p12 与描述文件,KXBuild 签名实操
windows·vscode·ios·objective-c·个人开发·swift·敏捷流程
CoderYanger7 小时前
Java EE 进阶:5. Spring IoC&DI(第三弹):Spring DI
java·开发语言·spring boot·spring·面试·java-ee·mvc
椒颜皮皮虾྅9 小时前
模型部署不再卡在环境上:DeploySharp 四大推理引擎与 Windows/Linux 离线交付实战
linux·运维·开发语言·人工智能·windows·计算机视觉·cuda
小蒜学长9 小时前
基于SpringBoot 框架的自媒体新闻系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·mysql数据库·自媒体新闻管理系统
昂好的day9 小时前
C# 同步异步与多线程:Thread / Task / 线程池一次讲透(上篇)
开发语言·windows·c#
垆边人似月.9 小时前
Ubuntu 配置 Samba 共享文件夹并映射到 Windows 完整指南
linux·windows·ubuntu
余槐i10 小时前
PostgreSQL 加索引后查询反而更慢:优化器弃用索引的 3 种情形
spring boot·redis·mysql·postgresql·事务
学长毕设19 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
BIBI204921 小时前
换 Git 托管平台怎么做?基于 TortoiseGit 的跨平台迁移教程
windows·git·tortoisegit·问题解决·版本控制·最佳实践