2012-04-23 41 views
1

我想在Redis中設置一些寫約束,並且我正在考慮將這些約束存儲在哈希中。讓Redis擁有本地和遠程客戶端

我最初的想法是修改set命令,以便在Redis中寫入規則之前檢查規則。我正在想,通過這種方式,支票將超快。當然,每次Redis改變時,這種方法都會需要更多的修改,如果你認爲它是關於學校作業的話,我會發現它有點硬核。

第二個想法是有兩種類型的Redis客戶端。一個在Web應用程序端(可能是Web應用程序的多個實例),另一個在Redis機器上。基於這個想法來我的問題。

  1. 請問2個客戶端(本地和遠程)具有增加的在comparisson性能1個客戶端首先檢查約束,然後在Redis的寫入?或者我應該堅持一個完成這一切的客戶端(phpredis或predis,應用程序在PHP上,並對約束檢查進行了一些修改)?

  2. 如果我可以嘗試2個客戶端,哪個編程語言會更好地實現本地客戶端(C,Lua或其他)?

回答

2

而不是試圖修改Redis的行爲本身,還是先來實現在服務器端Lua腳本的約束嘗試(需要Redis的2.6分支)。

Lua EVAL腳本可以在執行實際寫入操作之前輕鬆地使用已存儲在Redis中的數據執行一些檢查。

這裏是一個例子。假設我們有兩個代表銀行賬戶的密鑰,我們需要在賬戶之間實現安全交易。例如,我們必須檢查兩個帳戶是否存在,並且源帳戶包含所需的資金。

# set 2 accounts for John and Bob 
set account:john 100 
set account:bob 20 

# transfer $10 from John to Bob, checking all constraints 
eval "if redis.call('exists',KEYS[2])==1 and redis.call('get',KEYS[1])>=ARGV[1] then 
     redis.call('incrby', KEYS[2], ARGV[1]) 
     redis.call('incrby', KEYS[1], - ARGV[1]) 
     return 1 
     else 
     error('invalid transaction') 
     end" 2 account:john account:bob 10 

你會發現在約Redis的腳本功能的文檔: http://redis.io/commands#scripting(見EVAL命令第一)。

要回答您的第一個問題(如果您不能使用Redis 2.6),本地客戶端會略微提高性能,因爲它可以使用unix域套接字(繞過一些TCP開銷)連接到Redis並節省一些網絡往返。但這是以額外複雜性爲代價的。

+0

我下載了2.6分支,我試着用簡單的例子來評估,它似乎工作。現在我必須與我的約束檢查的實施一起工作。感謝您的快速回答和簡單易懂的例子! – 2012-04-23 12:58:27

相關問題