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

Redis進階應用:Redis+Lua腳本實現復合操作

開發 開發工具 架構 Redis
Redis是高性能的key-value數據庫,在很大程度克服了memcached這類key/value存儲的不足,在部分場景下,是對關系數據庫的良好補充。

一、引言 

 

Redis是高性能的key-value數據庫,在很大程度克服了memcached這類key/value存儲的不足,在部分場景下,是對關系數據庫的良好補充益于超高性能和豐富的數據結構,Redis已成為當前架構設計中的首選key-value存儲系統。
雖然Redis官網上提供了200多個命令,但做程序設計時還是避免不了為了實現一小步業務邏輯而多次調用Redis的情況。
以compare and set場景為例如果使用Redis原生命令,需要從Redis中獲取這個key,然后提取其中的值進行比對:如果相等就不做處理;如果不相等或者key不存在則將key設置成目標值。僅僅一個單點的compare and set操作就需要與Redis通訊兩次。
此外,這種分散操作無法利用Redis的原子特性,占用多次網絡IO。
今天我們就來探討一下如何優雅地應對上述場景。
二、Redis與Lua
在介紹Lua之前,我們需要先對這個語言有個初步了解。Lua 是一個小巧的腳本語言,幾乎可以運行在所有操作系統和平臺上。我們一般不會用Lua處理特別復雜的事務,因此只需了解一些lua的基本語法即可。
Redis問世之后,其開發者也意識到了開篇提到的問題,因此Redis從2.6版本開始支持Lua腳本。新版本的Redis還支持Lua Script debug,感興趣的小伙伴可以去官網的Documentation中找到對應介紹和QuickStart。
有了Lua腳本之后,使用Redis程序時便能夠在以下方面實現顯著提升:

  • 減少網絡開銷:本來N次網絡請求的操作,可以用一個請求完成。原先N次請求的邏輯放在Redis服務器上完成,減少了網絡往返時延; 
  • 原子操作:Redis會將整個腳本作為一個整體執行,中間不會被其他命令插入。這是一個重要特性,一定要拿小本本記好。至于為什么是一個原子操作,我們以后再分析; 
  • 復用:客戶端發送的腳本會永久存儲在Redis中。這樣其他客戶端就可以復用這一腳本,而不需要使用代碼完成同樣的邏輯。

 所以現在流傳一句話:要想學好Redis,必會Lua Script。

三、通過Lua腳本實現compare and set 

 

接下來我們就實現一個簡單的compare and set,并通過這個例子感受一下Lua腳本給Redis使用帶來的全新體驗。
首先看一下如何讓Redis執行Lua腳本。

3.1 Redis的EVAL

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

 這里借用一下官網的例子。 

Redis進階應用:Redis+Lua腳本實現符合操作  

 

上述腳本直接返回了入參。

  • eval為Redis關鍵字; 
  • 第一個引號中的內容就是Lua腳本; 
  • 2為參數個數; 
  • key1和key2是KEYS[1]、KEYS[2]的入參; 
  • first和second是ARGV[1],ARGV[2]的入參。

大家可以簡單地將KEYS[1],KEYS[2], ARGV[1],ARGV[2]理解為占位符。 

3.2 執行腳本文件和緩存腳本

如果只能在命令行中寫腳本執行,遇到復雜的腳本程序豈不是會抓狂?

下面我們來看一下,如何讓Redis執行Lua腳本文件,同時也驗證一下lua腳本的復用特性(以后我們再也不需要定期批量刪除某些符合特定規則的key了)。 

  1. Redis 127.0.0.1:6379> SCRIPT LOAD  script 
  2. Redis 127.0.0.1:6379> EVALSHA sha1  numkeys key [key ...] arg [arg ...] 

Redis提供了一個SCRIPTLOAD命令,命令后面的script即為Lua腳本。命令將腳本script添加到腳本緩存中,但并不立即執行這個腳本。執行命令后,Redis會返回一個SHA1串,第二個EVALSHA命令即可執行。

需要注意的是,腳本可以在緩存中保留無限長的時間,直到執行完SCRIPT FLUSH。我們來看一下效果。

Redis進階應用:Redis+Lua腳本實現符合操作  

 

Redis還支持直接執行Lua腳本文件。首先編寫并存儲一個Lua腳本。

Redis進階應用:Redis+Lua腳本實現符合操作  

 

然后調用Redis-cli –eval命令。

Redis進階應用:Redis+Lua腳本實現符合操作  

 

Redis-cli –eval命令語法基本與原eval語法相同。

3.3 使用Lua腳本實現compare and set  

 

