目录
- [一、StringRedisTemplate 和 RedisTemplate 区别](#一、StringRedisTemplate 和 RedisTemplate 区别)
-
- [1. StringRedisTemplate](#1. StringRedisTemplate)
- [2. RedisTemplate](#2. RedisTemplate)
- [3. 两者对比](#3. 两者对比)
- [二、StringRedisTemplate 常见操作](#二、StringRedisTemplate 常见操作)
-
- 1.String(字符串)操作
-
- [(1) set](#(1) set)
- [(2) set(带过期时间)](#(2) set(带过期时间))
- [(3) setIfAbsent(SETNX)](#(3) setIfAbsent(SETNX))
- [(4) get](#(4) get)
- [(5) getAndSet](#(5) getAndSet)
- [(6) increment](#(6) increment)
- [(7) decrement](#(7) decrement)
- [(8) append](#(8) append)
- [(9) multiGet](#(9) multiGet)
- [2.Key 操作](#2.Key 操作)
-
- [(1) hasKey](#(1) hasKey)
- [(2) delete](#(2) delete)
- [(3) 批量删除](#(3) 批量删除)
- [(4) expire](#(4) expire)
- [(5) getExpire](#(5) getExpire)
- [(6) persist](#(6) persist)
- [(7) rename](#(7) rename)
- [3.Hash 操作](#3.Hash 操作)
-
- [(1) put](#(1) put)
- [(2) get](#(2) get)
- [(3) putAll](#(3) putAll)
- [(4) entries](#(4) entries)
- [(5) delete](#(5) delete)
- [(6) hasKey](#(6) hasKey)
- [4.List 操作](#4.List 操作)
-
- [(1) leftPush](#(1) leftPush)
- [(2) rightPush](#(2) rightPush)
- [(3) range](#(3) range)
- [(4) leftPop](#(4) leftPop)
- [(5) rightPop](#(5) rightPop)
- [(6) size](#(6) size)
- [5.Set 操作](#5.Set 操作)
-
- [(1) add](#(1) add)
- [(2) members](#(2) members)
- [(3) isMember](#(3) isMember)
- [(4) remove](#(4) remove)
- [(5) size](#(5) size)
- 6.ZSet(有序集合)操作
-
- [(1) add](#(1) add)
- [(2) incrementScore](#(2) incrementScore)
- [(3) range](#(3) range)
- [(4) reverseRange](#(4) reverseRange)
- [(5) rank](#(5) rank)
- [三、RedisTemplate 常见操作](#三、RedisTemplate 常见操作)
- 四、总结
- [五、开发中最常用的 Redis 场景](#五、开发中最常用的 Redis 场景)
-
-
- [1 缓存](#1 缓存)
- [2 分布式锁](#2 分布式锁)
- [3 计数器](#3 计数器)
- [4 排行榜](#4 排行榜)
- [5 消息队列(简单场景)](#5 消息队列(简单场景))
- [6 用户签到](#6 用户签到)
-
一、StringRedisTemplate 和 RedisTemplate 区别
1. StringRedisTemplate
java
@Autowired
private StringRedisTemplate stringRedisTemplate;
特点:
- Key 默认使用
StringRedisSerializer - Value 默认使用
StringRedisSerializer - Redis 中存储的数据可直接查看
- 适合存储:
- String
- JSON字符串
- 计数器
- 缓存数据
例如:
java
stringRedisTemplate.opsForValue().set("user:1", "{\"name\":\"Tom\"}");
Redis中:
text
user:1
{"name":"Tom"}
2. RedisTemplate
java
@Autowired
private RedisTemplate<String,Object> redisTemplate;
特点:
- 支持存储任意对象
- 默认使用 JDK 序列化
- Redis 中存储的是二进制数据
例如:
java
User user = new User();
user.setName("Tom");
redisTemplate.opsForValue().set("user:1", user);
Redis中看到:
text
\xac\xed\x00\x05sr...
3. 两者对比
| 对比项 | StringRedisTemplate | RedisTemplate |
|---|---|---|
| Key类型 | String | 泛型 |
| Value类型 | String | Object |
| 默认序列化 | StringSerializer | JDKSerializer |
| 可读性 | 高 | 低 |
| 性能 | 较高 | 较低 |
| 使用场景 | 缓存、计数器、Token | 存储对象 |
二、StringRedisTemplate 常见操作
1.String(字符串)操作
获得操作对象:
java
ValueOperations<String,String> ops = stringRedisTemplate.opsForValue();
(1) set
设置值
java
ops.set("name","Tom");
返回值:
java
void
Redis:
text
name=Tom
(2) set(带过期时间)
java
ops.set(
"name",
"Tom",
10,
TimeUnit.MINUTES
);
说明:
- 设置缓存
- 10分钟后自动过期
返回值:
java
void
(3) setIfAbsent(SETNX)
不存在才设置
java
Boolean result = ops.setIfAbsent("lock","1");
返回:
java
true
表示设置成功
java
false
表示Key已存在
常用于:
- 分布式锁
(4) get
获取值
java
String value = ops.get("name");
返回:
java
Tom
(5) getAndSet
获取旧值并设置新值
java
String old = ops.getAndSet(
"name",
"Jerry"
);
返回:
java
Tom
(6) increment
自增
java
Long result = stringRedisTemplate
.boundValueOps("count")
.increment(1);
返回:
java
自增后的值
例如:
java
1
2
3
...
(7) decrement
自减
java
Long result =
stringRedisTemplate
.boundValueOps("count")
.increment(-1);
返回:
java
自减后的值
(8) append
追加字符串
java
Integer length = ops.append(
"name",
"_java"
);
Redis:
text
Tom_java
返回:
java
追加后字符串长度
(9) multiGet
批量获取
java
List<String> list = ops.multiGet(
Arrays.asList(
"k1",
"k2",
"k3"
)
);
返回:
java
List<String>
2.Key 操作
(1) hasKey
判断Key是否存在
java
Boolean exists = stringRedisTemplate.hasKey("name");
返回:
java
true
false
(2) delete
删除Key
java
Boolean result =
stringRedisTemplate.delete("name");
返回:
java
true
false
(3) 批量删除
java
Long count = stringRedisTemplate.delete(
Arrays.asList(
"k1",
"k2"
)
);
返回:
java
删除数量
(4) expire
设置过期时间
java
Boolean result = stringRedisTemplate.expire(
"name",
30,
TimeUnit.MINUTES
);
返回:
java
true
false
(5) getExpire
获取剩余过期时间
java
Long expire = stringRedisTemplate.getExpire("name");
返回:
java
秒
指定单位:
java
Long expire = stringRedisTemplate.getExpire(
"name",
TimeUnit.MINUTES
);
(6) persist
取消过期时间
java
Boolean result = stringRedisTemplate.persist("name");
返回:
java
true
false
(7) rename
重命名Key
java
stringRedisTemplate.rename(
"oldKey",
"newKey"
);
返回:
java
void
3.Hash 操作
相当于:
text
user:1
{
name:Tom,
age:18
}
(1) put
java
stringRedisTemplate.opsForHash()
.put(
"user:1",
"name",
"Tom"
);
返回:
java
void
(2) get
java
Object value = stringRedisTemplate.opsForHash()
.get(
"user:1",
"name"
);
返回:
java
Tom
(3) putAll
批量存储
java
Map<String,String> map = new HashMap<>();
map.put("name","Tom");
map.put("age","18");
stringRedisTemplate.opsForHash().putAll("user:1",map);
(4) entries
获取整个Hash
java
Map<Object,Object> map =
stringRedisTemplate
.opsForHash()
.entries("user:1");
(5) delete
删除字段
java
Long count = stringRedisTemplate
.opsForHash()
.delete(
"user:1",
"age"
);
返回:
java
删除数量
(6) hasKey
判断字段存在
java
Boolean result = stringRedisTemplate
.opsForHash()
.hasKey(
"user:1",
"name"
);
4.List 操作
(1) leftPush
头插
java
Long size = stringRedisTemplate
.opsForList()
.leftPush(
"list",
"A"
);
返回:
java
插入后长度
(2) rightPush
尾插
java
Long size = stringRedisTemplate
.opsForList()
.rightPush(
"list",
"B"
);
(3) range
查询区间
java
List<String> list = stringRedisTemplate
.opsForList()
.range(
"list",
0,
-1
);
返回全部元素
(4) leftPop
头出队
java
String value = stringRedisTemplate
.opsForList()
.leftPop("list");
(5) rightPop
尾出队
java
String value = stringRedisTemplate
.opsForList()
.rightPop("list");
(6) size
java
Long size = stringRedisTemplate
.opsForList()
.size("list");
5.Set 操作
(1) add
添加元素
java
Long count = stringRedisTemplate
.opsForSet()
.add(
"user:set",
"1",
"2",
"3"
);
返回:
java
新增成功数量
(2) members
获取全部元素
java
Set<String> set = stringRedisTemplate
.opsForSet()
.members(
"user:set"
);
(3) isMember
判断元素是否存在
java
Boolean result = stringRedisTemplate
.opsForSet()
.isMember(
"user:set",
"1"
);
(4) remove
删除元素
java
Long count = stringRedisTemplate
.opsForSet()
.remove(
"user:set",
"1"
);
(5) size
java
Long size = stringRedisTemplate
.opsForSet()
.size("user:set");
6.ZSet(有序集合)操作
适用于:
- 排行榜
- 热搜榜
- 积分榜
(1) add
java
Boolean result = stringRedisTemplate
.opsForZSet()
.add(
"rank",
"Tom",
100
);
score:
java
100
(2) incrementScore
分数增加
java
Double score = stringRedisTemplate
.opsForZSet()
.incrementScore(
"rank",
"Tom",
10
);
返回:
java
最新score
(3) range
升序查询
java
Set<String> set = stringRedisTemplate
.opsForZSet()
.range(
"rank",
0,
9
);
(4) reverseRange
降序查询
java
Set<String> set = stringRedisTemplate
.opsForZSet()
.reverseRange(
"rank",
0,
9
);
(5) rank
获取排名
java
Long rank = stringRedisTemplate
.opsForZSet()
.rank(
"rank",
"Tom"
);
注意:
java
从0开始
三、RedisTemplate 常见操作
因为 RedisTemplate 支持对象存储,所以最常见的是:
java
RedisTemplate<String,Object>
1.存储对象
java
User user = new User(1L, "Tom");
redisTemplate.opsForValue()
.set(
"user:1",
user
);
2.获取对象
java
User user = (User) redisTemplate
.opsForValue()
.get("user:1");
3.setIfAbsent
setIfAbsent用于向 Redis 中设置一个键值对,如果该键不存在时才进行设置,同时设置这个键的过期时间,最后返回 true;如果键已经存,则不做任何修改并返回 false
下面的示例,设置键为 "lock" ,值为 UUID.randomUUID().toString() ,过期时间为 30 秒
java
Boolean lock = redisTemplate
.opsForValue()
.setIfAbsent(
"lock",
UUID.randomUUID().toString(),
30,
TimeUnit.SECONDS
);
这是分布式锁常用写法。
3.Hash存储对象
Hash 类似于 Java 中的 Map。
存值和修改值使用 put :
java
// 相当于:
//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 :
java
Map<String,Object> userMap = new HashMap<>();
userMap.put("name","Tom");
userMap.put("age",18);
redisTemplate.opsForHash()
.putAll(
"userMap",
map
);
取值:
java
Object age = redisTemplate
.opsForHash()
.get(
"user_1",
"age"
);
实际项目常用写法
利用 Bean 转 Map:
java
Map<String,Object> map = BeanUtil.beanToMap(user);
redisTemplate.opsForHash().putAll("user_1", map);
所以:Hash存储对象
本质上就是把Java对象拆成Redis Hash
4.multiSet批量存储
普通写法:
java
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");
批量存储:
java
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存储
java
redisTemplate.opsForList()
.rightPush(
"orderQueue",
"order1"
);
redisTemplate.opsForList()
.rightPush(
"orderQueue",
"order2"
);
Redis 中:
tex
orderQueue:
order1
order2
查询:
将范围设定为从 0 到 -1,即提取该列表从头到尾的所有数据。如果该键不存在或对应的列表为空,则返回一个空列表。
java
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() |
可以记住一个核心原则:
tex
opsForValue()
一个Key对应一个Value
opsForHash()
一个Key对应多个Field-Value
opsForList()
一个Key对应一个列表
opsForSet()
一个Key对应一个无序集合
opsForZSet()
一个Key对应一个带分数(score)的有序集合
在实际 Spring Boot 项目里,最常用的其实是:
tex
opsForValue() // 缓存对象、缓存JSON
opsForHash() // 用户信息、配置项
opsForZSet() // 排行榜
五、开发中最常用的 Redis 场景
1 缓存
java
ops.set(
"product:1001",
json,
30,
TimeUnit.MINUTES
);
2 分布式锁
java
Boolean success =
ops.setIfAbsent(
lockKey,
uuid,
30,
TimeUnit.SECONDS
);
3 计数器
java
ops.increment(
"article:view:1"
);
4 排行榜
java
opsForZSet()
.incrementScore(
"rank",
userId,
score
);
5 消息队列(简单场景)
java
opsForList()
.rightPush(
"queue",
message
);
6 用户签到
java
opsForSet()
.add(
"sign:20260801",
userId
);
参考: