代码编织梦想

讲下redis管道与调用lua脚本,代码实例如下 管道(Pipeline)
客户端可以一次性发送多个请求而不用等待服务器的响应,待所有命令都发送完后再一次性读取服务的响应,这样可以极大的降低多条命令执行的网络传输开销,管道执行多条命令的网络开销实际上只相当于一次命令执行的网络开销。需要注意到是用pipeline方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并不是打包的命令越多越好。
pipeline中发送的每个command都会被server立即执行,如果执行失败,将会在此后的响应中得到信息;也就是pipeline并不是表达“所有 command都一起成功”的语义,管道中前面命令失败,后面命令不会有影响,继续执行。

详细代码示例见iedis连接示例:

//******* 管道示例 ********
			//管道的命令执行方式:cat redis.txt | redis-cli -h 127.0.0.1 -a password -p 6379 --pipe
           Pipeline pl = jedis.pipelined();
           for (int i =o: i<10:i++) 
                pl.incr("pipelineKey");
                pl.set("zhuge" + i,"zhuge");
           }
            List<object> results=pl.syncAndReturnAll(); 
            System.out.println(results);

Redis Lua脚本
Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。使用脚本的好处如下
1、减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成,使用脚本,减少了网络往返时延。这点跟管道类似
2原子操作:Redis会将整个脚木作为一个整休执行,中间不会被其他命令插入,管道不是原子的,不过redis的批量提作命令(类似mset)是原子的
3、替代redis的事务功能:redis自带的事务功能很鸡肋,报错不支持回滚,而redis的lua脚本几平实现了常规的事务功能,支持报错回滚操作,官方推荐如果要使用redis的事务功能可以用redislua替代。官网文档上有这样一段话:

 A Redis script is transactional by definition, so everything you can do with a Redis transaction, you can a and usually the script will be both simpler and faster. 

从Redis2.6.0版本开始,通过内置的Lua解释器,可以使用EVAL命令对Lua脚本进行求值。EVAL命令的格式如下:
EVAL script numkeys key [key…] arg [arg…]
script参数是一段Lua脚本程序,它会被运行在Redis服务器上下文中,这段脚本不必(也不应该)定义为一个Lua函数。numkevs参数用了指定键名参数的个数。键名参数 kev[key…从EVAL的第三个参数开始算起,表示在脚本中所用到的那些Redis键(key),这些键名参数可以在Lua中通过全局变量KEYS数组,用1为基址的形式访问(KEYS[1],KEYS[2],以此类推)。
在命令的最后,那些不是键名参数的附加参数araara1,可以在Lua中通过全局变量ARGV数组访问,访问的形式和KEYS变量类似( ARGV11ARGVI2],诸如此类)。例如
127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}"2 key1 key2 first second

1)“key1”
2)“key2”
3)“first”

其中 "return {KEYS[1.KEYS[2.ARGVI1].ARGVI2)”是被求值的Lua脚本,数字2指定了键名参数的数量,key1和key2是键名参数,分别使用 KEYS[1]和 KEYS[2]访问,而最后的 first 和second 则是附加参数,可以通过ARGV[1]和ARGV[2]访问它们。
在Lua脚本中,可以使用redis.call()函数来执行Redis命令

Jedis调用示例详见上面jedis连接示例:

jedis.set("product count 10016",“15");//初始化商品10016的库存 
		string script =" local count = redis.call('get', KEYS[1])" +
            " local a = tonumber(count)" +
            “ local b = tonumber(ARGV[1])"+
            " if a >= b then " +
            "redis.call('set', KEYS[1], a-b)" +
            "return 1"+
            "end "+
            "return 0 ";
		Object obj =jedis.eval(script,Arrays.asList("product count 10016"),Arrays.asList("10")); 
		System.outprintln(obj);

从Redis2.6.0版本开始,通过内置的Lua解释器,可以使用EVAL命令对Lua脚本进行求值。EVAL命令的格式如下:
1 EVAL script numkeys key [key…] arg [arg…]
script参数是一段Lua脚本程序,它会被运行在Redis服务器上下文中,这段脚本不必(也不应该)定义为一个Lua函数。numkevs参数用了
指定键名参数的个数。键名参数 kev[key…从EVAL的第三个参数开始算起,表示在脚本中所用到的那些Redis键(key),这些键名参数可以在Lua中通过全局变量KEYS数组,用1为基址的形式访问(KEYS[1],KEYS[2],以此类推)。
在命令的最后,那些不是键名参数的附加参数araara1,可以在Lua中通过全局变量ARGV数组访问,访问的形式和KEYS变量类似( ARGV11ARGVI2],诸如此类)。例如
1 127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}"2 key1 key2 first second2 1)"key1"3 2)"key2"4 3)“first”

注意:

