国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看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
1080
主站蜘蛛池模板: 91久久| 国产一区二区久久 | 婷婷综合激情 | 一级片av | 亚洲一区二区精品 | 日韩在线永久免费播放 | 亚洲国产区 | 乱人伦xxxx国语对白 | 99久久精品国产一区二区三区 | 日韩精品1区 | 色综合网在线 | 成人国产精品久久久 | 精品视频一区在线观看 | 在线看av的网址 | 日韩在线 中文字幕 | 精品少妇一区二区三区日产乱码 | 五月婷婷香蕉 | www.亚洲成人| 亚洲第一免费看片 | 午夜电影网 | 午夜欧美精品久久久久 | 性色网| 国产在线日韩 | 成人免费毛片aaaaaa片 | 国产一区二区在线播放 | 国产一级黄片毛片 | 国产一区不卡 | 成人日韩视频在线观看 | 五月激情综合网 | 欧美久久综合 | 久久日韩| a网站在线观看 | 一级黄色片aaa| 欧美不卡 | 精品国产一区二区三区小蝌蚪 | 国产精品美女久久久久久久久久久 | 午夜电影网址 | 日韩在线观看 | 日韩一区中文字幕 | 欧美成人精品欧美一级私黄 | 午夜爽爽爽 |