Redis內存數據庫筆記

[TOC]redis

1、Redis介紹

redis是一種基於鍵值對(key-value)數據庫,其中value能夠爲string、hash、list、set、zset等多種數據結構,能夠知足不少應用場景。還提供了鍵過時,發佈訂閱,事務,流水線,等附加功能 sql

redis

2、Redis特性

  • 1 速度快
  • 2 鍵值對的數據結構服務器
  • 3 豐富的功能
  • 4 簡單穩定
  • 5 持久化
  • 6 主從複製
  • 8 高可用和分佈式轉移
  • 9 客戶端語言多

3、使用場景

  • 1 緩存數據庫
  • 2 排行榜
  • 3 計數器應用
  • 4 社交網絡
  • 5 消息隊列

使用場景

4、數據類型

1.String

字符串類型是redis最基礎的數據結構,首先鍵是字符串類型,並且其餘幾種結構都是在字符串類型基礎上構建的,因此字符串類型能爲其餘四種數據結構的學習尊定基礎。mongodb

字符串類型實際上能夠是字符串(簡單的字符串、複雜的字符串(xml、json)、數字(整數、浮點數)、二進制(圖片、音頻、視頻)),但最大不能超過512M。數據庫

  • 使用實例:
redis 127.0.0.1:6379> SET name "runoob"
OK
redis 127.0.0.1:6379> GET name
"runoob"
複製代碼
  • 使用場景:

緩存功能:字符串最經典的使用場景,redis最爲緩存層,Mysql做爲儲存層,絕大部分請求數據都是 redis中獲取,因爲redis具備支撐高併發特性,因此緩存一般能起到加速讀寫和下降 後端壓力的做用。json

計數器:許多運用都會使用redis做爲計數的基礎工具,他能夠實現快速計數、查詢緩存的功能, 同時數據能夠一步落地到其餘的數據源。如:視頻播放數系統就是使用redis做爲視頻播放數計數的基礎組件。後端

共享session:出於負載均衡的考慮,分佈式服務會將用戶信息的訪問均衡到不一樣服務器上, 用戶刷新一次訪問可能會須要從新登陸,爲避免這個問題能夠用redis將用戶session集中管理, 在這種模式下只要保證redis的高可用和擴展性的,每次獲取用戶更新或查詢登陸信息都直接從redis中集中獲取。緩存

限速:處於安全考慮,每次進行登陸時讓用戶輸入手機驗證碼,爲了短信接口不被頻繁訪問,會限制用戶每分鐘獲取驗證碼的頻率。安全

2.Hash(哈希)

在redis中哈希類型是指鍵自己又是一種鍵值對結構,如value={{field1,value1},......{fieldN,valueN}} 。bash

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"
複製代碼
  • 使用場景

哈希結構相對於字符串序列化緩存信息更加直觀,而且在更新操做上更加便捷。因此經常用於用戶信息等管理,可是哈希類型和關係型數據庫有所不一樣,哈希類型是稀疏的,而關係型數據庫是徹底結構化的,關係型數據庫能夠作複雜的關係查詢,而redis去模擬關係型複雜查詢,開發困難,維護成本高。

3.List(列表)

列表類型是用來儲存多個有序的字符串,列表中的每一個字符串成爲元素(element),一個列表最多能夠儲存 2的32次方-1個元素,在redis中,能夠隊列表兩端插入(pubsh)和彈出(pop),還能夠獲取指定範圍的元素列表、獲取指定索引下表的元素等,列表是一種比較靈活的數據結構,它能夠充當棧和隊列的角色,實際開發中有不少應用場景。

列表最多可存儲 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命令組合便可實現阻塞隊列,生產者客戶端是用lupsh從列表左側插入元素,多個消費者客戶端使用brpop命令阻塞時的「搶」列表尾部的元素,多個客戶端保證了消費的負載均衡和高可用性

消息對列

文章列表:每一個用戶都有屬於本身的文章列表,如今須要分頁展現文章列表,此時能夠考慮使用列表,列表不但有序,同時支持按照索引範圍獲取元素。

使用技巧:

  • lpush+lpop=Stack(棧)
  • lpush+rpop=Queue(隊列)
  • lpush+ltrim=Capped Collection(有限集合)
  • lpush+brpop=Message Queue(消息隊列)

4.Set (集合)

集合類型也是用來保存多個字符串的元素,但和列表不一樣的是集合中不容許有重複的元素,而且集合中的元素是無序的,不能經過索引下標獲取元素,redis除了支持集合內的增刪改查,同時還支持多個集合取交集、並集、差集,併合理的使用好集合類型,能在實際開發中解決不少實際問題。

集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是O(1)。

集合中最大的成員數爲 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):集合類型比較典型的使用場景,如一個用戶對娛樂、體育比較感興趣,另外一個可能對新聞感興 趣,這些興趣就是標籤,有了這些數據就能夠獲得同一標籤的人,以及用戶的共同愛好的標籤,這些數據對於用戶體驗以及曾強用戶粘度比較重要。(用戶和標籤的關係維護應該放在一個事物內執行,防止部分命令失敗形成數據不一致)

