为什么要缓存

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

如何缓存

Redis 在执行script load 命令时会计算脚本的SHA1 摘要并记录在脚本缓存中,执行EVALSHA 命令时Redis 会根据提供的摘要从脚本缓存中查找对应的脚本内容,如果找到了则执行脚本,否则会返回错误:"NOSCRIPT No matching script. Please use EVAL."

127.0.0.1:6379> script load "return 'Hello World'"
"470877a599ac74fbfda41caa908de682c5fc7d4b"
127.0.0.1:6379> evalsha "470877a599ac74fbfda41caa908de682c5fc7d4b" 0
"Hello World"

自乘案例

Redis 有incrby 这样的自增命令,但是没有自乘,比如乘以3,乘以5。

我们可以写一个自乘的运算,让它乘以后面的参数:

local curVal = redis.call("get", KEYS[1])
if curVal == false then
curVal = 0
else
curVal = tonumber(curVal)
end
curVal = curVal * tonumber(ARGV[1])
redis.call("set", KEYS[1], curVal)
return curVal

把这个脚本变成单行,语句之间使用分号隔开

local curVal = redis.call("get", KEYS[1]); if curVal == false then curVal = 0 else curVal = tonumber(curVal) end; curVal
= curVal * tonumber(ARGV[1]); redis.call("set", KEYS[1], curVal); return curVal

script load '命令'

127.0.0.1:6379> script load 'local curVal = redis.call("get", KEYS[1]); if curVal == false then curVal = 0 else curVal =
tonumber(curVal) end; curVal = curVal * tonumber(ARGV[1]); redis.call("set", KEYS[1], curVal); return curVal'
"be4f93d8a5379e5e5b768a74e77c8a4eb0434441"
调用:
127.0.0.1:6379> set num 2
OK
127.0.0.1:6379> evalsha be4f93d8a5379e5e5b768a74e77c8a4eb0434441 1 num 6
(integer) 12

Redis中缓存Lua 脚本相关推荐

  1. Redis中的Lua脚本怎么玩

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

  2. Redis中的Lua 脚本

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

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

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

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

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

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

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

  6. redis中使用lua脚本

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

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

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

  8. Redis中的Lua脚本超时

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

  9. redis中执行lua脚本命令

最新文章

  1. lucene3.0范围查找TermRangeQuery
  2. SpringBoot 那些天生自带 Buff 的工具类,你用过几个?
  3. 中国商业航天单轮最大融资!星际荣耀B轮获投11.925亿
  4. Linux初学者接住了---Linux常用命令
  5. python程序员工作怎样-现在Python就业薪资高吗?Python程序员前景怎么样?
  6. SLinkList(静态链表)
  7. 网络模型和TCP协议族
  8. Action framework - Table PPFTTRIGG
  9. Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例
  10. not supported between instances of 'SafeText' and 'int' 问题出现以及解决
  11. matlab实训心得体会,MatLab实习心得体会
  12. AndroidStudio_安卓原生开发_显示不开的时候设置TextView文字横向滚动---Android原生开发工作笔记142
  13. 您使用的是不受支持的命令行标记: --unsafely-treat-insecure-origin-as-se
  14. android开发学习 ------- android studio 同时用svn和git 进行代码管理 出现的问题
  15. Eslint报错extra semicolon的解决方法
  16. oss上传判断_React实现阿里云OSS上传文件的示例
  17. 51单片机LCD1602电子时钟
  18. Python图形用户界面和游戏开发
  19. Java基础篇之利用IO流给文件加密、解密
  20. 又java基础学php多久_php自学需要多久?

热门文章

  1. js面向对象之创建对象1
  2. R语言中strptime返回值永远为NA的问题
  3. zigbee 协议栈的时钟和定时器分频
  4. HDU_2577 How to Type(DP)
  5. 关于ASP.NET动态加载Master页面
  6. 使用C#开发一个简单的P2P应用
  7. 如何在 Microsoft Visual C# .NET 中实现 Microsoft Excel 自动化
  8. 【Findbugs】Findbugs使用指南
  9. 仓库管理的5S如何在仓库中实施
  10. mysql三:表操作