redis-lua脚本
2017-09-27 09:55
190 查看
redis支持lua脚本,lua脚本的详细语法和简绍不在这篇文章的总结范围。这里只说一下redis和lua的结合。
对应到lua中,参数则是table类型的变量,键名可以通过KEY
(n从1开始)取值。参数则通过ARGV
(n从1开始)取值
示例
原子性
redis执行lua脚本是原子性的,因此可以作为事务的解决方案。脚本缓存
为了加快速度,redis在load脚本的时候会生成一个sha加密的token,使用evalsha命令可以传入token执行缓存中的脚本。evalsha命令
参数分别为sha token,键的数量,键名和参数。在jedis中则有多个重载的方法对应到lua中,参数则是table类型的变量,键名可以通过KEY
(n从1开始)取值。参数则通过ARGV
(n从1开始)取值
清除缓存
调用script flush命令示例
/** * * 执行lua脚本 * * @param scriptName * @param script * @param keyCount * @param params * @return */ public static Object evalScript(String scriptName,String script,int keyCount,String ... params) { logger.info("JedisUtil.evalScript.start,scriptName="+scriptName+",\n script=["+script+"]"); Jedis jedis = new Jedis(HOST, PORT); jedis.auth(PASSWORD); String sha = jedis.get("script-sha-"+scriptName); logger.info("JedisUtil.evalScript.start,scriptName="+scriptName+",sha="+sha); if(sha==null || "".equals(sha) || !jedis.scriptExists(sha)) { sha = jedis.scriptLoad(script); jedis.set("script-sha-"+scriptName, sha); logger.info("JedisUtil.evalScript.start,new sha="+sha); } logger.info("JedisUtil.evalScript.start,scriptName="+scriptName+",script="+script); Object retValue = jedis.evalsha(sha, keyCount, params); logger.info("JedisUtil.evalScript.end,retValue="+retValue); return retValue; }
/** * * 清除lua脚本缓存 * * @return */ public static boolean flushScript() { logger.info("JedisUtil.flushScript.start"); Jedis jedis = new Jedis(HOST, PORT); jedis.auth(PASSWORD); String retValue = jedis.scriptFlush(); logger.info("JedisUtil.flushScript.end,retValue="+retValue); if("OK".equals(retValue.toUpperCase())) { return true; } else { return false; } }
private final static String GET_JSON_SCRIPT = "redis.log(redis.LOG_NOTICE, \"get json start\") " + "if redis.call(\"EXISTS\", KEYS[1]) == 1 then " + " redis.log(redis.LOG_NOTICE, \"get json,key:\" .. KEYS[1]) " + " local payload = redis.call(\"GET\", KEYS[1]) " + " redis.log(redis.LOG_NOTICE, \"get json,payload:\" .. payload) " + " local value = cjson.decode(payload)[ARGV[1]] " + " redis.log(redis.LOG_NOTICE, \"get json,value:\" .. value) " + " return value " + "else " + " redis.log(redis.LOG_NOTICE, \"get json,not found key,key:\" .. KEYS[1]) " + " return nil " + "end"; private final static String GET_JSON_SCRIPT_NAME = "GET_JSON_SCRIPT";
/** * * 获得json格式数据的值 * * @param key * @param jsonKey * @return */ public static Object getJson(String key, String jsonKey) { logger.info("JedisUtil.getJson.start,key="+key+",jsonKey="+jsonKey); Jedis jedis = new Jedis(HOST, PORT); jedis.auth(PASSWORD); Object retValue = evalScript(GET_JSON_SCRIPT_NAME,GET_JSON_SCRIPT,1,key,jsonKey); logger.info("JedisUtil.getJson.end,retValue="+retValue); return retValue; }
public static void main(String[] args) { try { JedisUtil.set("test", "{\"a\":\"s\",\"b\":\"t\"}"); //JedisUtil.flushScript(); Object retValue = JedisUtil.getJson("test", "b"); System.out.println("----------------"+retValue+"----------------"); } catch (Exception e) { e.printStackTrace(); } }
相关文章推荐
- redis中的事务、lua脚本和管道的使用场景
- redis与lua脚本的结合使用
- 一个Lua脚本操作Redis的简单例子
- c#中用lua脚本执行redis命令
- Redis高级特性之Lua脚本
- Lua 脚本 Lua 脚本功能是 Reids 2.6 版本的最大亮点, 通过内嵌对 Lua 环境的支持, Redis 解决了长久以来不能高效地处理 CAS (check-and-set)命令的缺点,
- 在redis中使用lua脚本
- Redis进阶实践之八Lua的Cjson在Linux下安装、使用和用C#调用Lua脚本
- Redis系列学习笔记13 Lua 脚本
- lua脚本操作redis数据库
- Redis学习-LUA脚本
- Redis中使用Lua脚本的开发思路
- 简介Lua脚本与Redis数据库的结合使用
- Redis 2.6 Lua脚本功能实现分析
- Redis学习笔记(八)redis之lua脚本学习
- 关于redis的pipline和lua脚本
- 在Spring中使用Redis Lua脚本批量删除缓存
- StackExchange.Redis加载Lua脚本进行模糊查询的批量删除和修改
- redis的lua脚本拓展,返回nil及其判断
- Redis执行Lua脚本示例