SpringBoot中RedisTemplate与StringRedisTemplate常用Redis API速查
一、StringRedisTemplate 和 RedisTemplate 区别
1. StringRedisTemplate
@Autowired private StringRedisTemplate stringRedisTemplate;
特点:
- Key 默认使用
StringRedisSerializer - Value 默认使用
StringRedisSerializer - Redis 中存储的数据可直接查看
- 适合存储:
- String
- JSON字符串
- 计数器
- 缓存数据
例如:
stringRedisTemplate.opsForValue().set("user:1", "{\"name\":\"Tom\"}");
Redis中:
user:1
{"name":"Tom"}
2. RedisTemplate
@Autowired private RedisTemplate<String,Object> redisTemplate;
特点:
- 支持存储任意对象
- 默认使用 JDK 序列化
- Redis 中存储的是二进制数据
例如:
User user = new User();
user.setName("Tom");
redisTemplate.opsForValue().set("user:1", user);
Redis中看到:
\xac\xed\x00\x05sr...
3. 两者对比
| 对比项 | StringRedisTemplate | RedisTemplate |
|---|---|---|
| Key类型 | String | 泛型 |
| Value类型 | String | Object |
| 默认序列化 | StringSerializer | JDKSerializer |
| 可读性 | 高 | 低 |
| 性能 | 较高 | 较低 |
| 使用场景 | 缓存、计数器、Token | 存储对象 |
二、StringRedisTemplate 常见操作
1.String(字符串)操作
获得操作对象:
ValueOperations<String,String> ops = stringRedisTemplate.opsForValue();
(1) set
设置值
ops.set("name","Tom");
返回值:
void
Redis:
name=Tom
(2) set(带过期时间)
ops.set(
"name",
"Tom",
10,
TimeUnit.MINUTES
);
说明:
- 设置缓存
- 10分钟后自动过期
返回值:
void
(3) setIfAbsent(SETNX)
不存在才设置
Boolean result = ops.setIfAbsent("lock","1");
返回:
true
表示设置成功
false
表示Key已存在
常用于:
- 分布式锁
(4) get
获取值
String value = ops.get("name");
返回:
Tom
(5) getAndSet
获取旧值并设置新值
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
返回:
追加后字符串长度
(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"
)
);
返回:
删除数量
(4) expire
设置过期时间
Boolean result = stringRedisTemplate.expire(
"name",
30,
TimeUnit.MINUTES
);
返回:
true false
(5) getExpire
获取剩余过期时间
Long expire = stringRedisTemplate.getExpire("name");
返回:
秒
指定单位:
Long expire = stringRedisTemplate.getExpire(
"name",
TimeUnit.MINUTES
);
(6) persist
取消过期时间
Boolean result = stringRedisTemplate.persist("name");
返回:
true false
(7) rename
重命名Key
stringRedisTemplate.rename(
"oldKey",
"newKey"
);
返回:
void
3.Hash 操作
相当于:
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
批量存储
Map<String,String> map = new HashMap<>();
map.put("name","Tom");
map.put("age","18");
stringRedisTemplate.opsForHash().putAll("user:1",map);
(4) entries
获取整个Hash
Map<Object,Object> map =
stringRedisTemplate
.opsForHash()
.entries("user:1");
(5) delete
删除字段
Long count = stringRedisTemplate
.opsForHash()
.delete(
"user:1",
"age"
);
返回:
删除数量
(6) hasKey
判断字段存在
Boolean result = stringRedisTemplate
.opsForHash()
.hasKey(
"user:1",
"name"
);
4.List 操作
(1) leftPush
头插
Long size = stringRedisTemplate
.opsForList()
.leftPush(
"list",
"A"
);
返回:
插入后长度
(2) rightPush
尾插
Long size = stringRedisTemplate
.opsForList()
.rightPush(
"list",
"B"
);
(3) range
查询区间
List<String> list = stringRedisTemplate
.opsForList()
.range(
"list",
0,
-1
);
返回全部元素
(4) leftPop
头出队
String value = stringRedisTemplate
.opsForList()
.leftPop("list");
(5) rightPop
尾出队
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"
);
返回:
新增成功数量
(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
分数增加
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开始
三、RedisTemplate 常见操作
因为 RedisTemplate 支持对象存储,所以最常见的是:
RedisTemplate<String,Object>
1.存储对象
User user = new User(1L, "Tom");
redisTemplate.opsForValue()
.set(
"user:1",
user
);
2.获取对象
User user = (User) redisTemplate
.opsForValue()
.get("user:1");
3.setIfAbsent
setIfAbsent用于向 Redis 中设置一个键值对,如果该键不存在时才进行设置,同时设置这个键的过期时间,最后返回 true;如果键已经存,则不做任何修改并返回 false
下面的示例,设置键为 “lock” ,值为 UUID.randomUUID().toString() ,过期时间为 30 秒
Boolean lock = redisTemplate
.opsForValue()
.setIfAbsent(
"lock",
UUID.randomUUID().toString(),
30,
TimeUnit.SECONDS
);
这是分布式锁常用写法。
3.Hash存储对象
Hash 类似于 Java 中的 Map。
存值和修改值使用 put :
// 相当于:
//Map<String, user> userMap = new HashMap<>();
//userMap.put(user.getId(),user);
redisTemplate.opsForHash()
.put(
"userMap",
user.getId(),
user
);
// 相当于:
//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);
如果要把整个 Map 存储到 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"
);
实际项目常用写法
利用 Bean 转 Map:
Map<String,Object> map = BeanUtil.beanToMap(user);
redisTemplate.opsForHash().putAll("user_1", map);
所以:Hash存储对象
本质上就是把Java对象拆成Redis Hash
4.multiSet批量存储
普通写法:
Map<String,Object> map = new HashMap<>();
map.put("user:1","Tom");
map.put("user:2","Jerry");
map.put("user:3","Lucy");
//执行了3此设置,三次网络交互
redisTemplate.opsForValue().set("user:1","Tom");
redisTemplate.opsForValue().set("user:2","Jerry");
redisTemplate.opsForValue().set("user:3","Lucy");
批量存储:
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 是值的多个Redis键值对一次进行批量存储,不是 Hash。
5.List存储
redisTemplate.opsForList()
.rightPush(
"orderQueue",
"order1"
);
redisTemplate.opsForList()
.rightPush(
"orderQueue",
"order2"
);
Redis 中:
orderQueue: order1 order2
查询:
将范围设定为从 0 到 -1,即提取该列表从头到尾的所有数据。如果该键不存在或对应的列表为空,则返回一个空列表。
List<Object> list = redisTemplate
.opsForList()
.range(
"orderQueue",
0,
-1
);
四、总结
| Java结构 | Redis结构 | Template操作 |
|---|---|---|
| String | String | opsForValue() |
| Object | String(Value) | opsForValue() |
| Map | Hash | opsForHash() |
| List | List | opsForList() |
| Set | Set | opsForSet() |
| TreeSet/排行榜 | ZSet | opsForZSet() |
可以记住一个核心原则:
opsForValue()
一个Key对应一个Value
opsForHash()
一个Key对应多个Field-Value
opsForList()
一个Key对应一个列表
opsForSet()
一个Key对应一个无序集合
opsForZSet()
一个Key对应一个带分数(score)的有序集合
在实际 Spring Boot 项目里,最常用的其实是:
opsForValue() // 缓存对象、缓存JSON opsForHash() // 用户信息、配置项 opsForZSet() // 排行榜
五、开发中最常用的 Redis 场景
1 缓存
ops.set(
"product:1001",
json,
30,
TimeUnit.MINUTES
);
2 分布式锁
Boolean success =
ops.setIfAbsent(
lockKey,
uuid,
30,
TimeUnit.SECONDS
);
3 计数器
ops.increment(
"article:view:1"
);
4 排行榜
opsForZSet()
.incrementScore(
"rank",
userId,
score
);
5 消息队列(简单场景)
opsForList()
.rightPush(
"queue",
message
);
6 用户签到
opsForSet()
.add(
"sign:20260801",
userId
);
以上就是SpringBoot中RedisTemplate与StringRedisTemplate常用Redis API速查的详细内容,更多关于SpringBoot常用Redis API速查的资料请关注脚本之家其它相关文章!
相关文章
Java线程队列LinkedBlockingQueue的使用
本文主要介绍了Java线程队列LinkedBlockingQueue的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-06-06
idea中javaweb的jsp页面图片加载不出来问题及解决
这篇文章主要介绍了idea中javaweb的jsp页面图片加载不出来问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-07-07


最新评论