Spring Boot:RedisTemplate的List類型操作
RedisTemplate支持Redis提供的所有數(shù)據(jù)類型(包括String、Hash、List、Set和ZSet等),并提供靈活的配置選項(xiàng)和事務(wù)支持,方便開(kāi)發(fā)者與Redis交互。
Redis中的List類型是一個(gè)雙向鏈表結(jié)構(gòu),支持在頭部或尾部進(jìn)行元素的插入和刪除操作,常用于實(shí)現(xiàn)隊(duì)列、棧等場(chǎng)景。RedisTemplate對(duì)Redis中的List類型提供了多種操作方法,通過(guò)opsForList(),可以進(jìn)行List的增刪查操作。
一、基本操作
1、添加元素
1)將元素添加到列表的頭部
Long leftPush(K key, V value);
返回值:操作后的列表長(zhǎng)度
2)將元素添加到列表的尾部
Long rightPush(K key, V value);
返回值:操作后的列表長(zhǎng)度
3)將多個(gè)元素批量添加到列表的頭部
Long leftPushAll(K key, V... values);
返回值:操作后的列表長(zhǎng)度
4)將多個(gè)元素批量添加到列表的尾部
Long rightPushAll(K key, V... values);
返回值:操作后的列表長(zhǎng)度
示例:
// 將元素添加到列表的頭部
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);
// 將多個(gè)元素批量添加到列表的頭部
listLength = redisTemplate.opsForList().leftPushAll("news:user:1001", "news3", "news4", "news5");
log.info("leftPushAll listLength: {}", listLength);
// 將多個(gè)元素批量添加到列表的尾部
listLength = redisTemplate.opsForList().rightPushAll("news:user:1001", "news6", "news7", "news8");
log.info("rightPushAll listLength: {}", listLength);
2、獲取元素
1)根據(jù)索引獲取列表中的元素
V index(K key, long index);
參數(shù)K var1:鍵值
參數(shù)long var2:索引(包含),為0時(shí)從頭部第一個(gè)元素開(kāi)始,可以為負(fù)數(shù),-1表示最后一個(gè)元素
返回值V:指定索引的元素值
2)獲取列表中指定范圍的元素
List<String> range(K key, long start, long end);
參數(shù):
key:鍵
start:起始索引(包含),為0時(shí)從頭部第一個(gè)元素開(kāi)始,可以為負(fù)數(shù),-1表示最后一個(gè)元素
end:結(jié)束索引(包含),如果結(jié)束索引大于list的長(zhǎng)度,則取從起始索引往后的所有數(shù)據(jù)
示例:
// 根據(jù)索引獲取列表中的元素
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:從頭部開(kāi)始刪除前count個(gè)匹配元素
count < 0:從尾部開(kāi)始刪除后count個(gè)匹配元素
count = 0:刪除所有匹配元素
value:要?jiǎng)h除的值
返回值:被刪除的元素?cái)?shù)量
2)從列表頭部彈出一個(gè)元素
V leftPop(K key);
返回值:彈出的元素值
3)從列表尾部彈出一個(gè)元素
V rightPop(K key);
返回值:彈出的元素值
4、列表修剪
void trim(K key, long start, long end);
保留指定索引范圍內(nèi)的元素,其余刪除
5、獲取列表長(zhǎng)度
Long size(K key);
返回值:列表的長(zhǎng)度
6、設(shè)置列表中指定索引位置的元素值
void set(K key, long index, V value);
index:元素的索引
value:要設(shè)置的值
二、適用場(chǎng)景
1、消息隊(duì)列
List類型可以用來(lái)實(shí)現(xiàn)簡(jiǎn)單的消息隊(duì)列,生產(chǎn)者將消息放入隊(duì)列,消費(fèi)者從隊(duì)列中取出消息進(jìn)行處理
場(chǎng)景:異步任務(wù)處理、訂單排隊(duì)等需要先進(jìn)先出的場(chǎng)景
2、棧
撤銷操作、瀏覽歷史記錄等后進(jìn)先出的場(chǎng)景
3、緩存最近訪問(wèn)的記錄
可以使用List類型來(lái)緩存最近訪問(wèn)的記錄,例如用戶最近瀏覽的商品
4、任務(wù)調(diào)度
List類型可以用來(lái)實(shí)現(xiàn)任務(wù)調(diào)度,將任務(wù)放入隊(duì)列中,然后由工作線程依次處理
5、分頁(yè)查詢
需要分頁(yè)查詢的數(shù)據(jù)也可以放到List中,如商品列表、評(píng)論
三、注意事項(xiàng)
1、索引范圍
Redis的List的索引從0開(kāi)始,-1表示最后一個(gè)元素,-2表示倒數(shù)第二個(gè),以此類推
2、性能考慮
頻繁的插入/刪除操作在長(zhǎng)列表中部時(shí)性能較低(鏈表結(jié)構(gòu)特性)
使用trim和range時(shí)注意范圍,避免全表掃描