redis是一種基于鍵值對(key-value)數(shù)據(jù)庫,其中value可以為string、hash、list、set、zset等多種數(shù)據(jù)結構,可以滿足很多應用場景。還提供了鍵過期,發(fā)布訂閱,事務,流水線,等附加功能
二、Redis特性
- 1 速度快
- 2 鍵值對的數(shù)據(jù)結構服務器
- 3 豐富的功能
- 4 簡單穩(wěn)定
- 5 持久化
- 6 主從復制
- 8 高可用和分布式轉移
- 9 客戶端語言多
三、使用場景
- 1 緩存數(shù)據(jù)庫
- 2 排行榜
- 3 計數(shù)器應用
- 4 社交網(wǎng)絡
- 5 消息隊列
四、數(shù)據(jù)類型
1.String
字符串類型是redis最基礎的數(shù)據(jù)結構,首先鍵是字符串類型,而且其他幾種結構都是在字符串類型基礎上構建的,所以字符串類型能為其他四種數(shù)據(jù)結構的學習尊定基礎。
字符串類型實際上可以是字符串(簡單的字符串、復雜的字符串(xml、json)、數(shù)字(整數(shù)、浮點數(shù))、二進制(圖片、音頻、視頻)),但最大不能超過512M。
- 使用實例:
redis 127.0.0.1:6379> SET name "runoob" OK redis 127.0.0.1:6379> GET name "runoob" 復制代碼
- 使用場景:
緩存功能:字符串最經(jīng)典的使用場景,redis最為緩存層,MySQL作為儲存層,絕大部分請求數(shù)據(jù)都是 redis中獲取,由于redis具有支撐高并發(fā)特性,所以緩存通常能起到加速讀寫和降低 后端壓力的作用。
計數(shù)器:許多運用都會使用redis作為計數(shù)的基礎工具,他可以實現(xiàn)快速計數(shù)、查詢緩存的功能, 同時數(shù)據(jù)可以一步落地到其他的數(shù)據(jù)源。如:視頻播放數(shù)系統(tǒng)就是使用redis作為視頻播放數(shù)計數(shù)的基礎組件。
共享session:出于負載均衡的考慮,分布式服務會將用戶信息的訪問均衡到不同服務器上, 用戶刷新一次訪問可能會需要重新登錄,為避免這個問題可以用redis將用戶session集中管理, 在這種模式下只要保證redis的高可用和擴展性的,每次獲取用戶更新或查詢登錄信息都直接從redis中集中獲取。
限速:處于安全考慮,每次進行登錄時讓用戶輸入手機驗證碼,為了短信接口不被頻繁訪問,會限制用戶每分鐘獲取驗證碼的頻率。
2.Hash(哈希)
在redis中哈希類型是指鍵本身又是一種鍵值對結構,如value={{field1,value1},......{fieldN,valueN}} 。
Redis hash 是一個鍵值(key=>value)對集合。
Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用于存儲對象。
每個 hash 可以存儲 232 -1 鍵值對(40多億)
- 使用實例
redis> HMSET myhash field1 "Hello" field2 "World" "OK" redis> HGET myhash field1 "Hello" redis> HGET myhash field2 "World" 復制代碼
- 使用場景
哈希結構相對于字符串序列化緩存信息更加直觀,并且在更新操作上更加便捷。所以常常用于 用戶信息 等管理,但是哈希類型和關系型數(shù)據(jù)庫有所不同,哈希類型是稀疏的,而關系型數(shù)據(jù)庫是完全結構化的,關系型數(shù)據(jù)庫可以做復雜的關系查詢,而redis去模擬關系型復雜查詢,開發(fā)困難,維護成本高。
3.List(列表)
列表類型是用來儲存多個有序的字符串,列表中的每個字符串成為元素(element),一個列表最多可以儲存 2的32次方-1個元素,在redis中,可以隊列表兩端插入(pubsh)和彈出(pop),還可以獲取指定范圍的元素列表、獲取指定索引下表的元素等,列表是一種比較靈活的數(shù)據(jù)結構,它可以充當棧和隊列的角色,實際開發(fā)中有很多應用場景。
列表最多可存儲 232 - 1 元素 (4294967295, 每個列表可存儲40多億)。
- 使用實例:
redis 127.0.0.1:6379> lpush runoob redis (integer) 1 redis 127.0.0.1:6379> lpush runoob mongodb (integer) 2 redis 127.0.0.1:6379> lpush runoob rabitmq (integer) 3 redis 127.0.0.1:6379> lrange runoob 0 10 1) "rabitmq" 2) "mongodb" 3) "redis" redis 127.0.0.1:6379> 復制代碼
- 使用場景
消息對列: redis的lpush+brpop命令組合即可實現(xiàn)阻塞隊列,生產(chǎn)者客戶端是用lupsh從列表左側插入元素,多個消費者客戶端使用brpop命令阻塞時的“搶”列表尾部的元素,多個客戶端保證了消費的負載均衡和高可用性
文章列表:每個用戶都有屬于自己的文章列表,現(xiàn)在需要分頁展示文章列表,此時可以考慮使用列表,列表不但有序,同時支持按照索引范圍獲取元素。
使用技巧:
- lpush+lpop=Stack(棧)
- lpush+rpop=Queue(隊列)
- lpush+ltrim=CApped Collection(有限集合)
- lpush+brpop=Message Queue(消息隊列)
4.Set (集合)
集合類型也是用來保存多個字符串的元素,但和列表不同的是集合中不允許有重復的元素,并且集合中的元素是無序的,不能通過索引下標獲取元素,redis除了支持集合內(nèi)的增刪改查,同時還支持多個集合取交集、并集、差集,并合理的使用好集合類型,能在實際開發(fā)中解決很多實際問題。
集合是通過哈希表實現(xiàn)的,所以添加,刪除,查找的復雜度都是O(1)。
集合中最大的成員數(shù)為 232 - 1(4294967295, 每個集合可存儲40多億個成員)。
- 使用實例:
redis 127.0.0.1:6379> sadd runoob redis (integer) 1 redis 127.0.0.1:6379> sadd runoob mongodb (integer) 1 redis 127.0.0.1:6379> sadd runoob rabitmq (integer) 1 redis 127.0.0.1:6379> sadd runoob rabitmq (integer) 0 redis 127.0.0.1:6379> smembers runoob 1) "redis" 2) "rabitmq" 3) "mongodb" 復制代碼
- 使用場景
標簽(tag):集合類型比較典型的使用場景,如一個用戶對娛樂、體育比較感興趣,另一個可能對新聞感興 趣,這些興趣就是標簽,有了這些數(shù)據(jù)就可以得到同一標簽的人,以及用戶的共同愛好的標簽,這些數(shù)據(jù)對于用戶體驗以及曾強用戶粘度比較重要。(用戶和標簽的關系維護應該放在一個事物內(nèi)執(zhí)行,防止部分命令失敗造成數(shù)據(jù)不一致)
其他
sadd=tagging(標簽)
spop/srandmember=random item(生成隨機數(shù),比如抽獎)
sadd+sinter=social Graph(社交需求)
5.Zset(sorted set:有序集合)
有序集合和集合有著必然的聯(lián)系,他保留了集合不能有重復成員的特性,但不同得是,有序集合中的元素是可以排序的,但是它和列表的使用索引下標作為排序依據(jù)不同的是,它給每個元素設置一個分數(shù),作為排序的依據(jù)。(有序集合中的元素不可以重復,但是csore可以重復,就和一個班里的同學學號不能重復,但考試成績可以相同)。
- 使用實例
redis 127.0.0.1:6379> zadd runoob 0 redis (integer) 1 redis 127.0.0.1:6379> zadd runoob 0 mongodb (integer) 1 redis 127.0.0.1:6379> zadd runoob 0 rabitmq (integer) 1 redis 127.0.0.1:6379> zadd runoob 0 rabitmq (integer) 0 redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000 1) "mongodb" 2) "rabitmq" 3) "redis" 復制代碼
- 使用場景
排行榜:有序集合經(jīng)典使用場景。例如視頻網(wǎng)站需要對用戶上傳的視頻做排行榜,榜單維護可能是多方面:按照時間、按照播放量、按照獲得的贊數(shù)等。
- 不同類型比較
五、發(fā)布與訂閱功能
redis提供了“發(fā)布、訂閱”模式的消息機制,其中消息訂閱者與發(fā)布者不直接通信,發(fā)布者向指定的頻道(channel)發(fā)布消息,訂閱該頻道的每個客戶端都可以接收到消息。
redis主要提供發(fā)布消息、訂閱頻道、取消訂閱以及按照模式訂閱和取消訂閱。
1.發(fā)布與訂閱命令
- 發(fā)布消息
publish channel:test "hello world 復制代碼
- 訂閱消息
subscrible channel:test 復制代碼
- 查看訂閱數(shù)
pubsub numsub channel:test 復制代碼
- 取消訂閱
unsubscribe channel:test 復制代碼
- 按模式訂閱和按模式取消訂閱
psubscribe ch* punsubscribe ch* 復制代碼
2.使用場景
- 1、今日頭條訂閱號、微信訂閱公眾號、新浪微博關注、郵件訂閱系統(tǒng)
- 2、即使通信系統(tǒng)
- 3、群聊部落系統(tǒng)(微信群)
六、 Redis持久化
redis是一個支持持久化的內(nèi)存數(shù)據(jù)庫,也就是說redis需要經(jīng)常將內(nèi)存中的數(shù)據(jù)同步到磁盤來保證持久化,持久化可以避免因進程退出而造成數(shù)據(jù)丟失。
1.持久化方式
RDB持久化把當前進程數(shù)據(jù)生成快照(.rdb)文件保存到硬盤的過程,有手動觸發(fā)和自動觸發(fā)。
- 手動觸發(fā)
save命令:阻塞當前Redis,直到RDB持久化過程完成為止,若內(nèi)存實例比較大會造成長時間阻塞,線上環(huán)境不建議用它.
bgsave命令:redis進程執(zhí)行fork操作創(chuàng)建子線程,由子線程完成持久化,阻塞時間很短(微秒級),是save的優(yōu)化,在執(zhí)行redis-cli shutdown關閉redis服務時,如果沒有開啟AOF持久化,自動執(zhí)行bgsave
- 自動觸發(fā)
針對RDB不適合實時持久化,redis提供了AOF持久化方式來解決 開啟:redis.conf設置:appendonly yes (默認不開啟,為no) 默認文件名:appendfilename "appendonly.aof"
2.bgSave 運行流程
運行流程示意圖如下:
3.RDB文件的操作
- 設置RDB的文件保存路徑
config set dir /usr/local # 將dump.rd 保存到/usr/local/目錄下 復制代碼
- 開始持久化數(shù)據(jù)
bgsave 復制代碼
- 恢復數(shù)據(jù)
將dump.rdb放到redis安裝目錄與redis.conf同級目錄,重啟redis即可
優(yōu)點:
1.壓縮后的二進制文,適用于備份、全量復制,用于災難恢復
2.載RDB恢復數(shù)據(jù)遠快于AOF方式
缺點:
1.無法做到實時持久化,每次都要創(chuàng)建子進程,頻繁操作成本過高
2.保存后的二進制文件,存在老版本不兼容新版本rdb文件的問題.
4.AOF持久化
針對RDB不適合實時持久化,redis提供了AOF持久化方式來解決
- 開始持久化
redis.conf設置:appendonly yes (默認不開啟,為no)
默認文件名:appendfilename "appendonly.aof"
- AOF持久化流程
1.所有的寫入命令(set hset)會append追加到aof_buf緩沖區(qū)中
2.AOF緩沖區(qū)向硬盤做sync同步
3.隨著AOF文件越來越大,需定期對AOF文件rewrite重寫,達到壓縮
4.當redis服務重啟,可load加載AOF文件進行恢復
命令寫入(append), 文件同步(sync), 文件重寫(rewrite), 重啟加載(load)
- AOF配置參數(shù)詳解
appendonly yes //啟用aof持久化方式 #appendfsync always //每收到寫命令就立即強制寫入磁盤,最慢的,但是保證完全的持久化,不推薦使用 appendfsync everysec //每秒強制寫入磁盤一次,性能和持久化方面做了折中,推薦 #appendfsync no //完全依賴os,性能最好,持久化沒保證(操作系統(tǒng)自身的同步) no-appendfsync-on-rewrite yes //正在導出rdb快照的過程中,要不要停止同步aof auto-aof-rewrite-percentage 100 //aof文件大小比起上次重寫時的大小,增長率100%時,重寫 auto-aof-rewrite-min-size 64mb //aof文件,至少超過64M時,重寫 復制代碼
- AOF恢復
1.設置appendonly yes
2.將appendonly.aof放到dir參數(shù)指定的目錄
3.啟動Redis,Redis會自動加載appendonly.aof文件
- AOF與RDB的加載順序
1.當AOF和RDB文件同時存在時,優(yōu)先加載AOF
2.若關閉了AOF,加載RDB文件
3.加載AOF/RDB成功,redis重啟成功
4.AOF/RDB存在錯誤,啟動失敗打印錯誤信息