前言
在redis中很多基本操作都是原子操作.但是缺少事务的概念,所幸的是redis支持lua脚本,可以利用lua脚本实现事务特性.
代码
/**
* 执行比 较对应key值大小,更新较大值 的lua脚本
* @param key
* @param time
* @return
*/
public Object updateHigherIntWithLua(String key, long time){
String script = "if redis.call('EXISTS',KEYS[1])~=0 then\n"
+"local tmp = redis.call('get',KEYS[1])\n"
+"if tonumber(tmp)<tonumber(KEYS[2]) then\n"
+"redis.call('set',KEYS[1],KEYS[2])\n"
+"end\n"
+"return 1\n"
+"else\n"
+"redis.call('set',KEYS[1],KEYS[2])\n"
+"return 0\n"
+"end";
return executeLua(script, 2, key, String.valueOf(time));
}
/**
* redis执行lua脚本
* @param lua
* @param keyCount
* @param params
* @return
*/
public Object executeLua(String lua, int keyCount, String... params){
Jedis jedis = null;
try {
jedis = pool.getResource();
return jedis.eval(lua, keyCount, params);
} finally {
if (null != jedis){
jedis.close();
}
}
}