1. 程式人生 > >redis呼叫lua指令碼

redis呼叫lua指令碼

前言

在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();
			}
		}
	}