redis呼叫lua指令碼
阿新 • • 發佈:2019-02-14
前言
在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(); } } }