当前位置:   article > 正文

lua redis执行lua脚本_redis的public string getsha1(resource scriptresourc

redis的public string getsha1(resource scriptresource)

lua redis执行lua脚本

           

redis使用命令行、redis-cli客户端、redisTemplate执行lua脚本

       

              

                                    

命令行、客户端执行脚本

         

语法格式

  1. # 直接执行脚本(redis-cli客户端执行)
  2. eval lua-script key-num [key key2 key3 ...] [value value2 value3 ...]
  3. # 缓存脚本后执行(命令行执行,没有进入客户端)
  4. redis-cli --eval --lua-script [key key2 ...] , [value value2 ...]
  5. * key与value用逗号间隔,且逗号前后有空格)

          

lua 调用redis命令

  1. redis.call(command, KEYS[1], KEYS[2], ... , ARGV[1], ARGV[2], ...)
  2. # 命令说明
  3. KEYS[1]:第一个key
  4. ARGV[1]:第一个value
  5. KEYS、ARGV不需要一一对应,个数不需要相等
  6. # 示例
  7. redis.call('set', KEYS[1], ARGV[1])
  8. redis.call('get', KEYS[1])

          

示例:redis-cli客户端执行脚本

  1. huli@hudeMacBook-Pro ~ % docker exec -it redis2 bash
  2. -- redis-cli客户端
  3. root@0d79dbff702e:/data# redis-cli
  4. -- KEYS、ARGV名称是固定的,不能随便设置
  5. 127.0.0.1:6379> eval "redis.call('set',key[1],arg[1])" 1 set 瓜田李下
  6. (error) ERR Error running script (call to f_c7f25ef16dd21c6a4dc44cf3964041227459f25e): @enable_strict_lua:15: user_script:1: Script attempted to access nonexistent global variable 'key'
  7. -- set key=瓜田李下
  8. 127.0.0.1:6379> eval "redis.call('set',KEYS[1],ARGV[1])" 1 key 瓜田李下
  9. (nil)
  10. -- 获取key:没有return,无返回值
  11. 127.0.0.1:6379> eval "redis.call('get',KEYS[1])" 1 key
  12. (nil)
  13. -- 调用return,返回key对用的value(瓜田李下)
  14. -- 由于是中文,redis存储的时候进行了序列化
  15. 127.0.0.1:6379> eval "return redis.call('get',KEYS[1])" 1 key
  16. "\xe7\x93\x9c\xe7\x94\xb0\xe6\x9d\x8e\xe4\xb8\x8b"
  17. -- 设置key2=gtlx
  18. 127.0.0.1:6379> eval "redis.call('set',KEYS[1],ARGV[1])" 1 key2 gtlx
  19. (nil)
  20. -- 返回key2对应的value(瓜田李下)
  21. 127.0.0.1:6379> eval "return redis.call('get',KEYS[1])" 1 key2
  22. "gtlx"

           

示例:命令行执行脚本文件

  1. huli@hudeMacBook-Pro ~ % docker exec -it redis2 bash
  2. -- redis命令行生成脚本文件:test.lua
  3. root@0d79dbff702e:/data# echo "redis.call('set', KEYS[1], ARGV[1]) return redis.call('get',KEYS[1])" > test.lua
  4. -- 查看文件
  5. root@0d79dbff702e:/data# ls
  6. dump.rdb test.lua
  7. root@0d79dbff702e:/data# cat test.lua
  8. redis.call('set', KEYS[1], ARGV[1]) return redis.call('get',KEYS[1])
  9. -- 命令行执行文件
  10. root@0d79dbff702e:/data# redis-cli --eval test.lua key , gtlx
  11. "gtlx"

          

            

                                    

redisTemplate 执行脚本

         

***********

相关类与接口

       

RedisScript

  1. public interface RedisScript<T> {
  2. String getSha1();
  3. @Nullable
  4. Class<T> getResultType();
  5. String getScriptAsString();
  6. default boolean returnsRawValue() {
  7. return this.getResultType() == null;
  8. }
  9. static <T> RedisScript<T> of(String script) {
  10. return new DefaultRedisScript(script);
  11. }
  12. static <T> RedisScript<T> of(String script, Class<T> resultType) {
  13. Assert.notNull(script, "Script must not be null!");
  14. Assert.notNull(resultType, "ResultType must not be null!");
  15. return new DefaultRedisScript(script, resultType);
  16. }
  17. static <T> RedisScript<T> of(Resource resource) {
  18. Assert.notNull(resource, "Resource must not be null!");
  19. DefaultRedisScript<T> script = new DefaultRedisScript();
  20. script.setLocation(resource);
  21. return script;
  22. }
  23. static <T> RedisScript<T> of(Resource resource, Class<T> resultType) {
  24. Assert.notNull(resource, "Resource must not be null!");
  25. Assert.notNull(resultType, "ResultType must not be null!");
  26. DefaultRedisScript<T> script = new DefaultRedisScript();
  27. script.setResultType(resultType);
  28. script.setLocation(resource);
  29. return script;
  30. }
  31. }

       

