Redis中缓存Lua 脚本
为什么要缓存
在脚本比较长的情况下,如果每次调用脚本都需要把整个脚本传给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 脚本相关推荐
- Redis中的Lua脚本怎么玩
Redis中的Lua脚本怎么玩 Lua是一门强大.快速.轻量的嵌入式脚本语言,我们日常开发中接触的最多的还是Redis为保证原子性使用Lua执行多命令的一种方法,那么现在先来熟悉Lua基本用法. Lu ...
- Redis中的Lua 脚本
Lua/ˈluə/是一种轻量级脚本语言,它是用C 语言编写的,跟数据的存储过程有点类似.使用Lua 脚本来执行Redis 命令的好处: 1.一次发送多个命令,减少网络开销. 2.Redis 会将整个脚 ...
- 深入理解redis中的lua脚本
本文来说下redis中的lua脚本 文章目录 概述 Lua简介 使用Lua脚本的好处 Redis+Lua实现限流 本文小结 概述 今天讲一些redis和lua脚本的相关的东西,lua这个脚本是一个好东 ...
- Redis中使用Lua脚本(续)- Linux下Lua-cjson开源库的安装和使用
Redis中使用Lua脚本(续)- Lua-cjson开源库的安装和使用 问题 原因 解决方案 在Redis的lua脚本编写中,我们可能会用到json的序列化和反序列化. Json序列化: -- Re ...
- Redis中使用Lua脚本(二)之红包雨的抢夺
Redis中使用Lua脚本(二)之红包雨的抢夺 一.需求介绍 二.红包雨的需求分析及概要设计 三.红包雨的Lua脚本设计及模拟演示 四.Lua脚本在生产环境的使用 一.需求介绍 如同前两年的爆款&qu ...
- redis中使用lua脚本
一.概述 1.什么是lua脚本 Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放. 其设计目的就是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.因为广泛的应用于:游戏开 ...
- Spring Redis中使用Lua脚本实现高并发原子操作
1. 前言 在上一文中我对 Lua 语言的一些简单的语法及其在 Redis 中的操作进行了介绍,但是在 Java 开发中我们还需要进一步的学习才能使这种技术落地.今天就结合Spring Data Re ...
- Redis中的Lua脚本超时
Redis 的指令执行本身是单线程的,这个线程还要执行客户端的Lua 脚本,如果Lua脚本执行超时或者陷入了死循环,是不是没有办法为客户端提供服务了呢? eval 'while(true) do en ...
- redis中执行lua脚本命令
最新文章
- lucene3.0范围查找TermRangeQuery
- SpringBoot 那些天生自带 Buff 的工具类,你用过几个?
- 中国商业航天单轮最大融资!星际荣耀B轮获投11.925亿
- Linux初学者接住了---Linux常用命令
- python程序员工作怎样-现在Python就业薪资高吗?Python程序员前景怎么样?
- SLinkList(静态链表)
- 网络模型和TCP协议族
- Action framework - Table PPFTTRIGG
- Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例
- not supported between instances of 'SafeText' and 'int' 问题出现以及解决
- matlab实训心得体会,MatLab实习心得体会
- AndroidStudio_安卓原生开发_显示不开的时候设置TextView文字横向滚动---Android原生开发工作笔记142
- 您使用的是不受支持的命令行标记: --unsafely-treat-insecure-origin-as-se
- android开发学习 ------- android studio 同时用svn和git 进行代码管理 出现的问题
- Eslint报错extra semicolon的解决方法
- oss上传判断_React实现阿里云OSS上传文件的示例
- 51单片机LCD1602电子时钟
- Python图形用户界面和游戏开发
- Java基础篇之利用IO流给文件加密、解密
- 又java基础学php多久_php自学需要多久?