redis-lua

redis执行Lua脚本

拟墨画扇 提交于 2021-02-04 04:56:20
https://blog.csdn.net/mytt_10566/article/details/99732583 jianshu.com/p/366d1b4f0d13 Redis Lua 这个技术,我之前就在关注,今天有空,我把项目中基于Redis实现的ID生成器改成用lua脚本实现,防止并发id冲突问题 Redis中使用Lua的好处 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延 原子操作。redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的过程中无需担心会出现竞态条件,无需使用事务。 复用。客户端发送的脚步会永久存在redis中,这样,其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑。 Redis Lua脚本与事务 从定义上来说, Redis 中的脚本本身就是一种事务, 所以任何在事务里可以完成的事, 在脚本里面也能完成。 并且一般来说, 使用脚本要来得更简单,并且速度更快。 使用事务时可能会遇上以下两种错误: 事务在执行 EXEC 之前,入队的命令可能会出错。比如说,命令可能会产生语法错误(参数数量错误,参数名错误,等等),或者其他更严重的错误,比如内存不足(如果服务器使用 maxmemory 设置了最大内存限制的话)。 命令可能在 EXEC 调用之后失败。举个例子,事务中的命令可能处理了错误类型的键

041. 通过 Lua 扩展 Nginx

北战南征 提交于 2020-08-14 20:11:19
1. ngx_lua 模块 Nginx 模块需要用 C 开发,而且必须符合一系列复杂的规则,最重要的用 C 开发模块必须要熟悉 Nginx 的源代码,使得开发者对其望而生畏。 ngx_lua 模块通过将 lua 解释器集成进 Nginx,可以采用 lua 脚本实现业务逻辑。 该模块具有以下特性: 高并发、非阻塞地处理各种请求。 Lua 内建协程,这样就可以很好地将异步回调转换成顺序调用的形式。 每个协程都有一个独立的全局环境(变量空间),继承于全局共享的、只读的“comman data”。 得益于 Lua 协程的支持,ngx_lua 在处理 10000 个并发请求时只需要很少的内存。根据测试,ngx_lua 处理每个请求只需要 2KB 的内存,如果使用 LuaJIT 则会更少。 ngx_lua 非常适合用于实现可扩展的、高并发的服务。 2. 协程(Coroutine) 1. 协程类似一种多线程,与多线程的区别 协程并非 os 线程,所以创建、切换开销比线程相对较小。 协程与线程一样有自己的栈、局部变量等,但是协程的栈是在用户进程空间模拟的,所以创建、开销很小。 多线程程序是多个线程并发执行,也就是说在一瞬间有多个控制流在执行。而协程强调的是一种多个协程间协作的关系,只有当一个协程主动放弃执行权,另一个协程才能取得执行权,所以在某一瞬间,多个协程间只有一个在运行。

【面试必备】聊聊高性能延时队列应用

元气小坏坏 提交于 2020-02-27 08:14:26
延时队列的应用场景: 下单后,30分钟内未付款就自动取消订单等; 支付后,24小时未评论自动好评; 在我们实际开发过程中,应用场景很多... 基于Redis Zset 实现 实现原理 Redis由于其自身的Zset数据结构,也同样可以实现延时的操作。 Zset本质就是Set结构上加了个排序的功能,除了添加数据value之外,还提供另一属性score,这一属性在添加元素时候可以指定, 每次指定score后,Zset会自动重新按新的值调整顺序 。 如果score代表的是想要执行时间的 时间戳 ,在某个时间将它插入Zset集合中,它会按照时间戳大小进行排序,也就是对执行时间前后进行排序。 > ZADD delay_queue 1581309229 taskId_1 (integer) 1 > ZADD delay_queue 1581309129 taskId_2 (integer) 1 > ZADD delay_queue 1581309329 taskId_3 (integer) 1 不断地进行取第一个key值,如果当前 时间戳 大于等于该key值的socre就将它取出来进行消费删除,就可以达到延时执行的目的。 注意不需要遍历整个Zset集合,以免造成性能浪费。 > ZRANGE delay_queue 0 -1 withscores 1) "taskId_2" 2)