redis lua脚本

该博客介绍了两种在Redis中使用Lua脚本的方法,适用于单机和集群场景。方式一利用Spring的StringRedisTemplate,通过条件判断实现数据的获取与更新,能适应单机和集群模式。方式二则通过RedisScript执行lua脚本,适用于单机环境,使用ARGV参数传递额外信息。
摘要由CSDN通过智能技术生成

redis 使用lua脚本 用两种方式

方式一

此方式支持单机及集群场景

 	@Resource(name = "cluster.RedisSingleTemplate")
    private StringRedisTemplate stringRedisTemplate;
    
    private static final String LUA_SCRIPT_GET_AND_DELETE =
            "local current = redis.call('get', KEYS[1] )\n" +
                    "  current = tonumber(current)\n" +
                    "if (current  < 50) then\n" +
                    "    current = 1525 \n" +
                    "end\n" +
                    "return current\n";

    @Test
    public void test(){
        List<String> keys = new ArrayList<>();
        keys.add("testKey");
        List<String> args = new ArrayList<>();

        Long result = stringRedisTemplate.execute(new RedisCallback<Long>() {
            @Override
            public Long doInRedis(RedisConnection connection) throws DataAccessException {
                Object nativeConnection = connection.getNativeConnection();
                // 集群模式
                if (nativeConnection instanceof JedisCluster) {
                    return (Long) ((JedisCluster) nativeConnection).eval(LUA_SCRIPT_GET_AND_DELETE, keys, args);
                }

                // 单机模式
                else if (nativeConnection instanceof Jedis) {
                    return (Long) ((Jedis) nativeConnection).eval(LUA_SCRIPT_GET_AND_DELETE, keys, args);
                }
                return 0L;
            }
        });
        System.err.println(result);
    }

方式二

此方式只支持单机场景

	@Resource(name = "RedisSingleTemplate")
	private StringRedisTemplate redisTemplate;
	
	private static final String LUA_SCRIPT_GET_AND_DELETE =
	        "local current = redis.call('get', KEYS[1] )\n" +
	                "  current = tonumber(current)\n" +
	                "if (current  > 50) then\n" +
	                "    current = 1525 \n" +
	                "end\n" +
	                "return current\n";
	
	@Test
	public void test(){
	    List<String> keys = new ArrayList<>();
	    keys.add("testKey");
	    RedisScript<Long> script = new DefaultRedisScript<>(LUA_SCRIPT_GET_AND_DELETE,Long.class);
	    Long data = redisTemplate.execute(script, keyList, "args1", "args2");
	    System.err.println(data);
	} 

redisTemplate.execute(script, keyList, “args1”, “args2”);
args1, args2为非必传参数
在LUA脚本中使用 ARGV[1] ARGV[2] 来获取使用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>