### 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?