java - lua - cas

使用lua 实现cas操作

@Bean(name = "customStringRedisTemplate")
public RedisTemplate<String, String> customStringRedisTemplate(RedisConnectionFactory factory) {
return new StringRedisTemplate(factory);
}


@Autowired
private RedisTemplate<String, String> customStringRedisTemplate;


String luaCustomCas = "if redis.call('exists',KEYS[1]) == 1 then \n" +
" if redis.call('get', KEYS[1]) < ARGV[1] then\n" +
" redis.call('set', KEYS[1], ARGV[1])\n" +
" redis.call('expire', KEYS[1], ARGV[2])\n" +
" return 1\n" +
" else\n" +
" return 0\n" +
" end\n" +
"else\n" +
" redis.call('set',KEYS[1], ARGV[1])\n" +
" redis.call('expire', KEYS[1], ARGV[2])\n" +
" return 1\n" +
" end\n";
String key = "customKey";
customStringRedisTemplate.delete(key);
// 指定 lua 脚本,并且指定返回值类型
DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>(luaCustomCas, Long.class);
for (int i = 0; i < 2; i++) {
// 参数一:redisScript,参数二:key列表,参数三:arg(可多个)
Long result = customStringRedisTemplate.execute(redisScript, Collections.singletonList(key), "1", "100");
log.info("{}", result);
}
customStringRedisTemplate.delete(key);

 

posted @ 2020-09-27 15:35  郭星  阅读(301)  评论(0)    收藏  举报