不要在Lua脚本中出现死循环和耗时的运算,否则redis会阻塞,将不接受其他的命令,所以使用时要注意不能出现死循环、耗时的运算。redis是单进程、单线程执行脚本管道不会阻塞redis。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Mao_yafeng/article/details/127019078

redis-lua脚本详解_一个处女座-代码洁癖的程序猿的博客-爱代码爱编程_lua脚本

如果我们想逻辑性的一起执行多条指令,在执行过程不被别的请求打断,那么Redis提供了Lua脚本,Redis服务器会单线程原子性执行lua脚本,保证了在执行过程中不会被其他请求打断。 通过Lua脚本执行多个指令 if redis.call("get",KEYS[1]) == ARGV[1] then     return redis.call(

redis使用lua脚本保证原子性-爱代码爱编程

redis使用lua脚本保证原子性 Eval的使用 语法: EVAL script numkeys key [key ...] arg [arg ...] 首先大家一定要知道eval的语法格式,其中: script: 你的lua脚本numkeys: key的个数key: redis中各种数据结构的替代符号arg: 你的自定义参数示例:eval

Redis二:RDB、AOF及混合持久化、并行持久化之写时复制机制、Redis主从架构原理、Redis管道及lua脚本、Redis哨兵高可用架构-爱代码爱编程

目录 Redis持久化 RDB快照(snapshot) AOF(append-only file) Redis 4.0 混合持久化 Redis主从架构 Redis主从工作原理 Jedis连接代码 管道(Pipeline) Redis Lua脚本 Redis哨兵高可用架构 redis哨兵架构搭建步骤: 哨兵的Spring Boot整合

java使用lua脚本操作 redis,SpringBoot通过redisTemplate调用lua脚本并打印调试信息到redis log(方法步骤详解)...-爱代码爱编程

第一次写Lua脚本,并通过springboot的redisTemplate调用脚本,进行脚本与应用的交互。不熟悉真的折腾了好久,现在总结一下学习过程: 第一次写完lua时,想到的就是如何在应用调用脚本的时候,去调试脚本。在网上海搜了一把,能找到的有点相关的寥寥无几。 有一种方法是通过执行redis命令,调用redis客户端,加载lua脚本,然后出现

Redis使用Lua脚本详解-爱代码爱编程

前言 本文将讲解 RedisLua脚本的基本操作以及与 Java项目的集成使用。 Lua脚本 Lua是一个高效的轻量级脚本语言,在葡萄牙语中是“月亮”的意思,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 为什么要在程序中嵌入 Lua脚本?它解决了什么问题? 假设要开发一个 iPhon

Redis(三)主从与哨兵架构详解 Redis主从架构 如何在同一台机器搭建主从架构 Redis主从工作原理 数据部分复制 Jedis使用 Redis的管道(Pipeline) Redis Lua脚本-爱代码爱编程

上一章提到了Redis(二)Redis持久化 其目的是出现故障重启时的数据恢复,这一章要提到Redis主从与哨兵架构。文中所用图片来自copy 文章目录 前言Redis主从架构如何在同一台机器搭建主从架构Redis主从工作原理数据部分复制Jedis使用Redis的管道(Pipeline)Redis Lua脚本Redis哨兵高可用架构搭建假设mas

springboot 2.x集成redis+lua脚本-爱代码爱编程

文章目录 一、springboot集成redis1、引Pom2、配置,我用的是cluster(当然集群不支持事物-我后面一些多命令会用Lua)3、redis数据类型序列化,这里我重命名了一下redisTemplateMy ,你也可以保持原名redisTemplate4 、搞一个工具类,大多数简单操作的都比较适用二、原子操作-lua脚本1、lua一些

redis与lua详解_redis+lua-爱代码爱编程

Lua Lua语法 Lua 数据类型 Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。 Lua 中有 8 个基本类型分别为:nil、boolean、numbe

redis(三)基础:redis五大基础数据类型_redis keepttl-爱代码爱编程

目录 前言一、Redis数据类型介绍二、Redis key三、Redis Strings1、字符串简介2、字符串基本操作1)通用命令2)value是字符串时操作3)value是数值的操作4)临时键值对的操作

redis常用命令_redis exit命令-爱代码爱编程

文章目录 1.Redis的配置与连接2.Redis的使用3.Redis的基本命令4.Redis的五大数据类型5.学习redis.conf6.Redis持久化 1.Redis的配置与连接 在redis

lua 脚本详解-爱代码爱编程

Lua是redis 2.6 版本最大的亮点,通过内嵌对Lua 环境的支持,Redis 解决了长久以来不能高效地处理CAS (check-and-set)命令的缺点,并且可以通过组合使用多个命令,轻松实现以前很难实现或者不能高效实现的模式。 public void testLock() { // 设置uuId String