jedis操作Lua脚本测试

jedis操作lua脚本测试

Java代码 收藏代码

import static org.hamcrest.CoreMatchers.equalTo;  

import java.util.ArrayList;
import java.util.List;  

import org.hamcrest.CoreMatchers;
import org.hamcrest.Matcher;
import org.junit.Test;  

import redis.clients.jedis.BinaryJedis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.exceptions.JedisConnectionException;
import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.jedis.tests.utils.ClientKillerUtil;
import redis.clients.util.SafeEncoder;  

public class ScriptingCommandsTest extends JedisCommandTestBase {  

  @SuppressWarnings("unchecked")
  @Test
  public void evalMultiBulk() {  

    String script = "return {
KEYS[1],KEYS[2],ARGV[1],ARGV[2],ARGV[3]
}";
    List<String> keys = new ArrayList<String>();
    keys.add("key1");
    keys.add("key2");  

    List<String> args = new ArrayList<String>();
    args.add("first");
    args.add("second");
    args.add("third");  

    List<String> response = (List<String>) jedis.eval(script, keys, args);  

    assertEquals(5, response.size());
    assertEquals("key1", response.get(0));
    assertEquals("key2", response.get(1));
    assertEquals("first", response.get(2));
    assertEquals("second", response.get(3));
    assertEquals("third", response.get(4));  

}  

  @SuppressWarnings("unchecked")
  @Test
  public void evalMultiBulkWithBinaryJedis() {  

    String script = "return {
KEYS[1],KEYS[2],ARGV[1],ARGV[2],ARGV[3]
}";
    List<byte[]> keys = new ArrayList<byte[]>();
    keys.add("key1".getBytes());
    keys.add("key2".getBytes());  

    List<byte[]> args = new ArrayList<byte[]>();
    args.add("first".getBytes());
    args.add("second".getBytes());
    args.add("third".getBytes());  

    BinaryJedis binaryJedis = new BinaryJedis(hnp.getHost(), hnp.getPort(), 500);
    binaryJedis.connect();
    binaryJedis.auth("foobared");  

    List<byte[]> responses = (List<byte[]>) binaryJedis.eval(script.getBytes(), keys, args);
    assertEquals(5, responses.size());
    assertEquals("key1", new String(responses.get(0)));
    assertEquals("key2", new String(responses.get(1)));
    assertEquals("first", new String(responses.get(2)));
    assertEquals("second", new String(responses.get(3)));
    assertEquals("third", new String(responses.get(4)));  

    binaryJedis.close();  

}  

  @Test
  public void evalBulk() {  

    String script = "return KEYS[1]";
    List<String> keys = new ArrayList<String>();
    keys.add("key1");  

    List<String> args = new ArrayList<String>();
    args.add("first");  

    String response = (String) jedis.eval(script, keys, args);  

    assertEquals("key1", response);  

}  

  @Test
  public void evalInt() {  

    String script = "return 2";
    List<String> keys = new ArrayList<String>();
    keys.add("key1");  

    Long response = (Long) jedis.eval(script, keys, new ArrayList<String>());  

    assertEquals(new Long(2), response);  

}  

  @Test
  public void evalNestedLists() {  

    String script = "return {
 {
KEYS[1]
} , {
2
}
}";
    List<?> results = (List<?>) jedis.eval(script, 1, "key1");  

    assertThat((List<String>) results.get(0), listWithItem("key1"));
    assertThat((List<Long>) results.get(1), listWithItem(2L));  

}  

  @Test
  public void evalNoArgs() {  

    String script = "return KEYS[1]";
    List<String> keys = new ArrayList<String>();
    keys.add("key1");
    String response = (String) jedis.eval(script, keys, new ArrayList<String>());  

    assertEquals("key1", response);  

}  

  @Test
  public void evalsha() {  

    jedis.set("foo", "bar");
    jedis.eval("return redis.call('get','foo')");
    String result = (String) jedis.evalsha("6b1bf486c81ceb7edf3c093f4c48582e38c0e791");  

    assertEquals("bar", result);  

}  

  @Test(expected = JedisDataException.class)
  public void evalshaShaNotFound() {  

    jedis.evalsha("ffffffffffffffffffffffffffffffffffffffff");  

}  

  @Test
  public void scriptFlush() {  

    jedis.set("foo", "bar");
    jedis.eval("return redis.call('get','foo')");
    jedis.scriptFlush();
    assertFalse(jedis.scriptExists("6b1bf486c81ceb7edf3c093f4c48582e38c0e791"));  

}  

  @Test
  public void scriptExists() {  

    jedis.scriptLoad("return redis.call('get','foo')");
    List<Boolean> exists = jedis.scriptExists("ffffffffffffffffffffffffffffffffffffffff",
      "6b1bf486c81ceb7edf3c093f4c48582e38c0e791");
    assertFalse(exists.get(0));
    assertTrue(exists.get(1));  

}  

  @Test
  public void scriptExistsBinary() {  

    jedis.scriptLoad(SafeEncoder.encode("return redis.call('get','foo')"));
    List<Long> exists = jedis.scriptExists(
      SafeEncoder.encode("ffffffffffffffffffffffffffffffffffffffff"),
      SafeEncoder.encode("6b1bf486c81ceb7edf3c093f4c48582e38c0e791"));
    assertEquals(new Long(0), exists.get(0));
    assertEquals(new Long(1), exists.get(1));  

}  

  @Test
  public void scriptLoad() {  

    jedis.scriptLoad("return redis.call('get','foo')");
    assertTrue(jedis.scriptExists("6b1bf486c81ceb7edf3c093f4c48582e38c0e791"));  

}  

  @Test
  public void scriptLoadBinary() {  

    jedis.scriptLoad(SafeEncoder.encode("return redis.call('get','foo')"));
    Long exists = jedis
        .scriptExists(SafeEncoder.encode("6b1bf486c81ceb7edf3c093f4c48582e38c0e791"));
    assertEquals((Long) 1L, exists);  

}  

  @Test
  public void scriptKill() {  

    try {  

      jedis.scriptKill();  

} catch (JedisDataException e) {  

      assertTrue(e.getMessage().contains("No scripts in execution right now."));  

}  

}  

  @Test
  public void scriptEvalReturnNullValues() {  

    jedis.del("key1");
    jedis.del("key2");  

    String script = "return {
redis.call('hget',KEYS[1],ARGV[1]),redis.call('hget',KEYS[2],ARGV[2])
}";
    List<String> results = (List<String>) jedis.eval(script, 2, "key1", "key2", "1", "2");
    assertEquals(2, results.size());
    assertNull(results.get(0));
    assertNull(results.get(1));  

}  

  @Test
  public void scriptEvalShaReturnNullValues() {  

    jedis.del("key1");
    jedis.del("key2");  

    String script = "return {
redis.call('hget',KEYS[1],ARGV[1]),redis.call('hget',KEYS[2],ARGV[2])
}";
    String sha = jedis.scriptLoad(script);
    List<String> results = (List<String>) jedis.evalsha(sha, 2, "key1", "key2", "1", "2");
    assertEquals(2, results.size());
    assertNull(results.get(0));
    assertNull(results.get(1));  

}  

  @Test
  public void scriptExistsWithBrokenConnection() {  

    Jedis deadClient = new Jedis(jedis.getClient().getHost(), jedis.getClient().getPort());
    deadClient.auth("foobared");  

    deadClient.clientSetname("DEAD");  

    ClientKillerUtil.killClient(deadClient, "DEAD");  

    // sure, script doesn't exist, but it's just for checking connection
    try {  

      deadClient.scriptExists("abcdefg");  

} catch (JedisConnectionException e) {  

      // ignore it  

}  

    assertEquals(true, deadClient.getClient().isBroken());  

    deadClient.close();  

}  

  private <T> Matcher<Iterable<? super T>> listWithItem(T expected) {  

    return CoreMatchers.<T> hasItem(equalTo(expected));  

}  

}

