2014-01-26 09:37:38
來公司快半年了,還有幾天就快回家了,好開心。今天我準備梳理下redis的相關內容。
1.Redis是什么
簡單來講,Redis就是一個key-value數據庫,適合所有數據in-memory的場景。
2.Redis常用數據類型
Redis最常用的數據類型主要是下面5種:
3.Redis里可以有表么
在使用redis的時候,會和使用sql表有很大區別,我們沒有語句去操控redis服務,有的僅僅是一些簡單的命令。這些命令是數據類型敏感的,比如我們把set命令使用在list上,就會得到一個錯誤。我們來考慮一個簡單的sql表。
id | username | passWord | name | surname |
1 | user1 | pass1 | Bob | Smith |
2 | user2 | pass2 | Mario | Rossi |
我們如何才能把這個簡單的sql表存到Redis中呢?在sql結構中,我們可以使用select id的方式,獲取一個記錄的所有內容。所以,就有了下面這種存儲方式。
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,我們就可以通過user:1:username,user:1:password,user:1:name,user:1:surname1這種方式去獲取所有數據了。
如果上面的數據用來支持一個登陸程序,則給定一個用戶名,我們也需要去獲取整條紀錄的信息。這時候最好的方式是建立一個映射關系user-id。即給我們的數據設計添加一個keys,user:username:id。
Key | Value |
---|---|
user:user1:id | 1 |
user:user2:id | 2 |
所以,如果此時Mario Rossi登陸我們的系統,我們就可以根據他提供的用戶名獲取id,從而獲取他的整個用戶信息。
另外一個問題是,我們如何去保證主鍵的唯一性。在sql世界中,我們可以通過 "id int PRimary key auto_increment",的方式解決主鍵問題。在Redis中,我們對應的解決方式是增加一個keys:"user:next_id",把這個key作為一個counter,當我們新增一個user時,可以通過INCR command來手動獲取這個id。
在sql中,如果 select * from users:就可以獲取整張表的數據。為了實現這個功能,我們可以怎么做呢?也許你會覺得,上面的規則,已經足夠我們獲取所有的數據了。通過0到user:next_id的所有ids,就可以了。但是如果有用戶數據被刪除了,我們就不能按照上面的做法來做了。
比較好的解決方式是再增加一個key, user:list 用來存儲所有在用的記錄的id。不用的id,就直接從這個list里刪掉。
最后,當我們刪除一個用戶的時候,我們需要刪除 all the keys user:id:*, user:username:id and the id in "user:list".
新聞熱點
疑難解答