1.什么是redis?
redis是一個基於內存的高性能key-value數據庫
2.redis基本數據類型及應用場景
支持多種數據類型:
string(字符串)
String數據結構是簡單的key-value類型,value其實不僅可以是String,也可以是數字。
常規key-value緩存應用;
list(列表)
list就是鏈表,略有數據結構知識的人都應該能理解其結構。使用Lists結構,我們可以輕松地實現最新消息排行等功能。List的另一個應用就是消息隊列,可以利用List的PUSH操作,將任務存在List中,然后工作線程再用POP操作將任務取出進行執行。Redis還提供了操作List中某一段的api,你可以直接查詢,刪除List中某一段的元素。
Redis的list是每個子元素都是String類型的雙向鏈表,可以通過push和pop操作從列表的頭部或者尾部添加或者刪除元素,這樣List即可以作為棧,也可以作為隊列。
消息隊列系統
使用list可以構建隊列系統,使用sorted set甚至可以構建有優先級的隊列系統。
比如:將Redis用作日志收集器
實際上還是一個隊列,多個端點將日志信息寫入Redis,然后一個worker統一將所有日志寫到磁盤。
hash(散列)
Redis hash是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
存儲部分變更的數據,如用戶信息等。
sets (集合)
set就是一個集合,集合的概念就是一堆不重復值的組合。利用Redis提供的set數據結構,可以存儲一些集合性的數據。set中的元素是沒有順序的。
sorted set(有序集合)
和set相比,sorted set增加了一個權重參數score,使得集合中的元素能夠按score進行有序排列,比如一個存儲全班同學成績的sorted set,其集合value可以是同學的學號,而score就可以是其考試得分,這樣在數據插入集合的時候,就已經進行了天然的排序。可以用sorted set來做帶權重的隊列,比如普通消息的score為1,重要消息的score為2,然后工作線程可以選擇按score的倒序來獲取工作任務。讓重要的任務優先執行。
3.分布式
redis支持主從的模式。
原則:
Master會將數據同步到slave,而slave不會將數據同步到master。Slave啟動時會連接master來同步數據。
典型的讀寫分離模型。利用master來插入數據,slave提供檢索服務。有效減少單個機器的並發訪問數量。
讀寫分離模型:
通過增加Slave DB的數量,讀的性能可以線性增長,為了避免Master DB的單點故障,集群一般都會采用兩台Master DB 做雙機熱備,所以整個集群的讀和寫的可用性都非常高。
缺陷:
不管是Master還是Slave,每個節點都必須保存完整的數據,如果在數據量很大的情況下,集群的擴展能力是受限於單個節點的存儲能力,而且對於Write-intensive類型的應用,讀寫分離架構並不適合。
為了解決讀寫分離模型的缺陷,可以將數分片模型應用進來。可以將每個節點看成都是master,然后通過業務實現數據分片。結合兩種模型,可以將每個master設計成由一個master和多個slave組成的模型。
4.redis優點
a.單線程,利用redis隊列技術並將訪問變為串行訪問,消除了傳統數據庫串行控制的開銷
b.redis具有快速和持久化的特征,速度快,因為數據存在內存中。
c.分布式 讀寫分離模式
d.支持豐富數據類型
e.支持事務,操作都是原子性,所謂原子性就是對數據的更改要么全部執行,要不全部不執行。
f.可用於緩存,消息,按key設置過期時間,過期后自動刪除
5.回收策略
從最近最少使用的數據淘汰,挑選將要過期的數據淘汰。
volatile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰
volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰
allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
no-enviction(驅逐):禁止驅逐數據
6.redis和memcache相比,有哪些優勢?
a.memcache所有的值均是簡單的字符串,redis支持更為豐富的數據類型
b.redis速度比memcached快很多
c.redis支持持久化
7.redis與memcache區別
a.存儲方式 memcache存在內存中,redis存在硬盤中,保證數據持久化
b.數據類型 memcache對數據類型支持相對簡單,redis有復雜的數據類型
c.使用底層模型不同:底層實現方式以及客戶端之間通信的應用協議不一樣
d.redis最大可以達到1G而memcache只有1MB
8.redis 持久化
redis提供了不同級別的持久化方式,一種是RDB,一種AOF。可以同時開啟兩種持久化方式, 在這種情況下, 當redis重啟的時候會優先載入AOF文件來恢復原始的數據,因為在通常情況下AOF文件保存的數據集要比RDB文件保存的數據集要完整.
RDB:在指定的時間間隔能對數據進行快照存儲(隔一段時間,把內存里的數據轉存在硬盤里的文件)
優點:
- RDB是一個非常緊湊的文件,它保存了某個時間點得數據集,非常適用於數據集的備份,比如您可以在每個小時報保存一下過去24小時內的數據,同時每天保存過去30天的數據,這樣即使出了問題您也可以根據需求恢復到不同版本的數據集.
- RDB是一個緊湊的單一文件,很方便傳送到另一個遠端數據中心或者亞馬遜的S3(可能加密),非常適用於災難恢復.
- RDB在保存RDB文件時父進程唯一需要做的就是fork出一個子進程,接下來的工作全部由子進程來做,父進程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能.
- 與AOF相比,在恢復大的數據集的時候,RDB方式會更快一些.
缺點:
- 如果您希望在redis意外停止工作(例如電源中斷)的情況下丟失的數據最少的話,那么RDB不適合您.雖然您可以配置不同的save時間點(例如每隔5分鍾並且對數據集有100個寫的操作),是Redis要完整的保存整個數據集是一個比較繁重的工作,您通常會每隔5分鍾或者更久做一次完整的保存,萬一在Redis意外宕機,您可能會丟失幾分鍾的數據.
- RDB 需要經常fork子進程來保存數據集到硬盤上,當數據集比較大的時候,fork的過程是非常耗時的,可能會導致Redis在一些毫秒級內不能響應客戶端的請求.如果數據集巨大並且CPU性能不是很好的情況下,這種情況會持續1秒,AOF也需要fork,但是您可以調節重寫日志文件的頻率來提高數據集的耐久度.
AOF:每次對服務器寫的操作,當服務器重啟的時候會重新執行這些命令來恢復原始的數據,AOF命令以redis協議追加保存每次寫的操作到文件末尾.Redis還能對AOF文件進行后台重寫,使得AOF文件的體積不至於過大.
優點:
- 使用AOF 會讓您的Redis更加耐久: 您可以使用不同的fsync策略:無fsync,每秒fsync,每次寫的時候fsync.使用默認的每秒fsync策略,Redis的性能依然很好(fsync是由后台線程進行處理的,主線程會盡力處理客戶端請求),一旦出現故障,您最多丟失1秒的數據.
- AOF文件是一個只進行追加的日志文件,所以不需要寫入seek,即使由於某些原因(磁盤空間已滿,寫的過程中宕機等等)未執行完整的寫入命令,您也也可使用redis-check-aof工具修復這些問題.
- Redis 可以在 AOF 文件體積變得過大時,自動地在后台對 AOF 進行重寫: 重寫后的新 AOF 文件包含了恢復當前數據集所需的最小命令集合。 整個重寫操作是絕對安全的,因為 Redis 在創建新 AOF 文件的過程中,會繼續將命令追加到現有的 AOF 文件里面,即使重寫過程中發生停機,現有的 AOF 文件也不會丟失。 而一旦新 AOF 文件創建完畢,Redis 就會從舊 AOF 文件切換到新 AOF 文件,並開始對新 AOF 文件進行追加操作。
- AOF 文件有序地保存了對數據庫執行的所有寫入操作, 這些寫入操作以 Redis 協議的格式保存, 因此 AOF 文件的內容非常容易被人讀懂, 對文件進行分析(parse)也很輕松。 導出(export) AOF 文件也非常簡單: 舉個例子, 如果您不小心執行了 FLUSHALL 命令, 但只要 AOF 文件未被重寫, 那么只要停止服務器, 移除 AOF 文件末尾的 FLUSHALL 命令, 並重啟 Redis , 就可以將數據集恢復到 FLUSHALL 執行之前的狀態。
缺點:
- 對於相同的數據集來說,AOF 文件的體積通常要大於 RDB 文件的體積。
根據所使用的 fsync 策略,AOF 的速度可能會慢於 RDB 。 在一般情況下, 每秒 fsync 的性能依然非常高, 而關閉 fsync 可以讓 AOF 的速度和 RDB 一樣快, 即使在高負荷之下也是如此。 不過在處理巨大的寫入載入時,RDB 可以提供更有保證的最大延遲時間(latency)。
9.Redis快照
在默認情況下, Redis 將數據庫快照保存在名字為 dump.rdb的二進制文件中。您可以對 Redis 進行設置, 讓它在“ N 秒內數據集至少有 M 個改動”這一條件被滿足時, 自動保存一次數據集。您也可以通過調用 SAVE或者 BGSAVE , 手動讓 Redis 進行數據集保存操作。
比如說, 以下設置會讓 Redis 在滿足“ 60 秒內有至少有 1000 個鍵被改動”這一條件時, 自動保存一次數據集:save 60 1000
這種持久化方式被稱為快照 snapshotting.
以上就是這次的全部內容!