compareand set的實現邏輯是這樣的:首先獲取Redis中指定key的value,然后與給定值進行比較:如果相等,則將key設定為目標值并返回一個標識符;如果不相等,則不作任何操作并返回一個標識符。

  1. if Redis.call('get', KEYS[1]) == ARGV[1]  then 
  2.      Redis.call('set', KEYS[1], ARGV[2]); 
  3.      return 1 
  4. else 
  5.      return 0 end 

 下面我們來測試一下這個腳本。 

 

首先向Redis的指定key compareAndSet:key寫入一個值value。

Redis進階應用:Redis+Lua腳本實現符合操作  

 

在Redis中執行lua腳本。

Redis進階應用:Redis+Lua腳本實現符合操作  

 

可以看到第一次執行返回1,說明修改成功了;再使用原參數執行時返回0,說明沒有做任何修改。我們再查詢一下compareAndSet:key這個key。

Redis進階應用:Redis+Lua腳本實現符合操作  

 

可以看到compareAndSet:key這個key已經被修改為new_value了。
四、總結
我們通過lua腳本實現了一個簡單的compareAndSet操作。
下面我們通過這個例子來驗證一下開篇提到的特性。

  • 減少網絡開銷:不使用腳本的情況下,我們實現一個compareAndSet至少需要與Redis交互兩次,而現在只需要執行一次操作即可完成; 
  • 原子操作:得益于Redis的設計,Redis會將整個腳本作為一個整體執行,中間不會被其他命令插入。因此在編寫腳本的過程中無需擔心出現競態條件,無需使用事務,感興趣的可以百度或等待以后后續文章更新; 
  • 復用:可以將一系列操作封裝成一個Lua腳本,存儲在文件或Redis上,下次使用時直接調用即可。

讀到這里,希望你已經對Redis+Lua有了一定的了解,并能使用腳本完成一些簡單的復合操作。后續還會繼續更新一些基于Lua腳本+java程序實現的分布式數據結構,如延遲隊列、可重入鎖等,感興趣的小伙伴可以持續關注。

【本文是51CTO專欄機構宜信技術學院的原創文章,微信公眾號“宜信技術學院( id: CE_TECH)”】

戳這里,看該作者更多好文

 

責任編輯:張燕妮 來源: 宜信技術學院
相關推薦

2023-04-04 07:52:26

RedisLua腳本

2025-02-28 08:21:36

C語言C++Java

2021-11-26 00:04:01

RedisLua 腳本

2020-10-19 06:43:53

Redis腳本原子

2024-01-09 07:25:31

2022-03-08 07:22:48

Redis腳本分布式鎖

2017-04-17 10:35:40

Spring BooRedis 操作

2011-09-06 17:37:01

LUA應用

2023-05-05 08:08:06

JavaRedis事務

2024-10-10 08:32:28

Redis高并發Lua

2024-03-29 08:56:47

2020-10-27 11:35:31

PythonRedis數據庫

2024-08-13 17:35:27

2024-04-17 08:35:04

Lua腳本Redis數據結構

2018-08-15 09:48:27

數據庫Redis應用場景

2011-08-22 18:08:09

Lua腳本

2021-04-29 07:46:55

Redis業務數據

2023-02-26 23:41:37

2022-03-22 10:52:02

Redis變慢服務器

2023-02-24 07:40:11

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 超碰成人免费 | 精品少妇一区二区三区在线播放 | 日本高清视频在线播放 | 亚洲成人免费av | 亚洲女优在线播放 | 久久一起草 | 日韩免费视频一区二区 | 草草视频在线播放 | 国产中文在线 | 日韩av一区二区在线观看 | 欧美精品一区二区三区四区 在线 | 99re| 欧美日韩在线精品 | 久久神马 | 日本久久精品视频 | a视频在线观看 | 国产精品一区二区视频 | 免费看a | 天天干,夜夜操 | 亚洲日本中文字幕在线 | 嫩草一区二区三区 | 91一区二区三区在线观看 | 欧美一区免费 | 一区二区三区av | 91精品麻豆日日躁夜夜躁 | 一区二区久久电影 | av看片网站 | 玩丰满女领导对白露脸hd | 国产美女自拍视频 | 色一情一乱一伦一区二区三区 | 国产97久久 | 欧美色综合 | a级大片免费观看 | 97精品一区二区 | 一区二区三区在线播放 | 日韩在线播放一区 | 欧美一区二区三区在线 | 操亚洲 | 亚洲精品久久久久久宅男 | 在线播放一区二区三区 | 韩日视频在线观看 |