Redis 的指令执行本身是单线程的,这个线程还要执行客户端的Lua 脚本,如果Lua脚本执行超时或者陷入了死循环,是不是没有办法为客户端提供服务了呢?

eval 'while(true) do end' 0

为了防止某个脚本执行时间过长导致Redis 无法提供服务, Redis 提供了lua-time-limit 参数限制脚本的最长运行时间,默认为5 秒钟。

lua-time-limit 5000(redis.conf 配置文件中)

当脚本运行时间超过这一限制后,Redis 将开始接受其他命令但不会执行(以确保脚本的原子性,因为此时脚本并没有被终止),而是会返回“BUSY”错误。

Redis 提供了一个script kill 的命令来中止脚本的执行。新开一个客户端:

script kill

如果当前执行的Lua 脚本对Redis 的数据进行了修改(SET、DEL 等),那么通过script kill 命令是不能终止脚本运行的。

127.0.0.1:6379> eval "redis.call('set','gupao','666') while true do end" 0

因为要保证脚本运行的原子性,如果脚本执行了一部分终止,那就违背了脚本原子性的要求。最终要保证脚本要么都执行,要么都不执行。

127.0.0.1:6379> script kill
(error) UNKILLABLE Sorry the script already executed write commands against the dataset.
You can either wait the script
termination or kill the server in a hard way using the SHUTDOWN NOSAVE command.

遇到这种情况,只能通过shutdown nosave 命令来强行终止redis。

shutdown nosave 和shutdown 的区别在于shutdown nosave 不会进行持久化操作,意味着发生在上一次快照后的数据库修改都会丢失。

总结:如果我们有一些特殊的需求,可以用Lua 来实现,但是要注意那些耗时的操作。

Redis中的Lua脚本超时相关推荐

  1. Redis中的Lua 脚本

    Lua/ˈluə/是一种轻量级脚本语言,它是用C 语言编写的,跟数据的存储过程有点类似.使用Lua 脚本来执行Redis 命令的好处: 1.一次发送多个命令,减少网络开销. 2.Redis 会将整个脚 ...

  2. 深入理解redis中的lua脚本

    本文来说下redis中的lua脚本 文章目录 概述 Lua简介 使用Lua脚本的好处 Redis+Lua实现限流 本文小结 概述 今天讲一些redis和lua脚本的相关的东西,lua这个脚本是一个好东 ...

  3. Redis中使用Lua脚本(续)- Linux下Lua-cjson开源库的安装和使用

    Redis中使用Lua脚本(续)- Lua-cjson开源库的安装和使用 问题 原因 解决方案 在Redis的lua脚本编写中,我们可能会用到json的序列化和反序列化. Json序列化: -- Re ...

  4. Redis中的Lua脚本怎么玩

    Redis中的Lua脚本怎么玩 Lua是一门强大.快速.轻量的嵌入式脚本语言,我们日常开发中接触的最多的还是Redis为保证原子性使用Lua执行多命令的一种方法,那么现在先来熟悉Lua基本用法. Lu ...

  5. Redis中使用Lua脚本(二)之红包雨的抢夺

    Redis中使用Lua脚本(二)之红包雨的抢夺 一.需求介绍 二.红包雨的需求分析及概要设计 三.红包雨的Lua脚本设计及模拟演示 四.Lua脚本在生产环境的使用 一.需求介绍 如同前两年的爆款&qu ...

  6. Spring Redis中使用Lua脚本实现高并发原子操作

    1. 前言 在上一文中我对 Lua 语言的一些简单的语法及其在 Redis 中的操作进行了介绍,但是在 Java 开发中我们还需要进一步的学习才能使这种技术落地.今天就结合Spring Data Re ...

  7. redis中使用lua脚本

    一.概述 1.什么是lua脚本 Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放. 其设计目的就是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.因为广泛的应用于:游戏开 ...

  8. Redis中缓存Lua 脚本

    为什么要缓存 在脚本比较长的情况下,如果每次调用脚本都需要把整个脚本传给Redis 服务端,会产生比较大的网络开销.为了解决这个问题,Redis 提供了EVALSHA 命令,允许开发者通过脚本内容的S ...

  9. redis中执行lua脚本命令

最新文章

  1. java并发处理时mvel表达式处理慢,一文说清!
  2. centos 支持 ntfs格式
  3. svm的一些理解(网上收集)
  4. ffplay的数据结构分析
  5. html股票数据代码,股票数据的网站抓取(4.2)代码优化
  6. SAP License:统计型实际结算型内部订单
  7. Java反射机制demo(三)—获取类中的构造函数
  8. mysql存储过程中的异常处理
  9. Jquery ajax异步请求样板
  10. html关于点击radio触发事件
  11. Implementing Infinite Scroll Into a React Component
  12. php 上传微信客服头像,微信多客服上传头像
  13. 写论文比较有用的网站
  14. 重庆大学计算机专业排名全国多少名,重庆大学成功晋级中国高校计算机大赛团体程序设计天梯赛全国总决赛...
  15. java——ZZULIOJ_1047: 对数表
  16. U34202 JerryC Loves Driving 洛谷
  17. 计算机开机错误62,联想电脑开机显示Error 1962 no operating system解决方法
  18. 记录:关于“扫雷”的布雷招
  19. Linux服务器运维/虚拟主机-李强强-专题视频课程
  20. java企业人事工资管理系统

热门文章

  1. Linux networkmanager
  2. 【洛谷P1632】点的移动
  3. How to start MySQL on Linux
  4. PHP - 会话控制
  5. hadoop学习;安装jdk,workstation虚拟机v2v迁移;虚拟机之间和跨物理机之间ping网络通信;virtualbox的centos中关闭防火墙和检查服务启动...
  6. R运行大数据的过程中遇到的问题:不能有负长度矢量
  7. python爬虫实验
  8. robot1,Mechanical structure
  9. JS打开新窗口的代码window.showModalDialog()
  10. junit initializationError