關於redis的問題,我的理解正確否?
伊谢尔伦
伊谢尔伦 2017-04-21 10:57:54
0
4
588

從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

假設需求:獲取我的好友的所有除我以外的所有好友。

暫時就這麼多……不知道表述是否清楚了。

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回覆(4)
左手右手慢动作

首先如果你要用多個字段的話,就不要單一單一存字段,或者把一個物件序列化以後再存,這樣跟memcache完全沒區別。

其次,你要弄清楚一個事實,我們用redis不是來完全代替關係資料庫的,像你說的那個按用戶名搜尋用戶完全不用放到redis裡,不要為了使用redis而去用redis。

用redis你可以做緩存,這樣你只需要把主鍵當作key,你也可以利用它的索引特性來做列表

多個欄位你可以用hash物件儲存

HMSET user:1234 name "hello" password "123456" timestamp "12321321"

把主鍵存到一個SET或者SORTED SET

SADD user_list 1234

值得注意的是redis的SORT命令可以代替SQL解决很多查询,比如像上面这种哈希存储方式,如果我们要按timestamp排序并在一定范围内列出user

SORT user_list BY user:*->timestamp GET # LIMIT 0 10 DESC

它等同於SQL語句

SELECT * FROM user ORDER BY timestamp DESC LIMIT 0 10
刘奇

第一個問題只能說你把redis當memcache使用了,去了解一下hash結構,用戶資訊應該用hash結構,如user:1->{username:sss,age:12}

PHPzhong

redis支持multi的

迷茫

在redis中更多使用hash方式儲存資料吧。這樣可以把一些需要使用的關聯關係用hash裡的鍵值保存下來。其次原來在關聯式資料庫中設計的一些關係以及查詢方法習慣,在使用redis時是需要調整的。不能完全照搬以前的思路來做了。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板