Redis 索引值設計問題?

來源:互聯網
上載者:User
作為一個小白,最近學習 Redis 緩衝,心中有一個疑問:
假如在 mysql 中有一張 user 表用於儲存使用者的相關資訊,表的主要欄位有:id,username,password,email,nick,born,sex,status等等,現在想將 user 資料表中的所有資料全部緩衝到 redis 資料庫伺服器中,請問 redis 的索引值應該怎麼設定呢?
是設為類似於:

user:[id]:username username_valueuser:[id]:password password_valueuser:[id]:email email_valueuser:[id]:nick nick_value...

還是設定為這樣的形式呢:

user:[id] json_string// json_string 是將一條使用者資訊的二維數群組轉換成json字串

請問這兩種形式哪種更好一些?哪種更節約記憶體一些?
希望各位大嬸能解答一下我的疑問,對此表示萬分感謝 =.=

回複內容:

作為一個小白,最近學習 Redis 緩衝,心中有一個疑問:
假如在 mysql 中有一張 user 表用於儲存使用者的相關資訊,表的主要欄位有:id,username,password,email,nick,born,sex,status等等,現在想將 user 資料表中的所有資料全部緩衝到 redis 資料庫伺服器中,請問 redis 的索引值應該怎麼設定呢?
是設為類似於:

user:[id]:username username_valueuser:[id]:password password_valueuser:[id]:email email_valueuser:[id]:nick nick_value...

還是設定為這樣的形式呢:

user:[id] json_string// json_string 是將一條使用者資訊的二維數群組轉換成json字串

請問這兩種形式哪種更好一些?哪種更節約記憶體一些?
希望各位大嬸能解答一下我的疑問,對此表示萬分感謝 =.=

存hash呢 使用者id加個首碼設為key.比如user:888
hash集合裡存常用使用者屬性.
另外不推薦全部使用者無腦存緩衝...這樣有點本末倒置了..mysql會一臉懵逼的(要我何用←_←)...可以試著建立一個簡單的熱度統計 熱使用者存緩衝

實在不行你就給hash設一個逾時 每個使用者資訊第一次登入後就存一段時間....省的你勞神費心...

沒研究過不同資料類型與記憶體的關係
從商務邏輯角度來講,具體怎麼設計儲存看需求來定
比如緩衝只是為了查詢方便與資訊展示,選第二種,mysql或者mongodb有相關操作再更新相應緩衝
如果需要賦予登入、資料CURD等邏輯,同樓上,建議用hash,比如用HMSET,而非String類型

第一種好些吧,可以查到某一個,不需要編碼

個人認為第1種比較好,方便單個擷取和修改,如果是後者,每次擷取或者修改單個屬性都要擷取全部,而且解析json擷取其他序列化和還原序列化的形式都會帶來額外的消耗。
大部分情況,查詢不需要查詢所有的欄位,修改的話,大部分都是只修改1個欄位

我也碰到過資料表緩衝的問題,我的解決方案是使用多種資料類型來配合完成

首先每條資料記錄存成一個字典,用表名+ID然後md5加密後作為字典的名字
然後使用有序集合來儲存每一條記錄的字典名稱與排序權重(我這裡是有排序的需求,所以使用有序集合,否則的話使用集合或者列表都是可以的)

PS:redis中無法進行where查詢之類的操作,所以如果有需要可以將在代碼層進行篩選然後再按分類存進redis,比如我就是對資料進行篩選後存進幾個不同的有序集合,然後再將這些有序集合的名字維護到一個列表中

後者。
操作方便,並且可以避免無底洞現象。

緩衝無底洞現象

不要用json,看似取值方便,但是多處同時更新快取資料的時候簡直是不可描述。寫程式沒有方便不方便,只有你寫的東西可不可靠。

沒有必要全部緩衝,比如性別就不需要,只有經常訪問的才需要緩衝。

redis下用json怎麼說呢。。不是說不可能,只是沒有充分利用redis的價值 開心就好

使用hash結構。推薦第二種,資料存緩衝的第一個意義是加快瀏覽速度,而對一些會修改的資料我正常是多建一個緩衝來儲存要修改的資料,實際展示的資料會是正常緩衝+修改緩衝的資料。

一般業內的做法就是
值儲存成二進位的形式,而不是字串,這樣是省記憶體的,效率也高,缺點就是通過redis-cli沒法看明文,因為已經是二進位形式了
比如你這個
key=user:[id]
value=這個user對象轉成的二進位形式

那麼下次你用java讀這個value後, 會自動轉為你那個對象, 多簡單, 不用一個一個屬性set了

不過你要注意一旦涉及成這樣,就無法通過user的其他屬性進行搜尋了,前提是你要瞭解你的業務, 如果有其他欄位的搜尋你要加一組其他的key value, 在nosql中資料冗餘很常見

nosql都是這樣, 寫程式的一定要瞭解業務, 否則資料結構設計的會不好, 雖然nosql的使用門檻很低,但是設計門檻還是有的

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.