DefaultRedisScript

  1. public class DefaultRedisScript<T> implements RedisScript<T>, InitializingBean {
  2. private final Object shaModifiedMonitor;
  3. @Nullable
  4. private ScriptSource scriptSource;
  5. @Nullable
  6. private String sha1;
  7. @Nullable
  8. private Class<T> resultType;
  9. public DefaultRedisScript() {
  10. this.shaModifiedMonitor = new Object();
  11. }
  12. public DefaultRedisScript(String script) {
  13. this(script, (Class)null);
  14. }
  15. public DefaultRedisScript(String script, @Nullable Class<T> resultType) {
  16. this.shaModifiedMonitor = new Object();
  17. this.setScriptText(script);
  18. this.resultType = resultType;
  19. }
  20. public void afterPropertiesSet() {
  21. Assert.state(this.scriptSource != null, "Either script, script location, or script source is required");
  22. }
  23. public String getSha1() {
  24. synchronized(this.shaModifiedMonitor) {
  25. if (this.sha1 == null || this.scriptSource.isModified()) {
  26. this.sha1 = DigestUtils.sha1DigestAsHex(this.getScriptAsString());
  27. }
  28. return this.sha1;
  29. }
  30. }
  31. @Nullable
  32. public Class<T> getResultType() {
  33. return this.resultType;
  34. }
  35. public String getScriptAsString() {
  36. try {
  37. return this.scriptSource.getScriptAsString();
  38. } catch (IOException var2) {
  39. throw new ScriptingException("Error reading script text", var2);
  40. }
  41. }
  42. public void setResultType(@Nullable Class<T> resultType) {
  43. this.resultType = resultType;
  44. }
  45. public void setScriptText(String scriptText) {
  46. this.scriptSource = new StaticScriptSource(scriptText);
  47. }
  48. public void setLocation(Resource scriptLocation) {
  49. this.scriptSource = new ResourceScriptSource(scriptLocation);
  50. }
  51. public void setScriptSource(ScriptSource scriptSource) {
  52. this.scriptSource = scriptSource;
  53. }
  54. }

         

RedisTemplate:stringRedisTemplate继承了redisTemplate,也可执行lua脚本

  1. public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware {
  2. public <T> T execute(RedisScript<T> script, List<K> keys, Object... args) {
  3. return this.scriptExecutor.execute(script, keys, args);
  4. }
  5. public <T> T execute(RedisScript<T> script, RedisSerializer<?> argsSerializer, RedisSerializer<T> resultSerializer, List<K> keys, Object... args) {
  6. return this.scriptExecutor.execute(script, argsSerializer, resultSerializer, keys, args);
  7. }

           

***********

示例

       

test.lua

                      

  1. redis.call("set",KEYS[1], ARGV[1])
  2. return redis.call("get", KEYS[1])

         

RedisLuaTest

  1. @Component
  2. public class RedisLuaTest {
  3. @Value("classpath:/lua/test.lua")
  4. private Resource resource;
  5. @javax.annotation.Resource
  6. private StringRedisTemplate stringRedisTemplate;
  7. @PostConstruct
  8. public void init(){
  9. DefaultRedisScript<String> redisScript = new DefaultRedisScript<>();
  10. redisScript.setLocation(resource);
  11. redisScript.setResultType(String.class);
  12. System.out.println("redisScript.getSha1():"+redisScript.getSha1());
  13. System.out.println("redisScript.getScriptAsString():"+redisScript.getScriptAsString());
  14. String value = stringRedisTemplate.execute(redisScript, Collections.singletonList("key"), "瓜田李下");
  15. System.out.println(value);
  16. }
  17. }

        

控制台输出

  1. 2022-06-19 19:50:59.094 INFO 886 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 4 ms. Found 0 Redis repository interfaces.
  2. 2022-06-19 19:50:59.378 INFO 886 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
  3. 2022-06-19 19:50:59.384 INFO 886 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
  4. 2022-06-19 19:50:59.385 INFO 886 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.63]
  5. 2022-06-19 19:50:59.468 INFO 886 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
  6. 2022-06-19 19:50:59.468 INFO 886 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 850 ms
  7. redisScript.getSha1():6c45d62f3875095a03105f73b04c64e77b17fa1e
  8. redisScript.getScriptAsString():redis.call("set",KEYS[1], ARGV[1])
  9. return redis.call("get", KEYS[1])
  10. 瓜田李下
  11. 2022-06-19 19:51:00.240 INFO 886 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
  12. 2022-06-19 19:51:00.249 INFO 886 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 2.043 seconds (JVM running for 2.604)

         

                 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/921544
推荐阅读
相关标签
  

闽ICP备14008679号