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方法

相关文章
|
7月前
|
测试技术 Linux
VPS一键测试脚本,无痕体验+自动导出,服务器测试更轻松
NodeQuality 是一款整合 Yabs、IPQuality、NetQuality 等主流 VPS 测试脚本的全能工具,支持一键测试硬件性能、IP属性、网络质量,并新增分享与导出功能。其“无痕测试”设计不安装依赖、不留残留,兼容性强;测试结果自动排版、截图并生成分享链接,极大提升效率。适合需要全面、快速、干净测试 VPS 的用户,是运维和测评的高效利器。
561 3
|
7月前
|
存储 测试技术 API
数据驱动开发软件测试脚本
今天刚提交了我的新作《带着ChatGPT玩转软件开发》给出版社,在写作期间跟着ChatGPT学到许多新知识。下面分享数据驱动开发软件测试脚本。
271 0
|
9月前
|
Web App开发 JavaScript 测试技术
Playwright 极速入门:1 小时搞定环境搭建与首个测试脚本
本文带你1小时快速入门Playwright,完成环境搭建并编写首个测试脚本。Playwright是微软推出的现代化Web自动化测试工具,支持Chromium、Firefox和WebKit三大浏览器引擎,具备跨平台、多语言(Python/JS/Java/C#)特性。其核心优势包括:智能自动等待机制减少失败率、内置录制工具实时生成脚本、多语言灵活选择,以及真移动端设备模拟能力,显著提升测试效率和可靠性。
|
缓存 NoSQL 搜索推荐
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
本文介绍了如何通过Lua脚本在Redis中实现分布式锁的原子性操作,避免并发问题。首先讲解了Lua脚本的基本概念及其在Redis中的使用方法,包括通过`eval`指令执行Lua脚本和通过`script load`指令缓存脚本。接着详细展示了如何用Lua脚本实现加锁、解锁及可重入锁的功能,确保同一线程可以多次获取锁而不发生死锁。最后,通过代码示例演示了如何在实际业务中调用这些Lua脚本,确保锁操作的原子性和安全性。
744 6
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
|
前端开发 JavaScript 测试技术
使用ChatGPT生成登录产品代码的测试用例和测试脚本
使用ChatGPT生成登录产品代码的测试用例和测试脚本
418 35
|
监控 网络协议 Java
一些适合性能测试脚本编写和维护的工具
一些适合性能测试脚本编写和维护的工具
657 59
|
存储 监控 前端开发
如何确保测试脚本的稳定性和可靠性?
确保测试脚本的稳定性和可靠性是保证性能测试结果准确有效的关键
451 58
|
前端开发 JavaScript Java
通过ChatGPT生成测试用例和测试脚本(2)
通过ChatGPT生成测试用例和测试脚本
425 21
|
NoSQL Redis 数据库
Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
通过本文的介绍,我们详细讲解了 Lua 脚本在 Redis 中的作用、`eval` 命令的使用方法以及 `redis.call` 和 `redis.pcall` 的区别和用法。通过合理使用 Lua 脚本,可以实现复杂的业务逻辑,确保操作的原子性,并减少网络开销,从而提高系统的性能和可靠性。
915 13
|
存储 监控 测试技术
测试脚本编写和维护的最佳实践有哪些?
测试脚本编写和维护的最佳实践有哪些?
485 50