Redis 是一個開源的鍵值對緩存和存儲(key-value cache and store)荐吵, 由于keys可以包含(contain)strings, hashes, lists, sets, sorted sets, bitmaps and hyperloglogs這么多類型的數(shù)據雕崩,所以也稱為 data structure server歌憨。
今天我們就用到了 sorted sets(排序集 或者稱為有序集),也常用 zset 來指代 sorted sets杨箭。
背景
我簡單地說一下背景储藐。我們把業(yè)務數(shù)據進行分類,按照關系型數(shù)據庫要求的范式進行建表吨铸,存放到 MySQL 中。將以 hfeed 為主體的數(shù)據庫表進行數(shù)據變換祖秒,存放到 Redis 中诞吱。
讀寫分離提高性能
示意圖:
MySQL 表的設計
hfeed 主表,hfcomment 表竭缝,user 表房维,house 表。
Redis 的設計
我們將組合變換后的 hfeed 數(shù)據歌馍,稱之為擴展的 hfeed握巢,簡稱為 Hfeed-X。
key | score | member | |
---|---|---|---|
命名 | cid_{$user_id} | {$hfeed_id} | {$Hfeed-X} |
MySQL表對照 | user表主鍵(client's id)) | hfeed表主鍵 | 4個表數(shù)據組合轉換(json格式) |
- 新發(fā)生的 feed 在最上面展現(xiàn)松却,以 hfeed_id 做 score 可以滿足這個需求暴浦;
- 如果一個 feed 有新回復時溅话,業(yè)務需求要求排到最前面,則可以按照 feed 更新時間來排序歌焦,將 feed 更新時間作為 score 即可飞几;
說明
mobile app 發(fā)起的數(shù)據變更活動會進入 MySQL,進而觸發(fā) Redis 的數(shù)據變更独撇。
mobile app 從 Redis 讀取擴展的 hfeed 時屑墨,沒有什么計算量,同時基于 Redis 的存取效率纷铣,其訪問體驗應當是不錯的卵史。
sorted sets
排序集的基本含義是在一個key下可以存儲多個元素值(element),每個元素有一個用于排序的 score 值搜立。每一個元素值是唯一的以躯,重復的元素值是不允許的。
如果一個元素值已經在集合中存在啄踊,那么插入這個元素時忧设,會更新這個元素的 score 值,元素則重新插入到合適的位置以保持排序颠通。
多個元素有同樣的 score址晕,也就意味著他們排序一樣,他們之間則按照字典序進行排列顿锰。
排序集是按照 score 的升序排列的谨垃。
元素(elements)在命令中也經常稱為成員(members)。
命令
了解 redis 的快速方法就是安裝好 redis撵儿,在命令行中鍵入數(shù)據示例來了解各個命令以及數(shù)據集(有時需要翻墻乘客,可能用到 G 搜索了)。
新增命令:ZADD
讀取命令:ZREVRANGE淀歇,ZRANGE易核,ZRANGEBYSCORE
備注
- 文檔
- Data types short summary
- Introduction to Redis data types
- sets:元素唯一。
- sorted sets:元素唯一浪默,按照元素的 score 排序牡直,但元素的 score 可以相同,score 必須為數(shù)字纳决。
- hashes:對象的理想數(shù)據類型碰逸。
Redis Hashes are maps between string fields and string values, so they are the perfect data type to represent objects (e.g. A User with a number of fields like name, surname, age, and so forth)
感謝 @徐永軍