网友写的抢红包的lua脚本

static String tryGetHongBaoScript =
//          "local bConsumed = redis.call('hexists', KEYS[3], KEYS[4]);\n"
//          + "print('bConsumed:' ,bConsumed);\n"
            "if redis.call('hexists', KEYS[3], KEYS[4]) ~= 0 then\n"
            + "return nil\n"
            + "else\n"
            + "local hongBao = redis.call('rpop', KEYS[1]);\n"
//          + "print('hongBao:', hongBao);\n"
            + "if hongBao then\n"
            + "local x = cjson.decode(hongBao);\n"
            + "x['userId'] = KEYS[4];\n"
            + "local re = cjson.encode(x);\n"
            + "redis.call('hset', KEYS[3], KEYS[4], KEYS[4]);\n"
            + "redis.call('lpush', KEYS[2], re);\n"
            + "return re;\n"
            + "end\n"
            + "end\n"
            + "return nil";

看起来不可思议,这种适合先load,然后用evalsha方法

原文链接:[http://wely.iteye.com/blog/2363204]

时间: 2024-09-15 18:45:58

jedis操作Lua脚本测试的相关文章

sysbench自定义lua脚本实现实际的业务逻辑压力测试

使用sysbench进行mysql的oltp测试,一般的测试在sysbench中在tests/db中提供了一个oltp.lua脚本可以进行oltp的压力测试. 但不能完全模拟自己实际业务的压力测试,不同的业务,数据结构,数据量都是不一样的,为了更接近实际业务的读写压力测试,就得自己写lua脚本,然后通过sysbench进行压力测试. 写这个lua脚本很简单,只需要会写lua脚本就可以了. 1.首先收集实际业务的访问数据库的sql: 2.准备一台恢复好的备份库(从线上导一个) 3.将收集的sql写

C语言中通过LUA API访问LUA脚本变量的简单例子_Lua

1.简介 这一节介绍一些关于栈操作.数据类型判断的LUA API,可以使用这些函数获得脚本中的变量值. 2.步骤 编写 test01.lua 脚本,在VS2003中创建控制台C++程序并正确配置,执行查看结果,修改test02.lua脚本后查看执行结果 3.测试脚本 以下是用来测试的lua脚本 复制代码 代码如下: function plustwo(x)          local a = 2;          return x+a; end; rows = 6; cols = plustw

Redis脚本插件之————执行Lua脚本示例

Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行.使用脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成.使用脚本,减少了网络往返时延. 2.原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入. 3.复用:客户端发送的脚本会永久存储在Redis中,意味着其他客户端可以复用这一脚本而不需要使用代码完成同样的逻辑. 实现一个访问频率控制,某个ip在短时间内频繁访问页面

阿里云Redis LUA脚本功能上线——轻量嵌入,极速扩展,业务轻松跨平台

    阿里云Redis云数据库,全面支持LUA脚本功能,助力企业轻松迁移自建Redis数据库的业务逻辑,实现业务的跨平台复用,快速驱动业务上云.LUA语言作为目前最流行的轻量级嵌入式脚本语言,凭借其语法简单.高效稳定.支持复杂数据结构以及自动内存管理等特点,已经在众多著名的游戏程序中大量被使用,如:愤怒的小鸟.星际争霸.魔兽世界等. 了解Redis详细配置及价格>> Redis支持LUA脚本的主要优势      LUA脚本的融合将使Redis数据库产生更多的使用场景,迸发更多新的优势: 高效

Lua 脚本语法说明(转)

Lua脚本语法说明(增加lua5.1部份特性) Lua 的语法比较简单,学习起来也比较省力,但功能却并不弱. 所以,我只简单的归纳一下Lua的一些语法规则,使用起来方便好查就可以了.估计看完了,就懂得怎么写Lua程序了. 在Lua中,一切都是变量,除了关键字. I.  首先是注释 写一个程序,总是少不了注释的. 在Lua中,你可以使用单行注释和多行注释. 单行注释中,连续两个减号"--"表示注释的开始,一直延续到行末为止.相当于C++语言中的"//". 多行注释中,

redis4.0之Lua脚本新姿势

前言 Redis内嵌了Lua环境来支持用户扩展功能,但是出于数据一致性考虑,要求脚本必须是纯函数的形式,也就是说对于一段Lua脚本给定相同的参数,写入Redis的数据也必须是相同的,对于随机性的写入Redis是拒绝的. 从Redis 3.2开始Lua脚本支持随机性写入,最近在总结4.0的新特性,索性就都归到4.0里,方便查阅. Redis中的Lua脚本 1. Lua脚本简介 在Redis中使用Lua脚本不可避免的要用到以下三个命令:EVAL.EVALSHA和SCRIPT,下面我们来简单介绍一下:

Lua 脚本 C++ 封装库 LuaWrapper

为什么要用Lua作脚本? 使用Lua作脚本,主要是因为它小巧玲珑(体积小,运行快),而且它的语法又比较简单明了.不过,使用LuaAPI将Lua引擎集成到程序中,确实有一些不方便--用落木随风网友的话来说,就是"就象用汇编".当然,现在你不用再这么辛苦了,因为你可以使用LuaWrapper For C++.使用这个工具,在C++中集成Lua脚本就是轻而易举的事.你原有的C++函数和类,几乎不需要任何改变,就可以与Lua脚本共享. 我们接下来,用实例来说明,如何用LuaWrapper来集成

【COCOS2DX-LUA 脚本开发之四】使用TOLUA++编译PKG,从而创建自定义类让LUA脚本使用

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/lua-game/1259.html 此篇基本[COCOS2DX(2.X)_LUA开发之三]在LUA中使用自定义精灵(LUA脚本与自创建类之间的访问)及LUA基础讲解 在Lua第三篇中介绍了,如何在cocos2dx中使用Lua创建自定义类供Lua脚本调用使用,当时出于Himi对Lua研究不够深入,所以当时使用了笨方法手动添加的方式进行的,那么

Java中使用Jedis操作Redis

使用Java操作Redis需要jedis-2.1.0.jar,下载地址:http://files.cnblogs.com/liuling/jedis-2.1.0.jar.zip 如果需要使用Redis连接池的话,还需commons-pool-1.5.4.jar,下载地址:http://files.cnblogs.com/liuling/commons-pool-1.5.4.jar.zip 1 package com.test; 2 3 import java.util.HashMap; 4 im