redis lua
redis
支持復雜數據類型? : key-value, string, list, set, hash table, sorted set,?
其他有用特性:??????????? TRANSACTION, SCRIPT
TRANSACTION
WATCH 監視key; 若在事務開始之前key發生改變, 則不進行事務。
UNWATCH 解除監視
MULTI 開始事務
redis command; 注意, 這里只能是一組redis command, 不能夾雜任何數據邏輯。。。 類似于SQL事務中的一組SQL命令
EXEC 執行事務 /? DISCARD 放棄事務
那么,類似需求如何滿足呢?? transaction是滿足不了這種需求【CAS, check and save】;且這種需求是業務邏輯中非常常見的。。。
if ( db.key > 10) {? ++db.key;? saveTOdb(db.key); }
SCRIPT(lua)
script也能保證原子性。 為了保證原子性(同時也保證主從一致), 內嵌的lua做了修改、去掉隨機函數等。
[root@mobile_dev2 src]# cat test2.lua
[root@mobile_dev2 src]# ./redis-cli SET XX 5
OK
[root@mobile_dev2 src]# ./redis-cli GET XX
"5"
[root@mobile_dev2 src]# ./redis-cli EVAL "$(cat test.lua)" 1 "XX" 10? # 5>=10 failed,所以輸出原值5.
"5"
[root@mobile_dev2 src]# ./redis-cli SET XX 10
OK
[root@mobile_dev2 src]# ./redis-cli GET XX
"10"
[root@mobile_dev2 src]# ./redis-cli EVAL "$(cat test.lua)" 1 "XX" 10
"11"
SCRIPT的鍵和參數
如上。 redis的lua函數,可以有兩個表。 KEYS表 是redis中存的key; ARGV表是存放傳入參數的。
???
| 命令 | ? | lua 腳本 | KEYS表長度 | 逐個的KEYS | 逐個的ARGV |
| ./redis-cli | EVAL | ?"$(cat test2.lua)" | 1 | "XX" | 10 |
| ? | ? | ? | ? | ? | ? |
其他
多個客戶端可以并發的發送數據請求, 但redis server在處理這些請求可以看做是單線程的。
redis保證SCRIPT的原子性,處理該腳本時不會有其他command或者SCRIPT在同時被處理;
因此可以保證業務邏輯的正確性。 避免各類數據庫中常見的臟數據、舊數據等問題。
如上, 同時必須保證SCRIPT的簡單高效; 否則會導致其后的處理請求統統延時。。。
./redis-cli SCRIPT LOAD "$(cat test.lua)"??? ###LOAD之后是lua腳本源碼。。。
http://www.redisdoc.com/en/latest/
http://www.redisbook.com/en/latest/index.html !!!!!!!!!!!!!!!!!!!
總結
- 上一篇: ios 1 cocoa
- 下一篇: redis 数据完整性