Spring Boot中Redis的使用、添加依赖和配置Redis详见这篇文章:
SpringRedisTemplate的简介、序列化方式和适用场景详见这篇文章:
Spring Boot(十八):RedisTemplate和StringRedisTemplate
下面我们来介绍下StringRedisTemplate的常用方法和注意事项
首先,我们通过Spring的依赖注入机制,自动将一个StringRedisTemplate类型的Bean注入到当前类的stringRedisTemplate字段中
@Autowired
private StringRedisTemplate stringRedisTemplate;
基本操作
opsForValue是StringRedisTemplate提供的一个方法,用于获取Redis中的字符串操作接口,通过这个接口,可以执行各种与字符串相关的操作,例如设置值、获取值、追加值等。
1. set(String key, String value)
设置键值对,将指定的键key和值value存储到Redis中
// 设置键值对,将键为name,值为Luna的数据存入Redis
stringRedisTemplate.opsForValue().set("name", "Luna");
set(String key, String value, long timeout, TimeUnit unit):设置键值对的同时,设置键的过期时间,timeout表示过期时间的长度,unit表示时间单位,如秒、分钟等。
stringRedisTemplate.opsForValue().set("name", "Nora", 60, TimeUnit.MINUTES);
2. get(String key)
根据键获取对应的值,如果键不存在,则返回null
// 根据键获取对应的值
String name = stringRedisTemplate.opsForValue().get("name");
log.info("name:{}", name);
// 如果键不存在,则返回null
String nullTest = stringRedisTemplate.opsForValue().get("null:test");
log.info("nullTest:{}", nullTest);
3. delete(String key)
删除指定的键及其对应的值
// 删除键name及其对应的值
stringRedisTemplate.delete("name");
4. hasKey(String key)
检查指定的键是否存在,如果存在,返回true,否则返回false
boolean isExists = stringRedisTemplate.hasKey("name");
过期时间操作
1. expire(String key, long timeout, TimeUnit unit)
为指定的键设置过期时间,timeout表示过期时间的长度,unit表示时间单位,如秒、分钟等。
stringRedisTemplate.expire("name", 60, TimeUnit.SECONDS);
2. getExpire(String key)
获取指定键的剩余过期时间,单位为秒,如果键没有设置过期时间,则返回-1,如果键不存在,则返回-2
long remainSeconds = stringRedisTemplate.getExpire("name");
批量操作
1. multiSet(Map<String, String> keyValueMap)
批量设置键值对
Map<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
stringRedisTemplate.opsForValue().multiSet(map);
2. List<String> multiGet(List<String> keyList)
批量获取键值
List<String> valList = stringRedisTemplate.opsForValue().multiGet(Arrays.asList("key1", "key2"));
事务操作
1. enableTransactionSupport
这个属性的含义是:是否启用事务支持,默认是禁用的(即false),需要显式的设置为true,一般情况下在Redis的配置类中显示启用,如果没有启动的话,会报错:ERR EXEC without MULTI
@Configuration
@EnableTransactionManagement
public class RedisConfig {
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory) {
StringRedisTemplate template = new StringRedisTemplate(connectionFactory);
// 显式启用事务支持
template.setEnableTransactionSupport(true);
return template;
}
}
2. 事务操作的命令
multi():开启一个事务
exec():执行事务中的所有操作
discard():取消事务中的所有操作
3. 忘记执行exec
如果开启事务后(执行multi命令)忘记提交(执行exec命令),事务中的命令不会被执行,直到执行exec或discard或超时断开。如果事务长时间未提交,可能会导致Redis服务器的性能下降,为了避免忘记执行exec或discard,建议在代码中使用try-finally。
4. 事务示例
// 开启事务
stringRedisTemplate.multi();
try {
// 添加事务中的操作
stringRedisTemplate.opsForValue().set("key1", "value1");
stringRedisTemplate.opsForValue().set("key2", "value2");
// 执行事务
stringRedisTemplate.exec();
} catch (Exception e) {
// 如果报错,取消事务
stringRedisTemplate.discard();
log.error("redis事务报错,e:{}", e);
}
注意事项
1. 更多操作方法见官方文档或者源代码
以上只是介绍了StringRedisTemplate的常用方法,更多方法比如setIfAbsent、setIfPresent等可以查看官方文档或者源代码
2. StringRedisTemplate是线程安全的
StringRedisTemplate是线程安全的,在Spring Boot应用中,通常会将其注入到服务层或控制器中,多个线程可以共享同一个StringRedisTemplate实例。
3. 不显式设置键值对的过期时间,则键值对不会自动过期
在使用StringRedisTemplate时,如果不显式设置键值对的过期时间,则键值对不会自动过期,数据会一直存储在Redis中,直到手动删除或Redis服务器被清空。
4. 键的命名规则建议
在 Redis 中,键的命名通常建议使用冒号(:)来分隔不同的命名空间,这样可以清晰地表示键的层级关系和所属模块。
若您想了解更多内容,请关注公众号:图南随笔,vx:tunan66666