其餘
sadd=tagging(標籤)
spop/srandmember=random item(生成隨機數,好比抽獎)
sadd+sinter=social Graph(社交需求)

5.Zset(sorted set:有序集合)

有序集合和集合有着必然的聯繫,他保留了集合不能有重複成員的特性,但不一樣得是,有序集合中的元素是能夠排序的,可是它和列表的使用索引下標做爲排序依據不一樣的是,它給每一個元素設置一個分數,做爲排序的依據。(有序集合中的元素不能夠重複,可是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"
複製代碼
  • 使用場景

排行榜:有序集合經典使用場景。例如視頻網站須要對用戶上傳的視頻作排行榜,榜單維護多是多方面:按照時間、按照播放量、按照得到的贊數等。

  • 不一樣類型比較

比較

5、發佈與訂閱功能

redis提供了「發佈、訂閱」模式的消息機制,其中消息訂閱者與發佈者不直接通訊,發佈者向指定的頻道(channel)發佈消息,訂閱該頻道的每一個客戶端均可以接收到消息。

發佈訂閱模型

redis主要提供發佈消息、訂閱頻道、取消訂閱以及按照模式訂閱和取消訂閱。

1.發佈與訂閱命令

  • 發佈消息
publish channel:test "hello world 複製代碼
  • 訂閱消息
subscrible channel:test

複製代碼
  • 查看訂閱數
pubsub numsub channel:test

複製代碼
  • 取消訂閱
unsubscribe channel:test

複製代碼
  • 按模式訂閱和按模式取消訂閱
psubscribe ch* 

punsubscribe ch*
複製代碼

2.使用場景

  • 一、今日頭條訂閱號、微信訂閱公衆號、新浪微博關注、郵件訂閱系統
  • 二、即便通訊系統
  • 三、羣聊部落系統(微信羣)

6、 Redis持久化

redis是一個支持持久化的內存數據庫,也就是說redis須要常常將內存中的數據同步到磁盤來保證持久化,持久化能夠避免因進程退出而形成數據丟失。

1.持久化方式

RDB持久化把當前進程數據生成快照(.rdb)文件保存到硬盤的過程,有手動觸發和自動觸發。

  • 手動觸發

save命令:阻塞當前Redis,直到RDB持久化過程完成爲止,若內存實例比較大會形成長時間阻塞,線上環境不建議用它.

bgsave命令:redis進程執行fork操做建立子線程,由子線程完成持久化,阻塞時間很短(微秒級),是save的優化,在執行redis-cli shutdown關閉redis服務時,若是沒有開啓AOF持久化,自動執行bgsave

  • 自動觸發

針對RDB不適合實時持久化,redis提供了AOF持久化方式來解決 開啓:redis.conf設置:appendonly yes (默認不開啓,爲no) 默認文件名:appendfilename "appendonly.aof"

2.bgSave 運行流程

運行流程示意圖以下:

bgsave運行流程

3.RDB文件的操做

  • 設置RDB的文件保存路徑
config set dir /usr/local   # 將dump.rd 保存到/usr/local/目錄下 
複製代碼
  • 開始持久化數據
bgsave
複製代碼
  • 恢復數據

將dump.rdb放到redis安裝目錄與redis.conf同級目錄,重啓redis便可

優勢:

1.壓縮後的二進制文,適用於備份、全量複製,用於災難恢復
2.載RDB恢復數據遠快於AOF方式

缺點:

1.沒法作到實時持久化,每次都要建立子進程,頻繁操做成本太高
2.保存後的二進制文件,存在老版本不兼容新版本rdb文件的問題.

4.AOF持久化

針對RDB不適合實時持久化,redis提供了AOF持久化方式來解決

  • 開始持久化

redis.conf設置:appendonly yes (默認不開啓,爲no)
默認文件名:appendfilename "appendonly.aof"

  • AOF持久化流程

1.全部的寫入命令(set hset)會append追加到aof_buf緩衝區中

2.AOF緩衝區向硬盤作sync同步

3.隨着AOF文件愈來愈大,需按期對AOF文件rewrite重寫,達到壓縮

4.當redis服務重啓,可load加載AOF文件進行恢復

AOF持久化流程
命令寫入(append), 文件同步(sync), 文件重寫(rewrite), 重啓加載(load)

  • AOF配置參數詳解
appendonly yes           //啓用aof持久化方式
#appendfsync always //每收到寫命令就當即強制寫入磁盤,最慢的,可是保證徹底的持久化,不推薦使用
appendfsync everysec    //每秒強制寫入磁盤一次,性能和持久化方面作了折中,推薦
#appendfsync no //徹底依賴os,性能最好,持久化沒保證(操做系統自身的同步)
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參數指定的目錄
3.啓動Redis,Redis會自動加載appendonly.aof文件

  • AOF與RDB的加載順序

1.當AOF和RDB文件同時存在時,優先加載AOF
2.若關閉了AOF,加載RDB文件
3.加載AOF/RDB成功,redis重啓成功
4.AOF/RDB存在錯誤,啓動失敗打印錯誤信息

AOF與RDB加載順序
相關文章
相關標籤/搜索