激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Redis - Redis中Lua腳本的使用和設置超時

Redis中Lua腳本的使用和設置超時

2022-01-20 20:04hhgfy Redis

本文將介紹Redis中Lua腳本的基本用法,以及腳本超時導致的問題和處理方式。文中通過示例代碼介紹的非常詳細,感興趣的小伙伴們可以參考一下

Redis提供了Lua腳本功能來讓用戶實現自己的原子命令,但也存在著風險,編寫不當的腳本可能阻塞線程導致整個Redis服務不可用。

本文將介紹Redis中Lua腳本的基本用法,以及腳本超時導致的問題和處理方式。

EVAL命令簡介

eval格式

Redis 提供了命令EVAL來執行Lua腳本,格式如下

?
1
EVAL script numkeys key [key …] arg [arg …]

其中 script 是將要執行的腳本內容,至于后面的腳本參數部分與本文無關,在此不做贅述。

特性

由于Redis對數據集單線程讀寫的特性,Lua腳本執行時會阻塞所有對數據集的讀寫操作,這給它帶來了下面兩個特性:

  • 原子性:可以通過Lua腳本實現對數據集的原子讀寫操作,這和Redis的事務功能MULTI / EXEC類似
  • 長時間阻塞風險:如果Lua腳本執行時間過長,導致整個Redis不可用

執行流程

eval "return 'hello world'" 0為例,腳本執行步驟如下

定義腳本函數

執行過的腳本可以根據hash值找到函數重新使用

Redis會根據傳入的腳本內容生成函數,函數名由 f_ + 腳本內容的sha1摘要組成。

?
1
2
3
function f_5332031c6b470dc5a0dd9b4bf2030dea6d65de91()
    return 'hello world'
end

函數保存到 Lua_scripts字典,便于 evalsha使用

執行腳本函數

  • 將KEYS和ARGV兩個參數數組傳入Lua執行環境
  • 裝載超時處理鉤子
  • 執行腳本
  • 移除超時鉤子
  • 結果保存到客戶端輸出緩沖區,等待服務器將結果返回客戶端
  • Lua環境垃圾回收

關于腳本超時

介紹完EVAL命令,下面來關注Lua腳本長時間阻塞的風險。

Redis的配置文件中提供了如下配置項來規定最大執行時長

  • Lua-time-limit 5000 Lua腳本最大執行時間,默認5秒

但這里有個坑,當一個腳本達到最大執行時長的時候,Redis并不會強制停止腳本的運行,僅僅在日志里打印個警告,告知有腳本超時。

Lua slow script detected: still in execution after 5000 milliseconds. You can try killing the script using the SCRIPT KILL command. Script SHA1 is: 2531e4edc1a1e2a9bac3c52e99466f9ccabf12c0

為什么不能直接停掉呢?

因為 Redis 必須保證腳本執行的原子性,中途停止可能導致內存的數據集上只修改了部分數據。

(只讀的腳本應該是可以自動停的,沒自動停的原因我猜測是:腳本超時嚴重可以肯定出現了編碼錯誤,作者可能希望在測試中盡早發現這種問題,而不是靠自動停止導致bug被忽略?)

如果時長達到 Lua-time-limit 規定的最大執行時間,Redis只會做這幾件事情:

日志記錄有腳本運行超時

開始允許接受其他客戶端請求,但僅限于 SCRIPT KILLSHUTDOWN NOSAVE 兩個命令

其他請求仍返回busy錯誤

SCRIPT KILL 命令

如果Lua只是讀取數據而沒做修改的話,執行 SCRIPT KILL 就可以直接終止腳本執行,不用擔心數據被修改。

但是,如果腳本已經改寫了數據內容,SCRIPT KILL將報出以下錯誤,因為它破壞數據集的內容。

(error) UNKILLABLE Sorry the script already executed write commands against the dataset. You can either wait the script termination or kill the server in a hard way using the SHUTDOWN NOSAVE command.

SHUTDOWN NOSAVE 命令

如上所述,如果腳本已經執行了寫命令,SCRIPT KILL將無法執行。那我們就只剩以下兩種選擇了:

  • 繼續等待腳本執行完成
  • 使用 SHUTDOWN NOSAVE 來直接停掉 Redis,并避免臟數據持久化到磁盤

