從RDBMS徹底的過渡到NoSQL,關鍵的是不是NoSQL中的Key設計咧? 比如原先的登錄注冊,RDBMS中可能是
user_id, username, password
1 , user , xxxxxxxx
2 , user2 , xxxxxxxx
過渡到Redis,可以這樣
users:user password
users:user2 password
檢測用戶是否已經注冊
RDBMS:
select count(*) from table where username = 'user2'
Redis:
Get users:user2
但是拋棄“關係”又怎麼實現“關係”呢? 比如用戶還有profile。 redis可以以users:username為key。然後存個對象進去。 但是怎麼進行搜索呢?比如,我要獲取所有注冊時間在指定時間的一批用戶。當然,可以按照users:username:profile_name挨個存,比如:
users:user2:profile_photo /path/hash.jpg
users:user2:profile_regdate timestamp
users:user3:profile_regdate timestamp
但是,會不會出現,刪除某用戶的時候,由於特殊原因導致刪不幹淨的問題……比如user3的所有數據正在刪除,然後異常了,導致profile_regdate沒有刪除。而且以後也檢測不到了。
再者,好友關係。redis可以這麼存:
relation:uid:fuid timestamp
relation:fuid:uid timestamp
假設需求:獲取我的好友的所有除我以外的所有好友。
暫時就這麼多……不知道表述是否清楚了。
首先如果你要用多個字段的話,就不要單一單一存字段,或者把一個物件序列化以後再存,這樣跟memcache完全沒區別。
其次,你要弄清楚一個事實,我們用redis不是來完全代替關係資料庫的,像你說的那個按用戶名搜尋用戶完全不用放到redis裡,不要為了使用redis而去用redis。
用redis你可以做緩存,這樣你只需要把主鍵當作key,你也可以利用它的索引特性來做列表
多個欄位你可以用
hash
物件儲存把主鍵存到一個
SET
或者SORTED SET
裡值得注意的是redis的
SORT
命令可以代替SQL
解决很多查询,比如像上面这种哈希存储方式,如果我们要按timestamp
排序并在一定范围内列出user
來它等同於SQL語句
第一個問題只能說你把redis當memcache使用了,去了解一下hash結構,用戶資訊應該用hash結構,如user:1->{username:sss,age:12}
redis支持multi的
在redis中更多使用hash方式儲存資料吧。這樣可以把一些需要使用的關聯關係用hash裡的鍵值保存下來。其次原來在關聯式資料庫中設計的一些關係以及查詢方法習慣,在使用redis時是需要調整的。不能完全照搬以前的思路來做了。