Redis(六)Lua脚本的支持】的更多相关文章

Redis为什么需要Lua脚本的支持 当应用需要Redis完成一些Redis命令不支持的特性时,要么扩展Redis client或者更甚至编写c扩展Redis server.这都大大造成了应用的实现的难度.在此基础上,Redis通过内置Lua解释器,Redis client可以发起执行Lua脚本,完成特殊的功能需求. Redis中使用Lua脚本 在Redis中可以通过使用eval和evalsha命令提供对执行Lua的支持. eval语法: EVAL script numkeys key [key…
Redis 是一种非常流行的内存数据库,常用于数据缓存与高频数据存储.大多数开发人员可能听说过redis可以运行 Lua 脚本,但是可能不知道redis在什么情况下需要使用到Lua脚本. 一.阅读本文前置条件 可以遵循这个链接中的方法在操作系统上安装 Redis 如果你对redis命令不熟悉,查看<Redis 命令引用> 二.为什么需要Lua脚本 简而言之:Lua脚本带来性能的提升. 很多应用的服务任务包含多步redis操作以及使用多个redis命令,这时你可以使用Redis结合Lua脚本,会…
最近在做K线的项目中,需要计算商品的分时数据.为了保证多台机器对同一商品的计算的有序性,所以在Redis中进行计算,同时为了保证在分时数据计算过程的原子性所以使用了LUA脚本,Redis内置了对LUA脚本的支持,并且在计算过程中保证了脚本中执行的原子性.因此在开发过程中对Redis对Lua的支持进行了学习.从 Redis 2.6.0 版本开始,通过内置的 Lua 解释器,可以使用EVAL命令对 Lua 脚本进行求值.以下将Redis对LUA的支持进行总结. EVAL 从Redis2.6.0版本开…
从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis … 案例-实现访问频率限制: 实现访问者 $ip 在一定的时间 $time 内只能访问 $limit 次. 非脚本实现 private boolean accessLimit(String ip, int limit, int time, Jedis jedis) { boolean result = true; String key = "rate.limit:" + ip; if (jedis.…
一.前言 运行环境window,redis版本3.2.1.此处暂不对Lua进行详细讲解,只从Redis的方面讲解. 二.Redis的Lua脚本 在Redis的2.6版本推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行,在Lua脚本中也可以调用大部分的Redis命令.使用脚本有以下三个好处: (1) 减少网络开销:有些时候需要多次请求Redis获取处理数据,而使用脚本功能就可以只使用一次请求完成相同操作,减少了网络往返时延. (2) 原子操作:Redis会将整个脚本作为一个整体…
前言 Redis 当中提供了许多重要的高级特性,比如发布与订阅,Lua 脚本等.Redis 当中也提供了自增的原子命令,但是假如我们需要同时执行好几个命令的同时又想让这些命令保持原子性,该怎么办呢?这时候就可以使用本文介绍的 Lua 脚本来实现. 发布与订阅 发布与订阅功能理论上来说可以直接通过一个双端链表就可以实现了,然而这种通过普通的双端链表来实现的发布与订阅功能有两个局限性: 如果生产者生产消息的速度远大于消费者消费消息的速度,那么链表中未消费的消息会大量堆积,导致占用大量的内存. 基于链…
一.背景 在使用redis的过程中,发现有些时候需要原子性去操作redis命令,而redis的lua脚本正好可以实现这一功能.比如: 扣减库存操作.限流操作等等. redis的pipelining虽然也可以一次执行一组命令,但是如果在这一组命令的执行过程中,需要根据上一步执行的结果做一些判断,则无法实现. 二.使用lua脚本 Redis中使用的是 Lua 5.1 的脚本规范,同时我们编写的脚本的时候,不需要定义 Lua 函数.同时也不能使用全局变量等等. 1.lua脚本的格式和注意事项 1.格式…
摸索了一下在PHP中如何使用redis执行lua脚本,写了一个脚本如下,供以后参考 <?php $redis = new Redis(); #实例化redis类 $redis->connect('127.0.0.1'); #连接服务器 $lua = <<<SCRIPT return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]} SCRIPT; //对应的redis命令如下 eval "return {KEYS[1],KEYS[2],ARGV[1…
spring boot基于redis的LUA脚本 实现分布式锁[都是基于redis单点下] 一.spring boot 1.5.X 基于redis 的 lua脚本实现分布式锁 1.pom.xml <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifact…
Redis 2.6.0 内置的Lua Script支持,可以在Redis的Server端一次运行大量逻辑. 整个Script默认是在一个事务里的. Script里涉及的所有Key尽量用变量,从外面传入,使Redis一开始就知道你要改变哪些key. EVAL每次传输一整段Script比较费带宽,可以先用SCRIPT LOAD载入script,返回哈希值.然后用EVALHASH执行. 内置的LUA库里还很贴心的带了CJSON,可以处理JSON字符串. 参考:http://www.searchdata…
背景介绍 redis数据库提供了一些管理功能比如 流水线:打包发送多条命令,并在一个回复里面接收所有被执行命令的结果.事务:一次执行多条命令,被执行的命令要么就全部都被执行,要么就一个也不执行.并且事务执行过程中不会被其他工作打断.乐观锁:监视特定的键,防止事务出现竞争条件.虽然这些附加功能都非常有用,但它们也有一些缺陷. 流水线的缺陷尽管使用流水线可以一次发送多个命令,但是对于一个由多个命令组成的复杂操作来说,为了执行该操作而不断地重复发送相同的命令,这并不是最高效的做法,会对网络资源造成浪费…
一.lua脚本 lua是一种轻量小巧的脚本语言,用标准的C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. lua的详细内容你可以参考lua官方网站:http://www.lua.org/ (lua的官方网站和它的设计理念一样,轻量简洁易上手) 二.redis中的lua redis从2.6版本开始内置了lua模块,所以在redis服务器中可以直接执行lua脚本.以下用eval命令来演示: 127.0.0.1:6379> eval "ret…
1.背景 有时候,我们需要一次性操作多个 Redis 命令,但是 这样的多个操作不具备原子性,而且 Redis 的事务也不够强大,不支持事务的回滚,还无法实现命令之间的逻辑关系计算.所以,一般在开发中,我们会利用 lua 脚本来实现 Redis 的事务. 2.lua 脚本 Redis 中使用 lua 脚本,我们需要注意的是,从 Redis 2.6.0后才支持 lua 脚本的执行. 使用 lua 脚本的好处: 原子操作:lua脚本是作为一个整体执行的,所以中间不会被其他命令插入. 减少网络开销:可…
第一个测试: 往Redis里面存入1000个Hash,每个Hash里面有100个元素(Key 0-99,值是Key^2). PHP代码,执行33s左右 <?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->select(1); for ($a = 0; $a < 10000; $a++) { for ($b = 0; $b < 100; $b ++) $redis->hSet($a…
Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行.使用脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成.使用脚本,减少了网络往返时延. 2.原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入. 3.复用:客户端发送的脚本会永久存储在Redis中,意味着其他客户端可以复用这一脚本而不需要使用代码完成同样的逻辑. 实现一个访问频率控制,某个ip在短时间内频繁访问页面…
最近在看<Redis入门指南>第二版,感觉收获挺大,推荐大家有时间看一看.其中有一章讲Lua脚本,感觉挺实用,把总结整理一下. Redis在2.6中推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行.Lua脚本可以调用大部分的Redis命令,使用Lua脚本的好处是: 1)减少网络开销,作为内存型数据库redis的性能开销主要花在发送指令和接收结果的网络开销上,把多条redis指令写在1个Lua脚本里,只需要通过网络发送1次就可以了 2)原子操作 Redis将整个脚本作为1个整…
redis自带的lua脚本 127.0.0.1:6379> hget team wyc "{\"name\":\"wyycc\",\"age\":\"444\"}" 想要通过redis官方的lua脚本拓展来传递name,age等直接返回对应的值.如果传递name,age等redis的hash中存在的value,则返回其结果,如果不存在返回nil,使得传入和返回结果一一对应. redis的lua拓展自带…
java端实现: //初始化一个redis可执行的lua DefaultRedisScript<List> defaultRedisScript = new DefaultRedisScript<List>(); defaultRedisScript.setResultType(List.class); defaultRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("re…
简介 Redis 从 2.6 版本开始引入使用 Lua 编程语言进行的服务器端脚本编程功能,这个功能可以让用户直接在 Redis 内部执行各种操作,从而达到简化代码并提高性能的作用. P248 在不编写 C 代码的情况下添加新功能 P248 通过使用 Lua 对 Redis 进行脚本编程,我们可以避免一些减慢开发速度或者导致性能下降对常见陷阱. P248 将 Lua 脚本载入 Redis P249 SCRIPT LOAD 命令可以将脚本载入 Redis ,这个命令接受一个字符串格式的 Lua 脚…
参考:http://redisdoc.com/script/eval.htmlhttps://blog.csdn.net/diudiu2025/article/details/86483043final Jedis jedis = new Jedis("localhost");String script = "return redis.call('mset',KEYS[1],KEYS[2],ARGV[1],ARGV[2])"; Object v = jedis.ev…
一.引言         学习Redis也有一段时间了,感触还是颇多的,但是自己很清楚,路还很长,还要继续.上一篇文章简要的介绍了如何在Linux环境下安装Lua,并介绍了在Linux环境下如何编写Lua脚本和运行.由于我们这个系列是以Redis为主,所以也介绍了Redis和Lua如何进行整合.运行.        在Lua脚本中有一个很重要的数据类型,那就是table类型,大家可以把Lua的table类型暂时理解为数组,只是Lua的table类型的下标可以是数字,可以是字符,除了(nil)类型…
一.引言               redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入到大多数语言当中,来扩展其功能.lua脚本是用C语言写的,体积很小,运行速度很快,并且每次的执行都是作为一个原子事务来执行的,我们可以在其中做很多的事情.由于篇幅很多,一次无法概述全部,这个系列可能要通过多篇文章的形式来写,好了,今天我们进入正题吧.二.lua简介                  …
Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行. 使用Lua脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redis服务器上完成.使用脚本,减少了网络往返时延. 2.原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入. 3.复用:客户端发送的脚本会永久存储在Redis中,意味着其他客户端可以复用这一脚本而不需要使用代码完成同样的逻辑. 1.Redis命令行执行Lua脚本 01 .…
从版本3.2开始,Redis包含一个完整的Lua调试器,可以用来使编写复杂Redis脚本的任务更加简单. 由于Redis 3.2仍处于测试阶段,请unstable从Github 下载Redis 的分支并编译它以测试调试器.您可以使用Redis unstable来调试稍后在稳定版本的Redis中运行的脚本,因此调试器已经可用于实际术语. Redis Lua调试器,代号LDB,具有以下重要功能: 它使用服务器 - 客户端模型,因此它是一个远程调试器.Redis服务器充当调试服务器,而默认客户端则是r…
背景:有一服务提供者Leader,有多个消息订阅者Workers.Leader是一个排队程序,维护了一个用户队列,当某个资源空闲下来并被分配至队列中的用户时,Leader会向订阅者推送消息(消息带有唯一标识ID),订阅者在接收到消息后会进行特殊处理并再次推往前端. 问题:前端只需要接收到一条由Worker推送的消息即可,但是如果Workers不做消息重复推送判断的话,会导致前端收到多条消息推送,从而影响正常业务逻辑. 方案一(未通过) 在Worker接收到消息时,尝试先从redis缓存中根据消息…
如题, 楼主的想法很简单, lua 脚本本身支持原子性, 所以把命令写进一个脚本就行, 当然后续还会优化才能放到生产上,例如缓存脚本 ,redis 本身会缓存执行过的脚本 ,这样速度更快, 再优化, 有个专门的redis 来放 缓存的脚本,总之性能优化是多种多样的,满足了业务上的性能需求就好 ,今天先贴个最low 的demo redis-cli 命令行 EVAL " local mrest=redis.call('set',KEYS[1],ARGV[1]);redis.call('expire'…
一.引言 Redis是高性能的key-value数据库,在很大程度克服了memcached这类key/value存储的不足,在部分场景下,是对关系数据库的良好补充.得益于超高性能和丰富的数据结构,Redis已成为当前架构设计中的首选key-value存储系统. 虽然Redis官网上提供了200多个命令,但做程序设计时还是避免不了为了实现一小步业务逻辑而多次调用Redis的情况. 以compare and set场景为例.如果使用Redis原生命令,需要从Redis中获取这个key,然后提取其中的…
1. 前言 Redis是高性能的KV内存数据库,除了做缓存中间件的基本作用外还有很多用途,比如胖哥以前分享的Redis GEO地理位置信息计算.Redis提供了丰富的命令来供我们使用以实现一些计算.Redis的单个命令都是原子性的,有时候我们希望能够组合多个Redis命令,并让这个组合也能够原子性的执行,甚至可以重复使用,在软件热更新中也有一席之地.Redis开发者意识到这种场景还是很普遍的,就在2.6版本中引入了一个特性来解决这个问题,这就是Redis执行Lua脚本. 2. Lua Lua也算…
chapter20 Lua脚本 Redis从2.6版本开始引入对Lua脚本的支持,通过在服务器中嵌入Lua环境,Redis客户端可以使用Lua脚本,直接在服务器端原子地执行多个Redis命令 20.1 创建并修改Lua环境 创建Lua环境 载入函数库 创建redis全局表格 20.2 Lua环境写作组件 伪客户端 lua_scripts字典 struct redisServer{ /* Scripting */ // Lua 环境 lua_State *lua; /* The Lua inter…
目录 前言 1. Lua 脚本 1.1 Redis 创建并修改 Lua 环境的步骤 1.2 Lua 环境协作组件 1.3 EVAL 命令的实现 1.4 EVALSHA 命令的实现 1.5 脚本管理命令的实现 1.6 脚本复制 1.6.1 EVAL.SCRIPT FLUSH.SCRIPTLOAD 命令的复制 1.6.2 EVALSHA 命令的复制 2. 排序 2.1 SORT 命令的实现 2.2 SORT 命令的可选项 2.3 多个选项的执行顺序 最后 前言 参考资料:<Redis设计与实现 第二…