最后,不知道你有沒有疑問,從開始執行腳本到 SHUTDOWN 之間的寫命令會把日志寫到AOF里嗎?Lua腳本中的命令什么時候會寫AOF里?

講道理,既然 Redis 為了不破壞腳本的原子性而不讓SCRIPT KILL執行,那么腳本中寫命令的 “提交” 也應當是原子執行的,而不是執行一句就向AOF里寫一句。

“提交”:借用數據庫中 commit 的概念,這里指寫入AOF文件中

下面就來驗證這個猜測:

先執行 tail -f appendonly.aof 實時查看AOF文件變化

再開一個redis-cli 命令行執行一個內容如下的Lua腳本

?
1
2
3
4
5
6
redis.call('set','a','aaaa') --先執行寫命令
local count = 1
while( 999999999 > count ) -- 阻塞幾秒
do 
   count = count+1  
end
?
1
2
3
127.0.0.1:6379> eval "redis.call('set','a','aaaa') local count = 1 while( 999999999 > count ) do  count = count+1   end" 0
(nil)
(8.65s)

現象是,腳本剛開始執行,AOF文件毫無反應,一直等到8秒后腳本完成,命令才追加寫入到AOF中。

這就驗證了Redis腳本里的寫命令是等到執行完成后再一次性寫入AOF的。

參考

Redis設計與實現

到此這篇關于Redis中Lua腳本的使用和設置超時 的文章就介紹到這了,更多相關Redis Lua 超時內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/m0_38086372/article/details/108184325

延伸 · 閱讀

精彩推薦
  • RedisRedis的配置、啟動、操作和關閉方法

    Redis的配置、啟動、操作和關閉方法

    今天小編就為大家分享一篇Redis的配置、啟動、操作和關閉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • Redis詳解Redis復制原理

    詳解Redis復制原理

    與大多數db一樣,Redis也提供了復制機制,以滿足故障恢復和負載均衡等需求。復制也是Redis高可用的基礎,哨兵和集群都是建立在復制基礎上實現高可用的...

    李留廣10222021-08-09
  • RedisRedis全量復制與部分復制示例詳解

    Redis全量復制與部分復制示例詳解

    這篇文章主要給大家介紹了關于Redis全量復制與部分復制的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis爬蟲具有一定的參考學習...

    豆子先生5052019-11-27
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    xiaojin21cen10152021-07-27
  • RedisRedis如何實現數據庫讀寫分離詳解

    Redis如何實現數據庫讀寫分離詳解

    Redis的主從架構,能幫助我們實現讀多,寫少的情況,下面這篇文章主要給大家介紹了關于Redis如何實現數據庫讀寫分離的相關資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • Redisredis實現排行榜功能

    redis實現排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實現排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • RedisRedis 事務知識點相關總結

    Redis 事務知識點相關總結

    這篇文章主要介紹了Redis 事務相關總結,幫助大家更好的理解和學習使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個逼格詳解

    這篇文章主要給大家介紹了關于redis中如何使用lua腳本讓你的靈活性提高5個逼格的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具...

    一線碼農5812019-11-18
主站蜘蛛池模板: 黄色片网站在线看 | 免费看黄色三级毛片 | 国产精品美女久久久免费 | 91精品欧美一区二区三区 | 一级电影免费在线观看 | 色网站免费观看 | 欧美一级高清免费 | 少妇一级淫片免费放正片 | 7777视频| 一区二区高清视频在线观看 | 爱射av | 亚洲精品com| 沉沦的校花奴性郑依婷c到失禁 | 护士xxxx | 亚洲免费视频一区二区 | av在线免费电影 | 羞羞色网站 | 黄视频网址 | 欧美精品亚洲人成在线观看 | 久久69精品久久久久久国产越南 | 亚洲影院在线 | 欧美一级毛片大片免费播放 | 亚洲va久久久噜噜噜久久男同 | 中文字幕电影免费播放 | 中国美女一级黄色大片 | 草久视频在线观看 | 91短视频版高清在线观看www | 国产精品自拍av | 欧美一级免费高清 | 国产成年人视频 | 成人毛片在线 | 男女无套免费视频 | 亚洲午夜精选 | 久久久久久久久久久一区 | 亚洲小视频在线 | av黄色在线免费观看 | 久久人人爽人人爽人人片av高清 | 羞羞羞羞视频 | 黄色片网站在线看 | 久久人人爽人人爽人人片av高请 | 在线免费观看日韩视频 |