### Redis基础学习——脚本(Lua语言)
* * * * *
Redis在2.6版推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。在Lua脚本中可以调用大部分的Redis命令,使用脚本的好处如下。
(1)减少网络开销: 在Redis操作需求需要向Redis发送5次请求,而使用脚本功能完成同样的操作只需要发送一个请求即可,减少了网络往返时延。
(2)原子操作: Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。换句话说在编写脚本的过程中无需担心会出现竞态条件,也就无需使用事务。事务可以完成的所有功能都可以用脚本来实现。
(3)复用: 客户端发送的脚本会永久存储在Redis中,这就意味着其他客户端(可以是其他语言开发的项目)可以复用这一脚本而不需要使用代码完成同样的逻辑。
#### 1-1.Lua语言
这里不会完整的介绍Lua语言中的所有要素,而是只着重编写Redis脚本会用到的部分。
1) 数据类型
|数据类型|描述|
|--|--|
|nil|这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。|
|boolean|包含两个值:false和true。|
|number|表示双精度类型的实浮点数。|
|string|字符串由一对双引号或单引号来表示。|
|function|由 C 或 Lua 编写的函数|
|userdata|表示任意存储在变量中的C数据结构|
|thread|表示执行的独立线路,用于执行协同程序|
|table|Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表 local tbl1 = {}。|
2) 变量
Lua的变量分为全局变量和局部变量。全局变量无需声明就可以直接使用,默认值是nil。如:
~~~
a = 5 -- 为全局变量a赋值
print(b) -- 无需声明即可使用,默认是nil
a = nil -- 删除全局变量a的方法是将其赋值为nil,全局变量没有声明和未声明之分,只有nil和非nil的区别
~~~
而在Redis脚本中不能使用全局变量,只允许使用局部变量以防止脚本之间相互影响。用 local 显示声明为局部变量。
~~~
local c -- 声明一个局部变量,默认值是nil
local d=1 -- 声明一个局部变量d并赋值为1
local e,f -- 可以同时声明多个局部变量
~~~
同时声明一个存储函数的局部变量的方法为:
~~~
local say_hi = function()
print 'hi'
end
~~~
变量名必须是非数字开头,只能包含字母、数字和下划线,区分大小写。变量名不能与Lua的保留关键字相同。
局部变量的作用域为从声明开始到所在层的语句块末尾,比如:
~~~
local x=10
if true then
local x=x+1
print(x)
do
local x=x+!
print(x)
end
end
print(x)
~~~
结果为:
~~~
11,12,11,10
~~~
3) 注释
Lua的注释有单行和多行两种。单行注释以--开始,到行尾结束,一般习惯在--后面跟上一个空格。多行注释以--[[ 开始,到]]结束。
4) 赋值
Lua支持多重赋值,在执行多重赋值时,Lua会先计算所有表达式的值.如
local a,b = 1,2 -- a的值是1,b的值是2
local c,d = 1,2,3 -- c的值是1,d的值是2,3被舍弃了
local e,f=1 -- e的值是1,f的值是nil
5) 操作符
①数学操作符:如+,-,*,/,%(取模)等
数学操作符的操作数如果是字符串会自动转换成数字,比如
print('1' + 1) -- 2
②比较操作符:如==,~=, <,>等
比较操作符的结果一定是布尔类型。比较操作符不同于数学操作符,不会对两边的操作数进行自动类型转换,需要手动进行类型转换,也就是说;
print(1 == '1') -- false
print({'a'} == {'a'}) -- false,对于表类型值比较的是二者的引用
print(1== tonumber('1')) -- true
③逻辑操作符:如not,and,or
只要操作数不是nil或false,逻辑操作符就认为操作数是真,否则是假。特别需要注意的是即使是0或空字符串也被当作真。
print(1 and 5) -- 5 a and b,如果a是真则返回b,否则返回b
print(1 or 5) -- 1 a or b,如果a是真则返回a,
print(not 0) -- false 根据操作数的真假返回true和false
④连接操作符:只有一个:..。用来连接两个字符串,连接操作符会自动把数字类型的值转换成字符串类型.如
print('hello' .. ' ' .. 'world!') -- 'hello world!'
⑤取长度操作符。只有一个:#。用来获取字符串或表的长度
print(#'hello') -- 5
* * * * *
https://blog.csdn.net/oChangWen/article/details/53456099
https://www.cnblogs.com/huangxincheng/p/6230129.html
- 目录
- 安装扩展
- 在 Windows 上安装 PHP 扩展
- 测试Redis扩展函数
- 教程
- 简介
- Redis 安装
- Redis 配置
- 运行
- 测试
- 书籍
- 《Redis开发与运维》
- 《Redis入门指南》
- 《Redis实战》
- 《当 Redis 遇上 ThinkPHP5》
- 参考站点
- 下载
- 命令参考
- 管理工具
- 视频
- 云数据库 Redis 版使用教程
- Redis 深入之道
- Redis高可用教程
- Redis入门
- NoSQL概述
- Redis概述
- Redis安装
- Jedis入门
- PHP命令
- PHP中利用Redis管道加快执行
- Hash操作
- Set操作
- Gearman
- MySQL - Redis配合使用方案
- 应用场景
- 缓存应用
- Redis实现简单的条件查询功能
- 获取网站中点击量最高的前n篇文章
- 显示最新的项目列表
- 排行榜相关
- 设计技巧
- SortedSets
- List列表
- 消息队列
- 最新文章
- Set集合
- 共同好友
- 独立 IP
- Linux教程
- 常用命令
- 哈希命令
- 字符串
- 集合
- 有序集合
- Redis 有序集合命令
- 有序集合命令(中)
- 发布订阅
- 用例
- 列表
- Lindex
- Ltrim
- Rpush
- Lset
- Llen
- Lpush
- 信息
- info memory
- 安装
- 数据类型
- Redis管道(pipeline)
- Memory Command
- 阿里云Redis
- 架构
- 4.0版本
- Redis 4.0 新功能介绍
- Redis Desktop Manager
- 创建hash列表数据
- Lua: 给 Redis 用户的入门指导
- Lua入门
- 乐观锁介绍
- 悲观锁介绍
- 脏数据
- Redis核心概念
- Redis事务
- Lua
- 在Redis中使用lua脚本
- php-redis
- mysql缓存服务器
- redis setnx 实现分布式锁和单机锁
- 为什么分布式一定要有Redis?