Redis 存儲SQL表格 方法
[譯]Redis大冒險
原文: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表格 方法