当前位置:   article > 正文

Redis之Lua脚本_redis lua脚本

redis lua脚本

目录

Lua脚本

编写Lua脚本

 springboot整合redis使用lua


Lua脚本

       Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。使用脚本的好处如下:

1. 减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成。使用脚本,减少了网络往返时延。

2. 原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。管道不是原子的,不过redis的批量操作命令(类似mset)是原子的。

3. 替代redis的事务功能:redis自带的事务功能很鸡肋,而redis的lua脚本几乎实现了常规的事务功能,官方推荐如果要使用redis的事务功能可以用redis lua替代。

编写Lua脚本

使用 EVAL 命令

EVAL "your_lua_script_here" numkeys key [key ...] arg [arg ...]

your_lua_script_here 是你的Lua脚本。
numkeys 是键的数量。
key [key ...] 是键的列表。
arg [arg ...] 是参数的列表。

举例

 springboot整合redis使用lua

引入redis依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>

封装redis相关操作

  1. @Service
  2. public class RedisService {
  3. @Autowired
  4. private RedisTemplate<String, String> redisTemplate;
  5. public RedisService(RedisTemplate<String, String> redisTemplate) {
  6. this.redisTemplate = redisTemplate;
  7. }
  8. // 使用 RedisScript 执行 Lua 脚本
  9. public void setUsername(String username, String value) {
  10. // Lua 脚本
  11. String script = "redis.call('SET', KEYS[1], ARGV[1])";
  12. // 创建 RedisScript 对象
  13. DefaultRedisScript<String> redisScript = new DefaultRedisScript<>(script, String.class);
  14. redisScript.setResultType(String.class);
  15. // 执行 Lua 脚本
  16. redisTemplate.execute(redisScript, new StringRedisSerializer(), new StringRedisSerializer(),
  17. Collections.singletonList(username), value);
  18. }
  19. // 使用 RedisScript 执行 Lua 脚本
  20. public void setUsernames(List<String> keys, List<String> values) {
  21. // Lua 脚本
  22. String script = "for i, key in ipairs(KEYS) do\n" +
  23. " redis.call('SET', key, ARGV[i])\n" +
  24. "end";
  25. // 创建 RedisScript 对象
  26. DefaultRedisScript<String> redisScript = new DefaultRedisScript<>(script, String.class);
  27. redisScript.setResultType(String.class);
  28. // 执行 Lua 脚本
  29. redisTemplate.execute(redisScript, new StringRedisSerializer(), new StringRedisSerializer(),
  30. keys, values.toArray(new String[0]));
  31. }
  32. }

调用接口

  1. @RestController
  2. public class redisluaController {
  3. @Autowired
  4. private RedisService redisService;
  5. @RequestMapping("/test")
  6. public void executeLuaScript() {
  7. redisService.setUsername("username", "zhangsang");
  8. }
  9. @RequestMapping("/test02")
  10. public void executeLuaScript02() {
  11. ArrayList<String> keys = new ArrayList<>();
  12. keys.add("lisi");
  13. keys.add("wangwu");
  14. ArrayList<String> values = new ArrayList<>();
  15. values.add("20");
  16. values.add("18");
  17. redisService.setUsernames(keys, values);
  18. }
  19. }

       test接口中通过lua脚本实现了set username zhangsan操作,传入参数是单个的key和value。执行结果如下:

       test02中通过lua脚本实现批量操作,传入参数是多个key和多个value,通过集合传入。执行结果如下:

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

闽ICP备14008679号