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