SpringBoot中RedisTemplate與StringRedisTemplate常用Redis API速查
一、StringRedisTemplate 和 RedisTemplate 區(qū)別
1. StringRedisTemplate
@Autowired private StringRedisTemplate stringRedisTemplate;
特點(diǎn):
- Key 默認(rèn)使用
StringRedisSerializer - Value 默認(rèn)使用
StringRedisSerializer - Redis 中存儲(chǔ)的數(shù)據(jù)可直接查看
- 適合存儲(chǔ):
- String
- JSON字符串
- 計(jì)數(shù)器
- 緩存數(shù)據(jù)
例如:
stringRedisTemplate.opsForValue().set("user:1", "{\"name\":\"Tom\"}");
Redis中:
user:1
{"name":"Tom"}
2. RedisTemplate
@Autowired private RedisTemplate<String,Object> redisTemplate;
特點(diǎn):
- 支持存儲(chǔ)任意對(duì)象
- 默認(rèn)使用 JDK 序列化
- Redis 中存儲(chǔ)的是二進(jìn)制數(shù)據(jù)
例如:
User user = new User();
user.setName("Tom");
redisTemplate.opsForValue().set("user:1", user);
Redis中看到:
\xac\xed\x00\x05sr...
3. 兩者對(duì)比
| 對(duì)比項(xiàng) | StringRedisTemplate | RedisTemplate |
|---|---|---|
| Key類(lèi)型 | String | 泛型 |
| Value類(lèi)型 | String | Object |
| 默認(rèn)序列化 | StringSerializer | JDKSerializer |
| 可讀性 | 高 | 低 |
| 性能 | 較高 | 較低 |
| 使用場(chǎng)景 | 緩存、計(jì)數(shù)器、Token | 存儲(chǔ)對(duì)象 |
二、StringRedisTemplate 常見(jiàn)操作
1.String(字符串)操作
獲得操作對(duì)象:
ValueOperations<String,String> ops = stringRedisTemplate.opsForValue();
(1) set
設(shè)置值
ops.set("name","Tom");
返回值:
void
Redis:
name=Tom
(2) set(帶過(guò)期時(shí)間)
ops.set(
"name",
"Tom",
10,
TimeUnit.MINUTES
);
說(shuō)明:
- 設(shè)置緩存
- 10分鐘后自動(dòng)過(guò)期
返回值:
void
(3) setIfAbsent(SETNX)
不存在才設(shè)置
Boolean result = ops.setIfAbsent("lock","1");
返回:
true
表示設(shè)置成功
false
表示Key已存在
常用于:
- 分布式鎖
(4) get
獲取值
String value = ops.get("name");
返回:
Tom
(5) getAndSet
獲取舊值并設(shè)置新值
String old = ops.getAndSet(
"name",
"Jerry"
);
返回:
Tom
(6) increment
自增
Long result = stringRedisTemplate
.boundValueOps("count")
.increment(1);
返回:
自增后的值
例如:
1 2 3 ...
(7) decrement
自減
Long result =
stringRedisTemplate
.boundValueOps("count")
.increment(-1);
返回:
自減后的值
(8) append
追加字符串
Integer length = ops.append(
"name",
"_java"
);
Redis:
Tom_java
返回:
追加后字符串長(zhǎng)度
(9) multiGet
批量獲取
List<String> list = ops.multiGet(
Arrays.asList(
"k1",
"k2",
"k3"
)
);
返回:
List<String>
2.Key 操作
(1) hasKey
判斷Key是否存在
Boolean exists = stringRedisTemplate.hasKey("name");
返回:
true false
(2) delete
刪除Key
Boolean result =
stringRedisTemplate.delete("name");
返回:
true false
(3) 批量刪除
Long count = stringRedisTemplate.delete(
Arrays.asList(
"k1",
"k2"
)
);
返回:
刪除數(shù)量
(4) expire
設(shè)置過(guò)期時(shí)間
Boolean result = stringRedisTemplate.expire(
"name",
30,
TimeUnit.MINUTES
);
返回:
true false
(5) getExpire
獲取剩余過(guò)期時(shí)間
Long expire = stringRedisTemplate.getExpire("name");
返回:
秒
指定單位:
Long expire = stringRedisTemplate.getExpire(
"name",
TimeUnit.MINUTES
);
(6) persist
取消過(guò)期時(shí)間
Boolean result = stringRedisTemplate.persist("name");
返回:
true false
(7) rename
重命名Key
stringRedisTemplate.rename(
"oldKey",
"newKey"
);
返回:
void
3.Hash 操作
相當(dāng)于:
user:1
{
name:Tom,
age:18
}
(1) put
stringRedisTemplate.opsForHash()
.put(
"user:1",
"name",
"Tom"
);
返回:
void
(2) get
Object value = stringRedisTemplate.opsForHash()
.get(
"user:1",
"name"
);
返回:
Tom
(3) putAll
批量存儲(chǔ)
Map<String,String> map = new HashMap<>();
map.put("name","Tom");
map.put("age","18");
stringRedisTemplate.opsForHash().putAll("user:1",map);
(4) entries
獲取整個(gè)Hash
Map<Object,Object> map =
stringRedisTemplate
.opsForHash()
.entries("user:1");
(5) delete
刪除字段
Long count = stringRedisTemplate
.opsForHash()
.delete(
"user:1",
"age"
);
返回:
刪除數(shù)量
(6) hasKey
判斷字段存在
Boolean result = stringRedisTemplate
.opsForHash()
.hasKey(
"user:1",
"name"
);
4.List 操作
(1) leftPush
頭插
Long size = stringRedisTemplate
.opsForList()
.leftPush(
"list",
"A"
);
返回:
插入后長(zhǎng)度
(2) rightPush
尾插
Long size = stringRedisTemplate
.opsForList()
.rightPush(
"list",
"B"
);
(3) range
查詢區(qū)間
List<String> list = stringRedisTemplate
.opsForList()
.range(
"list",
0,
-1
);
返回全部元素
(4) leftPop
頭出隊(duì)
String value = stringRedisTemplate
.opsForList()
.leftPop("list");
(5) rightPop
尾出隊(duì)
String value = stringRedisTemplate
.opsForList()
.rightPop("list");
(6) size
Long size = stringRedisTemplate
.opsForList()
.size("list");
5.Set 操作
(1) add
添加元素
Long count = stringRedisTemplate
.opsForSet()
.add(
"user:set",
"1",
"2",
"3"
);
返回:
新增成功數(shù)量
(2) members
獲取全部元素
Set<String> set = stringRedisTemplate
.opsForSet()
.members(
"user:set"
);
(3) isMember
判斷元素是否存在
Boolean result = stringRedisTemplate
.opsForSet()
.isMember(
"user:set",
"1"
);
(4) remove
刪除元素
Long count = stringRedisTemplate
.opsForSet()
.remove(
"user:set",
"1"
);
(5) size
Long size = stringRedisTemplate
.opsForSet()
.size("user:set");
6.ZSet(有序集合)操作
適用于:
- 排行榜
- 熱搜榜
- 積分榜
(1) add
Boolean result = stringRedisTemplate
.opsForZSet()
.add(
"rank",
"Tom",
100
);
score:
100
(2) incrementScore
分?jǐn)?shù)增加
Double score = stringRedisTemplate
.opsForZSet()
.incrementScore(
"rank",
"Tom",
10
);
返回:
最新score
(3) range
升序查詢
Set<String> set = stringRedisTemplate
.opsForZSet()
.range(
"rank",
0,
9
);
(4) reverseRange
降序查詢
Set<String> set = stringRedisTemplate
.opsForZSet()
.reverseRange(
"rank",
0,
9
);
(5) rank
獲取排名
Long rank = stringRedisTemplate
.opsForZSet()
.rank(
"rank",
"Tom"
);
注意:
從0開(kāi)始
三、RedisTemplate 常見(jiàn)操作
因?yàn)?RedisTemplate 支持對(duì)象存儲(chǔ),所以最常見(jiàn)的是:
RedisTemplate<String,Object>
1.存儲(chǔ)對(duì)象
User user = new User(1L, "Tom");
redisTemplate.opsForValue()
.set(
"user:1",
user
);
2.獲取對(duì)象
User user = (User) redisTemplate
.opsForValue()
.get("user:1");
3.setIfAbsent
setIfAbsent用于向 Redis 中設(shè)置一個(gè)鍵值對(duì),如果該鍵不存在時(shí)才進(jìn)行設(shè)置,同時(shí)設(shè)置這個(gè)鍵的過(guò)期時(shí)間,最后返回 true;如果鍵已經(jīng)存,則不做任何修改并返回 false
下面的示例,設(shè)置鍵為 “lock” ,值為 UUID.randomUUID().toString() ,過(guò)期時(shí)間為 30 秒
Boolean lock = redisTemplate
.opsForValue()
.setIfAbsent(
"lock",
UUID.randomUUID().toString(),
30,
TimeUnit.SECONDS
);
這是分布式鎖常用寫(xiě)法。
3.Hash存儲(chǔ)對(duì)象
Hash 類(lèi)似于 Java 中的 Map。
存值和修改值使用 put :
// 相當(dāng)于:
//Map<String, user> userMap = new HashMap<>();
//userMap.put(user.getId(),user);
redisTemplate.opsForHash()
.put(
"userMap",
user.getId(),
user
);
// 相當(dāng)于:
//Map<String, Object> user_1 = new HashMap<>();
//user_1.put("name","Tom");
//user_1.put("age","18");
redisTemplate.opsForHash()
.put("user_1",
"name",
"Tom");
redisTemplate.opsForHash()
.put("user_1",
"age",
18);
如果要把整個(gè) Map 存儲(chǔ)到 redis ,可以使用 putAll :
Map<String,Object> userMap = new HashMap<>();
userMap.put("name","Tom");
userMap.put("age",18);
redisTemplate.opsForHash()
.putAll(
"userMap",
map
);
取值:
Object age = redisTemplate
.opsForHash()
.get(
"user_1",
"age"
);
實(shí)際項(xiàng)目常用寫(xiě)法
利用 Bean 轉(zhuǎn) Map:
Map<String,Object> map = BeanUtil.beanToMap(user);
redisTemplate.opsForHash().putAll("user_1", map);
所以:Hash存儲(chǔ)對(duì)象
本質(zhì)上就是把Java對(duì)象拆成Redis Hash
4.multiSet批量存儲(chǔ)
普通寫(xiě)法:
Map<String,Object> map = new HashMap<>();
map.put("user:1","Tom");
map.put("user:2","Jerry");
map.put("user:3","Lucy");
//執(zhí)行了3此設(shè)置,三次網(wǎng)絡(luò)交互
redisTemplate.opsForValue().set("user:1","Tom");
redisTemplate.opsForValue().set("user:2","Jerry");
redisTemplate.opsForValue().set("user:3","Lucy");
批量存儲(chǔ):
Map<String,Object> map = new HashMap<>();
map.put("user:1","Tom");
map.put("user:2","Jerry");
map.put("user:3","Lucy");
redisTemplate.opsForValue() .multiSet(map);
注意:
multiSet 是值的多個(gè)Redis鍵值對(duì)一次進(jìn)行批量存儲(chǔ),不是 Hash。
5.List存儲(chǔ)
redisTemplate.opsForList()
.rightPush(
"orderQueue",
"order1"
);
redisTemplate.opsForList()
.rightPush(
"orderQueue",
"order2"
);
Redis 中:
orderQueue: order1 order2
查詢:
將范圍設(shè)定為從 0 到 -1,即提取該列表從頭到尾的所有數(shù)據(jù)。如果該鍵不存在或?qū)?yīng)的列表為空,則返回一個(gè)空列表。
List<Object> list = redisTemplate
.opsForList()
.range(
"orderQueue",
0,
-1
);
四、總結(jié)
| Java結(jié)構(gòu) | Redis結(jié)構(gòu) | Template操作 |
|---|---|---|
| String | String | opsForValue() |
| Object | String(Value) | opsForValue() |
| Map | Hash | opsForHash() |
| List | List | opsForList() |
| Set | Set | opsForSet() |
| TreeSet/排行榜 | ZSet | opsForZSet() |
可以記住一個(gè)核心原則:
opsForValue()
一個(gè)Key對(duì)應(yīng)一個(gè)Value
opsForHash()
一個(gè)Key對(duì)應(yīng)多個(gè)Field-Value
opsForList()
一個(gè)Key對(duì)應(yīng)一個(gè)列表
opsForSet()
一個(gè)Key對(duì)應(yīng)一個(gè)無(wú)序集合
opsForZSet()
一個(gè)Key對(duì)應(yīng)一個(gè)帶分?jǐn)?shù)(score)的有序集合
在實(shí)際 Spring Boot 項(xiàng)目里,最常用的其實(shí)是:
opsForValue() // 緩存對(duì)象、緩存JSON opsForHash() // 用戶信息、配置項(xiàng) opsForZSet() // 排行榜
五、開(kāi)發(fā)中最常用的 Redis 場(chǎng)景
1 緩存
ops.set(
"product:1001",
json,
30,
TimeUnit.MINUTES
);
2 分布式鎖
Boolean success =
ops.setIfAbsent(
lockKey,
uuid,
30,
TimeUnit.SECONDS
);
3 計(jì)數(shù)器
ops.increment(
"article:view:1"
);
4 排行榜
opsForZSet()
.incrementScore(
"rank",
userId,
score
);
5 消息隊(duì)列(簡(jiǎn)單場(chǎng)景)
opsForList()
.rightPush(
"queue",
message
);
6 用戶簽到
opsForSet()
.add(
"sign:20260801",
userId
);
以上就是SpringBoot中RedisTemplate與StringRedisTemplate常用Redis API速查的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot常用Redis API速查的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
一個(gè)Java中BigDecimal的問(wèn)題記錄
這篇文章主要給大家介紹了關(guān)于Java中一個(gè)BigDecimal問(wèn)題的相關(guān)資料,通過(guò)文中介紹的方法可以很方便的解決BigDecimal進(jìn)行計(jì)算的時(shí)候不管怎么計(jì)算,最后得到的值都沒(méi)有變化的問(wèn)題,需要的朋友可以參考下2021-11-11
Java線程隊(duì)列LinkedBlockingQueue的使用
本文主要介紹了Java線程隊(duì)列LinkedBlockingQueue的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
idea中javaweb的jsp頁(yè)面圖片加載不出來(lái)問(wèn)題及解決
這篇文章主要介紹了idea中javaweb的jsp頁(yè)面圖片加載不出來(lái)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
高可用架構(gòu)etcd選主故障主備秒級(jí)切換實(shí)現(xiàn)
這篇文章主要為大家介紹了高可用架構(gòu)etcd選主故障主備秒級(jí)切換的實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-02-02
Java Socket實(shí)現(xiàn)多人聊天系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java Socket實(shí)現(xiàn)多人聊天系統(tǒng),具有圖形界面,實(shí)現(xiàn)文件傳輸功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Java集合Iterator迭代的實(shí)現(xiàn)方法
這篇文章主要介紹了Java集合Iterator迭代接口的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒家,對(duì)Java 結(jié)合iterator知識(shí)感興趣的朋友一起看看吧2016-08-08
在IDEA里Git特別慢的問(wèn)題及解決過(guò)程
IDEA中Git操作慢的問(wèn)題可以通過(guò)重命名`runnerw.exe`和`runnerw64.exe`文件來(lái)解決,這可能是由于殺毒軟件或防火墻攔截導(dǎo)致的2025-12-12
Java 動(dòng)態(tài)代理你真的懂了嗎(動(dòng)態(tài)和代理)
動(dòng)態(tài)代理分兩部分,動(dòng)態(tài)和代理,今天通過(guò)本文給大家普及代碼模式及動(dòng)態(tài)代理的概念及示例代碼,感興趣的朋友跟隨小編一起看看吧2021-07-07
Spring Cloud實(shí)現(xiàn)5分鐘級(jí)區(qū)域切換的操作方法
Spring Cloud 2023.x通過(guò)智能路由預(yù)熱、多活數(shù)據(jù)同步和自動(dòng)化流量切換,實(shí)現(xiàn)5分鐘內(nèi)完成跨區(qū)域故障轉(zhuǎn)移,本文以某電商平臺(tái)從AWS亞太切換至阿里云華東的實(shí)戰(zhàn)為例,詳解關(guān)鍵技術(shù)路徑,需要的朋友可以參考下2025-04-04

