《Redis设计与实现》读书笔记(三十四) ——Redis Lua脚本环境设计与实现 (原创内容,转载请注明来源,谢谢) 一、创建lua环境 为了在redis服务器执行lua脚本,redis服务器内嵌了一个lua环境,redis服务器启动的时候,会自动创建lua环境,步骤如下: 1)创建一个基础lua环境。 调用lua的C API函数lua_open,创建新的lua环境。但是这个是原生的环境,redis会对其进行定制。 2)载入多个lua函数库,以便lua脚本的执行。 包括基础库、表格库、字符串库、数学库
Redis2.6加入了对Lua脚本的支持。Lua脚本可以被用来扩展Redis的功能,并提供更好的性能。
Lua语言提供了如下几种数据类型:booleans(布尔)、numbers(数值)、strings(字符串)、tables(表格)。
从版本3.2开始,Redis包含一个完整的Lua调试器,可以用来使编写复杂Redis脚本的任务更加简单。
前面我们已经把Redis Lua相关的基础都介绍过了,如果你可以编写一些简单的Lua脚本,恭喜你已经可以从Lua中学毕业了。
2.6版本之后支持嵌入Lua脚本,客户端使用Lua脚本,直接在服务器端原子的执行多条命令
2.6版本之后支持嵌入Lua脚本,客户端使用Lua脚本,直接在服务器端原子的执行多条命令 Lua脚本执行过程 创建并修改Lua环境 1 创建基础Lua环境 2 载入函数库 3 创建全局表格Lua 4 替换随机函数 5 创建排序辅助函数 6 创建redis.pcall函数 7 全局环境保护 8 修改后的Lua环境保存到服务器状态的Lua属性,等待脚本执行 Redis中带有不确定性的命令: SINTER SUNION SDIFF SMEMEBERS HKEYS HVALS KEYS 注意: Redis提供
有读者问我为什么这么久都没有出Redis Lua中学教程,表示村头厕所已经好久没有纸了。其实我早就要写这篇中学教程了,奈何最近太忙了,就一拖再拖,直到今天我终于又开始动笔了。忘记Lua相关概念的同学可以先回顾一下小学教程。
前言 最近在看redis的lua,看了官网资料和网上一些文章,整理了lua的相关内容,希望对大家有帮助。 目录 0. redis中运行lua的流程的正常流程 1.redis中的lua概要信息 1.1 lua中调用redis命令 1.2 redis数据结构与lua数据结构对应关系 1.3 EVAL和EVALSHA 1.4 脚本缓存 1.5 脚本命令 1.6 其他约定 1.6.1 全局变量保护 1.6.2 Sele
前言 为什么要用lua脚本操作redis数据库? 1.减少开销–减少向redis服务器的请求次数 2.原子操作–redis将lua脚本作为一个原子执行 3.可复用–其他客户端可以使用已经执行过
Redis提供了丰富的指令集,但是仍然不能满足所有场景,在一些特定场景下,需要自定义一些指定来完成某些功能。因此,Redis提供了Lua脚本支持,用户可以自己编写脚本来实现想要的功能。
OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。 OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。
前言 Redis作为一个非常成功的数据库,提供了非常丰富的数据类型和命令,使用这些,我们可以轻易而高效地完成很多缓存操作,可是总有一些比较特殊的问题或需求需要解决,这时候可能就需要我们自己定制自己的 Redis 数据结构和命令。 文章欢迎转载,请尊重作者劳动成果,带上原文链接:http://www.cnblogs.com/zhenbianshu/p/8416162.html ---- Redis命令问题 线程安全问题 我们都知道 Redis 是单线程的,可是它怎么会有 线程安全 问题呢? 我们正常理解的线程
Redis 的事务提供了一种将多个命令请求打包,然后一次性、顺序地执行的能力。这种机制可以确保在事务执行过程中,不会被其他客户端的命令请求所打断,保证了事务的原子性。
Redis 和 Lua,实际开发中的常见的两个黄金搭档,在技术面试中更是高频出现,那么,Redis 执行 Lua,到底能不能保证原子性?今天就来聊一聊。
在实际应用中,遇到了这样一个场景: 已有一个手机 APP 客户端,需要在该 APP 客户端中实现通过 Web 的形式接入其他的应用页面。按照常规的流程,在 APP 中为应用设置入口链接按钮,当用户点击应用入口按钮时,APP 启动 WebView 并打开设置的应用链接即可。 但在该场景中,接入 APP 的应用均部署在内网服务器,外网无法直接访问,因此在 APP 中配置的链接是内网地址,当用户通过外网使用 APP 时,将无法访问接入的 Web 应用。 针对如上场景中遇到的问题,本文中提出了基于 Nginx 实现动态代理的解决方案。
Nginx(或OpenResty)在生产场景中使用的广泛程度已经到了令人咂舌的地步。无论其实际的市场占用率如何,以笔者这些年所经历的项目来看,其使用率为100%。
本文主要是分享在实际工作中同事遇到的问题案例;活动组在做活动时,开发人员未考虑到接口并发场景,导致因为一些用户在实际抽奖(土豪一般都是狂抽)过程中对余额产生了增加/减少的操作,导致缓存的余额出现异常;通过我review代码发现,开发者在更新缓存时:先get后set或者incrby,导致并发场景下get的值是一致的,所以缓存异常。
RT,本篇博客记录的是马三的一次解决 LuaFunction has been disposed 的bug的全过程,事情还要从马三的自研框架 ColaFrameWork 说起。最近,马三在业余时间维护了一款基于Unity的客户端自研框架,起名叫 ColaFrameWork ,寓意是希望写代码能像喝小可乐一样享受和轻松。为了在Lua层可以监听到UI事件,马三制作了UGUIEventListener、UGUIDragEventListenner和UGUIMsgHandler等这样几个UI组件,其中 UGUIEventListener和UGUIDragEventListenner这种Listener组件实现了IPointerDownHandler、IPointerClickHandler和ISubmitHandler这样的UGUI IEventSystemHandler UI事件接口,并且实现了接口定义的方法,然后在 UGUIEventListener中暴露出来一些 onClick、onDrag、onSubmit这种委托字段出来。在UI实例化的时候,代码会把这些监听器的脚本动态地绑定到UI预制体上面,然后再将Lua层的onClick、onDrag等这些方法动态地与Listener暴露出来的委托字段进行绑定。这样,当我们触发了UI的事件的时候,就会执行Listener中预先实现了相关接口的方法,而我们又在这些方法中调用了我们的委托,接着在通过lua虚拟机触发Lua层的function,从而实现了Lua层对UI事件的监听,之后我们也就可以很方便地在Lua层进行业务逻辑的开发了。
除此之外,Nginx还具备可编程能力,理论上可以使用Nginx的扩展组件ngx_lua开发各种复杂的动态应用。不过,由于Lua是一种脚本动态语言,因此不太适合做复杂业务逻辑的程序开发。但是,在高并发场景下,Nginx Lua编程是解决性能问题的利器。
为了保证多条命令组合的原子性,Redis提供了简单的事务功能以及集成Lua脚本来解决这个问题,本文介绍Lua,事务已经在前一篇文章介绍过了 一、Lua概述 Lua语言是在1993年由巴西一个大学研究小组发明,其设计目标是作为嵌入式程序移植到其他应用程序,它是由C语言实现的,虽然简单小巧但是功能强大 所以许多应用都选用它作为脚本语言,尤其是在游戏领域,例如大名鼎鼎的暴雪公司将Lua语言引入到“魔兽世界”这款游戏中,Rovio公司将 Lua语言作为“愤怒的小鸟”这款火爆游戏的关卡升级引擎,Web服务器Nginx
Lua脚本特性的出现给Redis带来了很大的变化,其中最重要的就是使得用户可以按需对Redis服务器的功能进行扩展:在Lua脚本特性出现之前,用户如果想要给Redis服务器增加新功能,那么只能自行修改Redis服务器源码,这样做不仅麻烦,还会给Redis服务器带来升级困难、无法与标准Redis服务器兼容等问题,而Lua脚本的出现则为用户提供了一种标准的、无后顾之忧的方法来扩展Redis服务器的功能。
Lua 是由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于1993年开发的一种轻量、小巧的脚本语言,用标准 C 语言编写,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
概要:经历了一段时间的打磨,Tweyseo老师在Lua.ren首发了他的新文章《Walk On LuaJIT》。因为微信公众号对群发文章有字数限制,我们把文章分多次发布。
redis一款高并发的内存K-V数据库,提供了好多命令,但是其中有部分对于生产环境来说比较危险,需要禁用掉。
那我们的程序主线程也会被阻塞住。那我们如何防止这种问题呢?下面就给出一个解决的办法。
事务和lua脚本都是redis内存数据库实现原子性操作的手段,两者虽然类似,但区别不小。而且,尽管Redis内置有事务,但是很多开发者还是更倾向于使用Lua脚本来实现相应的功能。这是为什么呢?
下载地址:https://github.com/akopytov/sysbench/archive/refs/tags/1.0.20.tar.gz
redis事务提供了一种“将多个命令打包, 然后一次性、按顺序地执行”的机制, 并且事务在执行的期间不会主动中断。 我们可以通过 MULTI 命令开启一个事务,类似于 mysql 的 BEGIN TRANSACTION 语句。 在该语句之后执行的命令都将被视为事务之内的操作。 最后我们可以通过执行 EXEC/DISCARD 命令来提交/回滚该事务内的所有操作。 这两个Redis命令可被视为等同于关系型数据库中的 COMMIT/ROLLBACK 语句。 服务器在执行完事务中的所有命令之后, 才会继续处理其他客户端的其他命令。 被执行的命令要么全部都被执行,要么一个也不执行,并且事务执行过程中不会被其他工作打断。
Nginx是一个主进程配合多个工作进程的工作模式,每个进程由单个线程来处理多个连接。
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能
> Splash是一个JavaScript渲染服务,是一个带有HTTP API的轻量级浏览器,同时它对接了Python中的Twisted和QT库。利用它,我们同样可以实现动态渲染页面的抓取
基于go+vue的web版redis管理工具【Web redis management tool based on golang and vue】
1、Nginx 简介 Nginx 作为一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。其流行度越来越高,应用也越来越广泛,常见的应用有:网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器,高并发大流量站点常用来做接入层的负载均衡,还有非常常见的用法是作为日志采集服务器等。 Nginx 整体采用模块化设计,有丰富的模块库和第三方模块库,配置灵活。其中模块化设计是nginx的一大卖点,甚至http服务器核心功能也是一个模块。要注意的是:n
wrk是一个开源的、热门的、现代的单机HTTP基准测试工具,目前在github开源平台累计了26.9k的star数目,足以可见wrk在Http基准测试领域的热门程度。它结合了多线程设计和可扩展的事件通知系统,如epoll和kqueue,可以在有限的资源下并发出极致的的负载请求。并且内置了一个可选的LuaJIT脚本执行引擎,可以处理复杂的HTTP请求生成、响应处理以及自定义压测报告。
Splash是一个JavaScript渲染服务,是一个带有HTTP API的轻量级浏览器,同时它对接了Python中的Twisted和QT库。利用它,我们同样可以实现动态渲染页面的抓取。
Splash 是一个 JavaScript 渲染服务,是一个带有 HTTP API 的轻量级浏览器,同时它对接了 Python 中的 Twisted 和 QT 库。利用它,我们同样可以实现动态渲染页面的抓取。
在微服务架构中,由于系统和服务的细分,导致系统结构变得非常复杂, 为了跨平台,为了统一集中管理api,同时为了不暴露后置服务。甚至有时候需要对请求进行一些安全、负载均衡、限流、熔断、灰度等中间操作,基于此类种种的客观需求一个类似综合前置的系统就产生了,这就是API网关(API Gateway)。API网关作为分散在各个业务系统微服务的API聚合点和统一接入点,外部请求通过访问这个接入点,即可访问内部所有的REST API服务。目前常用的微服务网关有zuul、gateway,今天来简单介绍一下另一种选择——Kong 。说到Kong可能对大家有点陌生,我们来先了解下另一种不陌生的中间件——OpenResty。
本文是《Docker下的OpenResty三部曲》的第二章,在前文《Docker下的OpenResty三部曲之一:极速体验》我们简单的体验了Nginx+Lua提供的web服务,但是并没有深入开发细节,今天就来一起实战这个镜像的制作过程;
出自percona公司,是一款多线程系统压测工具,可以根据影响数据库服务器性能的各种因素来评估系统的性能。例如,可以用来测试文件IO,操作系统调度器,内存分配和传输速度,POSIX线程以及数据库服务器等。sysbench支持Lua脚本语言,Lua对各种测试场景的设置可以非常灵活。sysbench支持MySQL,操作系统和硬件的测试。
上篇文章我们聊了gdb的底层调试机制,明白了gdb是利用操作系统提供的系统信号来调试目标程序的。很多朋友私下留言了,看到能帮助到大家,我心里还是很开心的,其实这也是我继续输出文章的最大动力!后面我会继续把自己在项目开发中的实战经验进行总结。
AutoTouch的一个重要的使用前提是手机必须是越狱状态,如果你不打算越狱你的iPhone,那可以暂时忽略这篇文章。
Atlas MySQL 详细介绍 Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。 主要功能: * 读写分离 * 从库负载均衡 * IP过滤 * SQL语句黑白名单 * 自动分表 Q & A ------------
最近公司打算重构API网关,给定的硬性条件是支持lua脚本,kubernetes可部署,可解析lua,另外需要支持身份认证,IP黑白名单,限流,负载均衡等一些功能,为此,在技术选型上锁定了kong以及APISIX,最终选择了kong。
1.背景与需求介绍 抓取流量最流行的工具就是Wireshark,在Windows上Wireshark的GUI界面很酷,但对于在linux和mac用惯了tcpdump用户来说,用命令行的tcpdump更直接便捷,Windows上有没有类似tcpdump的抓包工具呢?答案是有的,就是windump,底层是基于winpcap库的命令行工具。 大体的背景是这样的,有Windows服务器运行了一个较定制化的闭源的认证服务,因为这是一个历史遗留下来的服务,并没完备的日志输出机制,无法从现有的日志统计出用户流量数据,在服
OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
最近一段时间做的工作主要是为引擎提供Lua的IDE,包括编辑智能提示和调试部分。
领取专属 10元无门槛券
手把手带您无忧上云