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时注意范围,避免全表扫描