jedis操作Lua脚本测试

2020-04-16 17:11:00 浏览数 (1)

代码语言:javascript复制
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脚本

代码语言:javascript复制
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 thenn"  
              "return niln"  
              "elsen"  
              "local hongBao = redis.call('rpop', KEYS[1]);n"  
//            "print('hongBao:', hongBao);n"  
              "if hongBao thenn"  
              "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"  
              "endn"  
              "endn"  
              "return nil";  

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

0 人点赞