標籤:www. password 實現 功能 就會 其他 tar 表格 next
原文:ALCA in Redis-land
探索之三:Where are my tables?
使用Redis與我們之前使用的SQL資料表完全不同,沒有語言支援你在伺服器上查詢資料,這裡僅有一些命令幫你操作資料庫中的keys值。Redis中的命令是資料類型敏感型的,也就是說你不能在list上執行set命令,否則你將得到一個執行錯誤的提示。可以通過redis-cli或其他你使用的程式設計語言中的介面給Redis server發送命令。在下面的樣本中,我們只強調命令本身,而不關注你通過哪種方式提交給Redis server。
想像一下,一個簡單的SQL資料庫表,像一些應用中會用到的儲存使用者資料的表:
id username password name surname
1 user1 pass1 Bob Smith
2 user2 pass2 Mario Rossi
儲存資料
假如我們想把上面的資料存放區到Redis中,你會如何在Redis中設計資料庫方案呢?也許以應用的視覺來看會更直觀一些。使用SQL,我們在SELECT中通過指定使用者id來獲得一個使用者資訊,換句話說就是需要有用於區分不同資料實體的方式,所以我們可以通過一個唯一的標識來標識和擷取使用者資訊。所以如果在redis的key中加入使用者的id資訊,那麼我們的查詢需求就解決了,在redis中,資料被儲存成如下形式:
Key Value
user:1:username user1
user:1:password pass1
user:1:name Bob
user:1:surname Smith
user:2:username user2
user:2:password pass2
user:2:name Mario
user:2:surname Rossi
那麼,給出任一個使用者id,我們就可以通過key user:id:username,user:id:password,user:id:name,user:id:surname的形式讀出使用者資訊。
使用者登入
上面的儲存形式也能用於使用者登入,但需要一種方式能根據username來查詢使用者的id。也就是說我們還需要在username和id之間建立聯絡。這可以通過添加另外一個redis key"user:username:id"來實現。
key value
user:user1:id 1
user:user2:id 2
現在如果Mario Rossi想要登入進來,我們可以通過key"user:user2:id"先查出username,進而獲得使用者的所有資訊。
主鍵
在Redis中如何保證id值的唯一性呢。在SQL中,可以通過"id int primary key auto_increment"定義自增主鍵來實現,現在我們也需要一種類似的方式為每個使用者產生一個不同的id。根據前面可用的資料類型中提到的數字資料,Redis中的方案是這樣的:建立一個key"user:next_id",並把它作為計數器,每當要添加新使用者時,就對key"user:next_id"執行INCR命令。
SELECT * FROM users;
下一個面臨的問題是查詢使用者列表。也許你認為我們上面的資料存放區已經足以查詢出使用者列表:可以先獲得"user:next_id"的當前值counter,然後通過一步或多步遍曆0到counter獲得使用者資料。但如果某個使用者從系統中刪除(下面會講到刪除操作),而我們會遍曆0到counter中的所有id,這時就會有些id查詢不到任何資料。
儘管這通常不是問題,但我們不想在不存在的使用者資料上浪費時間,所以需要建立另外一個key"user:list",其value為list或set類型,用於儲存每一個新增的使用者id,並在必要的時候從"user:list"中刪除該id。我更傾向於使用list,因為它可能通過LRANGE命令實現分頁功能。
刪除使用者
還有一個要面臨的問題是"資料完整性",看看我們在刪除使用者時會發生什麼吧。我們需要刪除每一個對此使用者的引用,也就是說,需要刪除下面所有的key"user:id:*","user:username:id",以及"user:list"中的使用者id。
Redis 儲存SQL表格 方法