(一)、分段設計法html
使用冒號把 key 中要表達的多種含義分開表示,步驟以下:redis
一、把表名轉化爲 key 前綴數據庫
二、主鍵名(或其餘經常使用於搜索的字段)json
三、主鍵值segmentfault
四、要存儲的字段。安全
eg. 用戶表(user)微信
id數據結構 |
name分佈式 |
email性能 |
---|---|---|
1 |
zj |
156577812@qq.com |
2 |
ai |
156577813@qq.com |
這個簡單的表可能常常會有這個的需求:>根據用戶 id 查詢用戶郵箱地址,能夠選擇把郵箱地址這個數據存到 redis 中:
set user:id:1:email 156577812@qq.com; set user:id:2:email 156577812@qq.com;
注意:Redis的命令不區分大小寫,可是key 嚴格區分大小寫!!!
(一)、簡介
string 是Redis的最基本的數據類型,能夠理解爲與 Memcached 如出一轍的類型,一個key 對應一個 value。string 類型是二進制安全的,意思是 Redis 的 string 能夠包含任何數據,好比圖片或者序列化的對象,一個 redis 中字符串 value 最多能夠是 512M。
(二)、數據模型
string 類型是基本的 Key-Value 結構,Key 是某個數據在 Redis 中的惟一標識,Value 是具體的數據。
Key |
Value |
---|---|
‘name’ |
‘redis’ |
‘type’ |
‘string’ |
(三)、 應用場景
(1) 存儲 MySQL 中某個字段的值
把 key 設計爲 表名:主鍵名:主鍵值:字段名
eg.
set user:id:1:email 156577812@qq.com
(2) 存儲對象
string 類型支持任何格式的字符串,應用最多的就是存儲 json 或其餘對象格式化的字符串。(這種場景下推薦使用 hash 數據類型)
set user:id:1 '[{"id":1,"name":"zj","email":"156577812@qq.com"},{"id":1,"name":"zj","email":"156577812@qq.com"}]'
(3) 生成自增 id
當 redis 的 string 類型的值爲整數形式時,redis 能夠把它當作是整數同樣進行自增(incr)自減(decr)操做。因爲 redis 全部的操做都是原子性的,因此沒必要擔憂多客戶端鏈接時可能出現的事務問題
(四)、string 數據類型在 Redis 中的相關命令:
PS:上面的 ttl 命令是返回 key 的剩餘過時時間,單位爲秒。
上面是 string 類型的基本命令,下面介紹幾個自增自減操做,這在實際工做中仍是特別有用的(分佈式環境中統計系統的在線人數,利用Redis的高性能讀寫,在Redis中完成秒殺,而不是直接操做數據庫。)。
(一)、簡介
hash 是一個鍵值對集合,是一個 string 類型的 key和 value 的映射表,key 仍是key,可是value是一個鍵值對(key-value)。類比於 Java裏面的 Map<String,Map<String,Object>> 集合。
(二)、數據模型
假設有一張數據庫表以下:
id |
name |
type |
---|---|---|
1 |
redis |
hash |
若是要用 redis 的 hash 結構存儲,數據模型以下:
hash數據類型在存儲上述類型的數據時具備比 string 類型更靈活、更快的優點,具體的說,使用 string 類型存儲,必然須要轉換和解析 json 格式的字符串,即使不須要轉換,在內存開銷方面,仍是 hash 佔優點。
(三)、應用場景
hash 類型十分適合存儲對象類數據,相對於在 string 中介紹的把對象轉化爲 json 字符串存儲,hash 的結構能夠任意添加或刪除‘字段名’,更加高效靈活。
(四)、hash數據類型在 Redis 中的相關命令:
演示以下:
(一)、簡介
list 列表,它是簡單的字符串列表,按照插入順序排序,你能夠添加一個元素到列表的頭部(左邊)或者尾部(右邊),它的底層其實是個鏈表。
(二)、數據模型
常見操做時用 lpush 命令在 list 頭部插入元素, 用 rpop 命令在 list 尾取出數據。
(三)、應用場景
(1) 消息隊列
redis 的 list 數據類型對於大部分使用者來講,是實現隊列服務的最經濟,最簡單的方式。
(2) 「最新內容」
由於 list 結構的數據查詢兩端附近的數據性能很是好,因此適合一些須要獲取最新數據的場景,好比新聞類應用的 「最近新聞」。
(四)、hash數據類型在 Redis 中的相關命令:
list 是鏈表結構,全部若是在頭部和尾部插入數據,性能會很是高,不受鏈表長度的影響;但若是在鏈表中插入數據,性能就會愈來愈差。
(一)、簡介
set 數據類型是一個集合(沒有排序,不重複),能夠對 set 類型的數據進行添加、刪除、判斷是否存在等操做(時間複雜度是 O(1) )
set 集合不容許數據重複,若是添加的數據在 set 中已經存在,將只保留一份。
set 類型提供了多個 set 之間的聚合運算,如求交集、並集、補集,這些操做在 redis 內部完成,效率很高。
(二)、數據模型
(三)、應用場景
set 類型的特色是——不重複且無序的一組數據,而且具備豐富的計算功能,在一些特定的場景中能夠高效的解決通常關係型數據庫不方便作的工做。
1. 「共同好友列表」
社交類應用中,獲取兩我的或多我的的共同好友,兩我的或多我的共同關注的微博這樣相似的功能,用 MySQL 的話操做很複雜,能夠把每一個人的好友 id 存到集合中,獲取共同好友的操做就能夠簡單到一個取交集的命令就搞定。
// 這裏爲了方便閱讀,把 id 替換成姓名 sadd user:wade james melo paul kobe sadd user:james wade melo paul kobe sadd user:paul wade james melo kobe sadd user:melo wade james paul kobe // 獲取 wade 和 james 的共同好友 sinter user:wade user:james /* 輸出: * 1) "kobe" * 2) "paul" * 3) "melo" */ // 獲取香蕉四兄弟的共同好友 sinter user:wade user:james user:paul user:melo /* 輸出: * 1) "kobe" */ /* 相似的需求還有不少 , 必須把每一個標籤下的文章 id 存到集合中,能夠很容易的求出幾個不一樣標籤下的共同文章; 把每一個人的愛好存到集合中,能夠很容易的求出幾我的的共同愛好。 */
(四)、set數據類型在 Redis 中的相關命令:
Redis 的 set 是 string 類型的無序集合。
5、zset 數據類型
(一)、簡介
zset(sorted set 有序集合),和上面的set 數據類型同樣,也是 string 類型元素的集合,可是它是有序的。
(二)、應用場景
在集合類型的場景上加入排序就是有序集合的應用場景了。好比根據好友的「親密度」排序顯示好友列表。
// 用元素的分數(score)表示與好友的親密度 zadd user:kobe 80 james 90 wade 85 melo 90 paul // 根據「親密度」給好友排序 zrevrange user:kobe 0 -1 /** * 輸出: * 1) "wade" * 2) "paul" * 3) "melo" * 4) "james" */ // 增長好友的親密度 zincrby user:kobe 15 james // 再次根據「親密度」給好友排序 zrevrange user:kobe 0 -1 /** * 輸出: * 1) "james" * 2) "wade" * 3) "paul" * 2) "melo" */ //相似的需求還出如今根據文章的閱讀量或點贊量對文章列表排序 新浪微博微信TwitterFacebook
(三)、zset數據類型在 Redis 中的相關命令:
關於 key 的命令應該說是最經常使用的,須要你們記住。
這裏在介紹一個命令 :
OBJECT ENCODING key
這是用來顯示這五種數據類型的底層數據結構,下一篇博客咱們會詳細介紹。
上面的命令咱們給string 數據類型 k1 複製str,給 k2 複製123,經過 OBJECT ENCODING 顯示底層實現的數據類型分別是 embstr 和 int。這究竟是什麼呢?下篇博客咱們會詳細介紹的。
參考資料:http://www.javashuo.com/article/p-dippyzhn-gq.html
https://segmentfault.com/a/1190000012212663?utm_source=tag-newest