RedisTemplate没有setNx怎么办
什么是RedisTemplate:
Jedis是Redis官方推荐的面向Java的操作Redis的客户端,而RedisTemplate是SpringDataRedis中对JedisApi的高度封装。
SpringDataRedis相对于Jedis来说可以方便地更换Redis的Java客户端,比Jedis多了自动管理连接池的特性,方便与其他Spring框架进行搭配使用如:SpringCache
原生jedis效率优于redisTemplate。
什么是setNx:
setNx是Jedis提供的一个api,做的是一个原子性操作。英文全称为:set if not exists;顾名思义就是“如果不存在,我就设置。”
很多人利用setNx的特性,实现分布式锁,幂等性检查等等功能。
RedisTemplate没有setNx:
RedisTemplate不想Jedis提供了setNx的Api。所以我们用RedisTemplate的时候,可以自己手动的定义setNx:
private boolean setNx(String key, String value, long expires, TimeUnit timeUnit)
{
boolean flag = false;
try {
flag = (boolean) redisTemplate.execute((RedisCallback<Boolean>) connection -> connection.set(key.getBytes(), value.getBytes(), Expiration.from(expires, timeUnit), RedisStringCommands.SetOption.ifAbsent()));
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
四个参数:
- key:就是key。setNx就是通过key来判断是否存在。
- value:就是value。这个value对于setNx来说并不重要。
- expires:过期时间,setNx作为锁来使用的话必须要有一个过期时间,避免死锁。
- timeUnit: 过期时间的单位。 时分秒。。。。
好了 基本已经讲完,欢迎大家评论区指出不足,一起学习进步!
大家看完了点个赞,码字不容易啊。。。