之前用 redisTemplate 实现setnx exptime 时 是分两步的
- redisTemplate.setIfAbsent
- redisTemplate.expire
这样的不是原子性的 可能在第一步与第二步之间 重新发布了或者服务器重启了 这个key就永远不会消失了 可以采用以下的方法
public static boolean setIfAbsent(final String key, final Serializable value, final long exptime) {
Boolean b = (Boolean) redisTemplate.execute(new RedisCallback<Boolean>() {
@Override
public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
RedisSerializer valueSerializer = redisTemplate.getValueSerializer();
RedisSerializer keySerializer = redisTemplate.getKeySerializer();
Object obj = connection.execute("set", keySerializer.serialize(key),
valueSerializer.serialize(value),
SafeEncoder.encode("NX"),
SafeEncoder.encode("EX"),
Protocol.toByteArray(exptime));
return obj != null;
}
});
return b;
}
转载链接:http://events.jianshu.io/p/ce51463bf2e9
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...