Spring Boot(十九):StringRedisTemplate的常用方法和注意事项

Spring Boot中Redis的使用、添加依赖和配置Redis详见这篇文章:

Spring Boot(十七):集成和使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值