成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何在Redis中執行Lua腳本?

數據庫 Redis
Redis調用Lua腳本,腳本執行完成后將結果返回給Redis,Redis再將結果返回給客戶端。這個過程中會出現Redis執行結果類型到Lua數據類型的轉換,然后Lua類型到Redis類型的轉換。

Redis中需要執行Lua腳本的場景

Redis中每條命令都是原子性的,即執行結果要么全部成功要么全部失敗。在某些業務場景下,需要執行多條命令,并且要保證多條命令的原子性。這時,如果命令逐條執行,顯然是不能保證原子性的。有同學可能會想到使用Redis的事務功能,事務是可以保證原子性,但是受限于命令的功能,有些場景下并不能實現想要的功能。

使用執行Lua腳本的方式可以解決以上問題,Lua腳本整體上在Redis中是原子性的。

在Redis中執行Lua腳本

在Redis中通過EVAL命令來執行Lua腳本,基本語法如下:

redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]

參數說明:

  • script: 參數是一段Lua腳本程序。腳本不必(也不應該)定義為一個 Lua 函數。
  • numkeys: 用于指定鍵名參數的個數。
  • key [key ...]: 從 EVAL 的第三個參數開始算起,表示在腳本中所用到的那些 Redis 鍵(key),這些鍵名參數可以在 Lua 中通過全局變量 KEYS 數組,用 1 為基址的形式訪問( KEYS[1] , KEYS[2] ,以此類推)。
  • arg [arg ...]: 附加參數,在 Lua 中通過全局變量 ARGV 數組訪問,訪問的形式和 KEYS 變量類似( ARGV[1] 、 ARGV[2] ,諸如此類)。

獲取指定key的值,相當于于 GET somekey

EVAL "return redis.call('GET', KEYS[1])" 1 somekey

再看一個LPUSH的例子,相當于 LPUSH somelist 1 2 3

EVAL "return redis.call('LPUSH',KEYS[1], ARGV[1], ARGV[2], ARGV[3])" 1 somelist 1 2 3

簡單說下Redis執行lua腳本相關的其他幾個命令:

  • EVALSHA命令根據給定的SHA1,執行緩存在服務器中的腳本。
  • SCRIPT EXISTS命令用于檢查指定SHA1值對應的腳本是否在Redis緩存中。
  • SCRIPT FLUSH命令用于清除所有的緩存腳本。
  • SCRIPT KILL命令用于殺死當前正在運行的 Lua 腳本,當且僅當這個腳本沒有執行過任何寫操作時,這個命令才生效。這個命令主要用于終止運行時間過長的腳本,比如一個因為 BUG 而發生無限循環的腳本。SCRIPT KILL 執行之后,當前正在運行的腳本會被殺死,執行這個腳本的客戶端會從 EVAL 命令的阻塞當中退出,并收到一個錯誤作為返回值。

Lua腳本中調用Reids命令

調用Redis命令,當執行出錯時,該方法會直接返回錯誤,并退出。

redis.call(redisCommand, key, argv...)

調用Redis命令,當執行出錯時,記錄錯誤信息,并繼續執行。

redis.pcall(redisCommand, key, argv...)

記錄日志,寫入到Redis配置的日志文件中,日志級別有四種,分別是redis.LOG_DEBUG、redis.LOG_VERBOS、redis.LOG_NOTICE和redis.LOG_WARNING。

redis.log(logLevel, message)

計算輸入字符串的sha1哈希值。

redis.sha1hex(arvg)

Lua與Redis類型轉換

Redis調用Lua腳本,腳本執行完成后將結果返回給Redis,Redis再將結果返回給客戶端。這個過程中會出現Redis執行結果類型到Lua數據類型的轉換,然后Lua類型到Redis類型的轉換。Redis類型到Lua類型轉換關系如下:

Redis返回的數據類型

Lua數據類型

integer(整數回復)

number(數字類型)

bulk replay(字符串)

string(字符串類型)

多行字符串

table(數組形式)

status(狀態回復)

table(只有一個ok字段的數組)

error(錯誤回復)

table(只有一個err字段的數組)

Lua類型到Redis類型轉換關系如下:

Lua數據類型

Redis返回數據類型

number(數字類型)

integer(整數回復)

string(字符串類型)

bulk replay(字符串)

table(數組形式)

多行字符串

table(只有一個ok字段的數組)

status(狀態回復)

table(只有一個err字段的數組)

error(錯誤回復)

責任編輯:姜華 來源: 今日頭條
相關推薦

2011-08-23 09:56:52

UnicodeLua

2016-12-20 09:30:22

shell腳本linux

2011-08-25 13:22:40

CEGUILua腳本

2011-08-25 09:55:27

2009-06-08 21:35:02

Java啟動程序

2011-08-24 10:32:03

LuaPlusC++Lua

2017-04-13 10:46:14

Webpack執行代碼分割

2017-01-18 20:38:36

LinuxShell腳本命令

2021-08-20 10:46:25

Shell腳本文件Linux

2021-04-21 08:03:34

腳本Shell讀取

2023-10-19 14:52:27

2021-01-18 17:23:30

代碼調試VS Code

2022-03-08 07:22:48

Redis腳本分布式鎖

2019-08-06 14:06:19

數據庫工具技術

2024-05-31 12:54:37

.NET CoreLinux語言

2021-11-26 00:04:01

RedisLua 腳本

2025-02-28 08:21:36

C語言C++Java

2011-08-31 15:36:59

Lua解釋器

2020-06-04 17:00:37

Linux命令腳本

2017-03-10 10:37:16

Linux命令腳本
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日日夜夜天天 | 亚洲性视频 | 在线播放国产视频 | 中文字幕视频一区 | 蜜臀网| 国产小u女发育末成年 | 欧美一区二区激情三区 | a黄视频| 91不卡| 日韩欧美精品一区 | 国产精品久久久久久久久 | 亚洲欧美v | 国产一区二区三区四区hd | 午夜tv免费观看 | 天天色天天色 | 国产日韩一区二区三免费高清 | 国产一区影院 | 国产九一精品 | 中文字幕精品一区二区三区精品 | 求毛片| 亚洲视频一区在线观看 | 日韩av免费在线观看 | 欧美videosex性极品hd | 亚洲国产一区二区在线 | 91精品午夜窝窝看片 | 蜜桃精品在线 | 黄色三级在线播放 | 97av视频 | 在线视频亚洲 | 精品日韩一区二区 | 成人久草 | 自拍第1页 | 精品一级 | 国产91丝袜在线熟 | 久久综合九色综合欧美狠狠 | 久久国产精品偷 | 国产精品免费在线 | 国产人免费人成免费视频 | 国产性网 | 国产一区 | 91.com在线观看 |