【實踐】REDIS緩存數(shù)據(jù)庫從安裝到入門

1.摘要

Redis(REmote DIctionary Server) 是一個開源的使用ANSI C語言編寫扁瓢、遵守BSD協(xié)議、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫判帮,并提供多種語言的API。
對一個產(chǎn)品溉箕,技術(shù)的認(rèn)知晦墙,從基本的安裝和使用開始最容易獲得直觀認(rèn)知。
本文包括REDIS在UBUNTU的安裝肴茄,基本命令的操作使用和不錯的參考文檔晌畅。

具體目錄結(jié)構(gòu)如下:

  1. 安裝
  2. 命令
    3.1 REDIS配置
    3.2 設(shè)置密碼和驗證
    3.3 REDIS支持的類型
    <1> String(字符串)
    <2>Hash(哈希)
    <3> List(列表)
    <4> Set(集合)
    <5> zset(sorted set:有序集合)
    3.4 Redis 發(fā)布訂閱
  3. REDIS常見問題
    5.Redis面試題
    6.參考

2. 安裝

在 Ubuntu 系統(tǒng)安裝 Redis 可以使用以下命令:

sudo apt-get update
sudo apt-get install redis-server

啟動 Redis:

redis-server

查看 redis 是否啟動:

redis-cli

以上命令將打開以下終端:
redis 127.0.0.1:6379>
127.0.0.1 是本機(jī) IP ,6379 是 redis 服務(wù)端口」烟担現(xiàn)在我們輸入 PING 命令抗楔,能返回PONG表示成功了。

3. 命令

3.1 REDIS配置

Redis 的配置文件位于 Redis 安裝目錄下(ubuntu系統(tǒng)下拦坠,默認(rèn)為/etc/redis/redis.conf)连躏,文件名為 redis.conf(Windows 名為 redis.windows.conf)。
你可以通過 CONFIG 命令查看或設(shè)置配置項贞滨。

redis 127.0.0.1:6379> CONFIG GET *

redis.conf 配置項說明如下:

序號 配置項 說明
1 daemonize no Redis 默認(rèn)不是以守護(hù)進(jìn)程的方式運(yùn)行入热,可以通過該配置項修改,使用 yes 啟用守護(hù)進(jìn)程(Windows 不支持守護(hù)線程的配置為 no )
2 pidfile /var/run/redis.pid 當(dāng) Redis 以守護(hù)進(jìn)程方式運(yùn)行時晓铆,Redis 默認(rèn)會把 pid 寫入 /var/run/redis.pid 文件勺良,可以通過 pidfile 指定
3 port 6379 指定 Redis 監(jiān)聽端口,默認(rèn)端口為 6379骄噪,作者在自己的一篇博文中解釋了為什么選用 6379 作為默認(rèn)端口尚困,因為 6379 在手機(jī)按鍵上 MERZ 對應(yīng)的號碼,而 MERZ 取自意大利歌女 Alessia Merz 的名字
4 bind 127.0.0.1 綁定的主機(jī)地址
5 timeout 300 當(dāng)客戶端閑置多長時間后關(guān)閉連接链蕊,如果指定為 0尾组,表示關(guān)閉該功能
6 loglevel notice 指定日志記錄級別忙芒,Redis 總共支持四個級別:debug、verbose讳侨、notice呵萨、warning,默認(rèn)為 notice
7 logfile stdout 日志記錄方式跨跨,默認(rèn)為標(biāo)準(zhǔn)輸出潮峦,如果配置 Redis 為守護(hù)進(jìn)程方式運(yùn)行,而這里又配置為日志記錄方式為標(biāo)準(zhǔn)輸出勇婴,則日志將會發(fā)送給 /dev/null
8 databases 16 設(shè)置數(shù)據(jù)庫的數(shù)量忱嘹,默認(rèn)數(shù)據(jù)庫為0,可以使用SELECT 命令在連接上指定數(shù)據(jù)庫id
9 save <seconds> <changes> Redis 默認(rèn)配置文件中提供了三個條件:save 900 1 save 300 10 save 60 10000 分別表示 900 秒(15 分鐘)內(nèi)有 1 個更改耕渴,300 秒(5 分鐘)內(nèi)有 10 個更改以及 60 秒內(nèi)有 10000 個更改拘悦。指定在多長時間內(nèi),有多少次更新操作橱脸,就將數(shù)據(jù)同步到數(shù)據(jù)文件础米,可以多個條件配合
10 rdbcompression yes 指定存儲至本地數(shù)據(jù)庫時是否壓縮數(shù)據(jù),默認(rèn)為 yes添诉,Redis 采用 LZF 壓縮屁桑,如果為了節(jié)省 CPU 時間,可以關(guān)閉該選項栏赴,但會導(dǎo)致數(shù)據(jù)庫文件變的巨大
11 dbfilename dump.rdb 指定本地數(shù)據(jù)庫文件名蘑斧,默認(rèn)值為 dump.rdb
12 dir ./ 指定本地數(shù)據(jù)庫存放目錄
13 slaveof <masterip> <masterport> 設(shè)置當(dāng)本機(jī)為 slav 服務(wù)時,設(shè)置 master 服務(wù)的 IP 地址及端口须眷,在 Redis 啟動時竖瘾,它會自動從 master 進(jìn)行數(shù)據(jù)同步
14 masterauth <master-password> 當(dāng) master 服務(wù)設(shè)置了密碼保護(hù)時,slav 服務(wù)連接 master 的密碼
15 requirepass foobared 設(shè)置 Redis 連接密碼花颗,如果配置了連接密碼捕传,客戶端在連接 Redis 時需要通過 AUTH <password> 命令提供密碼,默認(rèn)關(guān)閉
16 maxclients 128 設(shè)置同一時間最大客戶端連接數(shù)捎稚,默認(rèn)無限制乐横,Redis 可以同時打開的客戶端連接數(shù)為 Redis 進(jìn)程可以打開的最大文件描述符數(shù)求橄,如果設(shè)置 maxclients 0今野,表示不作限制。當(dāng)客戶端連接數(shù)到達(dá)限制時罐农,Redis 會關(guān)閉新的連接并向客戶端返回 max number of clients reached 錯誤信息
17 maxmemory <bytes> 指定 Redis 最大內(nèi)存限制条霜,Redis 在啟動時會把數(shù)據(jù)加載到內(nèi)存中,達(dá)到最大內(nèi)存后涵亏,Redis 會先嘗試清除已到期或即將到期的 Key宰睡,當(dāng)此方法處理 后蒲凶,仍然到達(dá)最大內(nèi)存設(shè)置,將無法再進(jìn)行寫入操作拆内,但仍然可以進(jìn)行讀取操作旋圆。Redis 新的 vm 機(jī)制,會把 Key 存放內(nèi)存麸恍,Value 會存放在 swap 區(qū)
18 appendonly no 指定是否在每次更新操作后進(jìn)行日志記錄灵巧,Redis 在默認(rèn)情況下是異步的把數(shù)據(jù)寫入磁盤,如果不開啟抹沪,可能會在斷電時導(dǎo)致一段時間內(nèi)的數(shù)據(jù)丟失刻肄。因為 redis 本身同步數(shù)據(jù)文件是按上面 save 條件來同步的,所以有的數(shù)據(jù)會在一段時間內(nèi)只存在于內(nèi)存中融欧。默認(rèn)為 no
19 appendfilename appendonly.aof 指定更新日志文件名敏弃,默認(rèn)為 appendonly.aof
20 appendfsync everysec 指定更新日志條件,共有 3 個可選值:no:表示等操作系統(tǒng)進(jìn)行數(shù)據(jù)緩存同步到磁盤(快)always:表示每次更新操作后手動調(diào)用 fsync() 將數(shù)據(jù)寫到磁盤(慢噪馏,安全)everysec:表示秒同步一次(折中麦到,默認(rèn)值)
21 vm-enabled no 指定是否啟用虛擬內(nèi)存機(jī)制,默認(rèn)值為 no逝薪,簡單的介紹一下隅要,VM 機(jī)制將數(shù)據(jù)分頁存放,由 Redis 將訪問量較少的頁即冷數(shù)據(jù) swap 到磁盤上董济,訪問多的頁面由磁盤自動換出到內(nèi)存中(在后面的文章我會仔細(xì)分析 Redis 的 VM 機(jī)制)
22 vm-swap-file /tmp/redis.swap 虛擬內(nèi)存文件路徑步清,默認(rèn)值為 /tmp/redis.swap,不可多個 Redis 實例共享
23 vm-max-memory 0 將所有大于 vm-max-memory 的數(shù)據(jù)存入虛擬內(nèi)存虏肾,無論 vm-max-memory 設(shè)置多小廓啊,所有索引數(shù)據(jù)都是內(nèi)存存儲的(Redis 的索引數(shù)據(jù) 就是 keys),也就是說封豪,當(dāng) vm-max-memory 設(shè)置為 0 的時候谴轮,其實是所有 value 都存在于磁盤。默認(rèn)值為 0
24 vm-page-size 32 Redis swap 文件分成了很多的 page吹埠,一個對象可以保存在多個 page 上面第步,但一個 page 上不能被多個對象共享,vm-page-size 是要根據(jù)存儲的 數(shù)據(jù)大小來設(shè)定的缘琅,作者建議如果存儲很多小對象粘都,page 大小最好設(shè)置為 32 或者 64bytes;如果存儲很大大對象刷袍,則可以使用更大的 page翩隧,如果不確定,就使用默認(rèn)值
25 vm-pages 134217728 設(shè)置 swap 文件中的 page 數(shù)量呻纹,由于頁表(一種表示頁面空閑或使用的 bitmap)是在放在內(nèi)存中的堆生,专缠,在磁盤上每 8 個 pages 將消耗 1byte 的內(nèi)存。
26 vm-max-threads 4 設(shè)置訪問swap文件的線程數(shù),最好不要超過機(jī)器的核數(shù),如果設(shè)置為0,那么所有對swap文件的操作都是串行的淑仆,可能會造成比較長時間的延遲涝婉。默認(rèn)值為4
27 glueoutputbuf yes 設(shè)置在向客戶端應(yīng)答時,是否把較小的包合并為一個包發(fā)送蔗怠,默認(rèn)為開啟
28 hash-max-zipmap-entries 64 hash-max-zipmap-value 512 指定在超過一定的數(shù)量或者最大的元素超過某一臨界值時嘁圈,采用一種特殊的哈希算法
29 activerehashing yes 指定是否激活重置哈希,默認(rèn)為開啟(后面在介紹 Redis 的哈希算法時具體介紹)
30 include /path/to/local.conf 指定包含其它的配置文件蟀淮,可以在同一主機(jī)上多個Redis實例之間使用同一份配置文件最住,而同時各個實例又擁有自己的特定配置文件

更多信息可參考:https://www.runoob.com/redis/redis-conf.html

3.2 設(shè)置密碼和驗證

在配置文件中配置requirepass的密碼(當(dāng)redis重啟時密碼依然有效)。

redis 127.0.0.1:6379> config set requirepass mypass

查詢密碼:

   redis 127.0.0.1:6379> config get requirepass
   (error) ERR operation not permitted

密碼驗證:

   redis 127.0.0.1:6379> auth mypass
   OK

再次查詢:

   redis 127.0.0.1:6379> config get requirepass
   1) "requirepass"
   2) "mypass"

PS:如果配置文件中沒添加密碼 那么redis重啟后怠惶,密碼失效涨缚;

如果需要在遠(yuǎn)程 redis 服務(wù)上執(zhí)行命令,同樣我們使用的也是 redis-cli 命令策治。

$ redis-cli -h host -p port -a password

【實例】
以下實例演示了如何連接到主機(jī)為 127.0.0.1脓魏,端口為 6379 ,密碼為 mypass 的 redis 服務(wù)上通惫。

$redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
redis 127.0.0.1:6379>

先登陸后驗證:

redis 127.0.0.1:6379> auth "mypass"
OK

AUTH命令跟其他redis命令一樣茂翔,是沒有加密的;阻止不了攻擊者在網(wǎng)絡(luò)上竊取你的密碼履腋;

3.3 REDIS支持的類型

Redis支持五種數(shù)據(jù)類型:string(字符串)珊燎,hash(哈希),list(列表)遵湖,set(集合)及zset(sorted set:有序集合)悔政。

<1> String(字符串)

string 類型是 Redis 最基本的數(shù)據(jù)類型,string 類型的值最大能存儲 512MB延旧。

各個數(shù)據(jù)類型應(yīng)用場景:
https://www.runoob.com/redis/redis-data-types.html
【實例】

redis 127.0.0.1:6379> SET name "duncanwang"
OK
redis 127.0.0.1:6379> GET name 
"duncanwang"

<2>Hash(哈希)

Redis hash 是一個 string 類型的 field 和 value 的映射表谋国,hash 特別適合用于存儲對象。

【實例】

127.0.0.1:6379> HMSET say field1 "Hello" field2 "world"
OK
127.0.0.1:6379> HMGET say field1
1) "Hello"
127.0.0.1:6379> HMGET say field2
1) "world"

實例中我們使用了 Redis HMSET, HGET 命令迁沫,HMSET 設(shè)置了兩個 field=>value 對, HGET 獲取對應(yīng) field 對應(yīng)的 value芦瘾。

每個 hash 可以存儲 232 -1 鍵值對(40多億)。

<3> List(列表)

Redis 列表是簡單的字符串列表集畅,按照插入順序排序近弟。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
【實例】

127.0.0.1:6379> LPUSH mylist "duncan"
(integer) 1
127.0.0.1:6379> LPUSH mylist "jenise"
(integer) 2
127.0.0.1:6379> LPUSH mylist "dijior"
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 2
1) "dijior"
2) "jenise"
3) "duncan"

列表最多可存儲 232 - 1 元素 (4294967295, 每個列表可存儲40多億)牡整。

<4> Set(集合)

Redis 的 Set 是 string 類型的無序集合藐吮。
集合是通過哈希表實現(xiàn)的溺拱,所以添加逃贝,刪除谣辞,查找的復(fù)雜度都是 O(1)。

SADD 命令
添加一個 string 元素到 key 對應(yīng)的 set 集合中沐扳,成功返回 1泥从,如果元素已經(jīng)在集合中返回 0。

SADD key member

【實例】

127.0.0.1:6379> SADD myset "duncanwang"
(integer) 1
127.0.0.1:6379> SADD myset "jenise"
(integer) 1
127.0.0.1:6379> SADD myset "dejior"
(integer) 1
127.0.0.1:6379> SADD myset "duncanwang"
(integer) 0
127.0.0.1:6379> SMEMBERS myset
1) "dejior"
2) "jenise"
3) "duncanwang"

注意:以上實例中 rabitmq 添加了兩次沪摄,但根據(jù)集合內(nèi)元素的唯一性躯嫉,第二次插入的元素將被忽略。

集合中最大的成員數(shù)為 232 - 1(4294967295, 每個集合可存儲40多億個成員)

<5> zset(sorted set:有序集合)

Redis zset 和 set 一樣也是string類型元素的集合,且不允許重復(fù)的成員杨拐。
不同的是每個元素都會關(guān)聯(lián)一個double類型的分?jǐn)?shù)祈餐。redis正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序。

zset的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)哄陶。

ZADD 命令
添加元素到集合帆阳,元素在集合中存在則更新對應(yīng)score

ZADD key score member

【實例】

127.0.0.1:6379> ZADD myzset 0  "duncanwang"
(integer) 1
127.0.0.1:6379> ZADD myzset 1  "jenise"
(integer) 1
127.0.0.1:6379> ZADD myzset 2  "dejior"
(integer) 1
127.0.0.1:6379> ZADD myzset 1  "dejior"
(integer) 0
127.0.0.1:6379> ZRANGEBYSCORE myzset 0 3
1) "duncanwang"
2) "dejior"
3) "jenise"

3.4 Redis 發(fā)布訂閱

Redis 發(fā)布訂閱(pub/sub)是一種消息通信模式:發(fā)送者(pub)發(fā)送消息,訂閱者(sub)接收消息屋吨。

Redis 客戶端可以訂閱任意數(shù)量的頻道蜒谤。

下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 至扰、 client5 和 client1 之間的關(guān)系:

當(dāng)有新消息通過 PUBLISH 命令發(fā)送給頻道 channel1 時鳍徽, 這個消息就會被發(fā)送給訂閱它的三個客戶端:

【實例】
以下實例演示了發(fā)布訂閱是如何工作的。在我們實例中我們創(chuàng)建了訂閱頻道名為 redisChat:

redis 127.0.0.1:6379> SUBSCRIBE redisChat

Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1

現(xiàn)在敢课,我們先重新開啟個 redis 客戶端阶祭,然后在同一個頻道 redisChat 發(fā)布兩次消息,訂閱者就能接收到消息直秆。

redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"

(integer) 1

redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by runoob.com"

(integer) 1

訂閱者的客戶端會顯示如下消息

1) "message"
2) "redisChat"
3) "Redis is a great caching technique"
1) "message"
2) "redisChat"
3) "Learn redis by runoob.com"

Redis 發(fā)布訂閱命令

下表列出了 redis 發(fā)布訂閱常用命令:

序號 命令 描述
1 PSUBSCRIBE pattern [pattern ...] 訂閱一個或多個符合給定模式的頻道胖翰。
2 PUBSUB subcommand [argument [argument ...]] 查看訂閱與發(fā)布系統(tǒng)狀態(tài)。
3 PUBLISH channel message 將信息發(fā)送到指定的頻道切厘。
4 PUNSUBSCRIBE [pattern [pattern ...]] 退訂所有給定模式的頻道萨咳。
5 SUBSCRIBE channel [channel ...] 訂閱給定的一個或多個頻道的信息。
6 UNSUBSCRIBE [channel [channel ...]] 指退訂給定的頻道疫稿。

3.5 Redis 事務(wù)

Redis 事務(wù)可以一次執(zhí)行多個命令宁赤, 并且?guī)в幸韵氯齻€重要的保證:

批量操作在發(fā)送 EXEC 命令前被放入隊列緩存。
收到 EXEC 命令后進(jìn)入事務(wù)執(zhí)行酪劫,事務(wù)中任意命令執(zhí)行失敗扼仲,其余的命令依然被執(zhí)行。
在事務(wù)執(zhí)行過程途蒋,其他客戶端提交的命令請求不會插入到事務(wù)執(zhí)行命令序列中猛遍。
一個事務(wù)從開始到執(zhí)行會經(jīng)歷以下三個階段:

開始事務(wù)。
命令入隊。
執(zhí)行事務(wù)懊烤。

實例

以下是一個事務(wù)的例子梯醒, 它先以 MULTI 開始一個事務(wù), 然后將多個命令入隊到事務(wù)中腌紧, 最后由 EXEC 命令觸發(fā)事務(wù)茸习, 一并執(zhí)行事務(wù)中的所有命令:

redis 127.0.0.1:6379> MULTI
OK

redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED

redis 127.0.0.1:6379> GET book-name
QUEUED

redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED

redis 127.0.0.1:6379> SMEMBERS tag
QUEUED

redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
   2) "C++"
   3) "Programming"

單個 Redis 命令的執(zhí)行是原子性的,但 Redis 沒有在事務(wù)上增加任何維持原子性的機(jī)制壁肋,所以 Redis 事務(wù)的執(zhí)行并不是原子性的号胚。

事務(wù)可以理解為一個打包的批量執(zhí)行腳本,但批量指令并非原子化的操作浸遗,中間某條指令的失敗不會導(dǎo)致前面已做指令的回滾猫胁,也不會造成后續(xù)的指令不做。

Redis 事務(wù)命令

下表列出了 redis 事務(wù)的相關(guān)命令:

序號 命令 描述
1 DISCARD 取消事務(wù)跛锌,放棄執(zhí)行事務(wù)塊內(nèi)的所有命令杜漠。
2 EXEC 執(zhí)行所有事務(wù)塊內(nèi)的命令。
3 MULTI 標(biāo)記一個事務(wù)塊的開始察净。
4 UNWATCH 取消 WATCH 命令對所有 key 的監(jiān)視驾茴。
5 WATCH key [key ...] 監(jiān)視一個(或多個) key ,如果在事務(wù)執(zhí)行之前這個(或這些) key 被其他命令所改動氢卡,那么事務(wù)將被打斷锈至。

4. REDIS常見問題

4.1 如何能夠通過外網(wǎng)IP訪問redis服務(wù)器?

默認(rèn)情況下译秦,連接Redis只能通過本地(127.0.0.1)來連接峡捡,不能通過外部IP來訪問。為了支持外部IP訪問筑悴,需要做響應(yīng)的調(diào)整们拙。
(1) 確認(rèn)虛擬主機(jī)的安全組放開了6379端口。
(2)注釋掉只能通過本地(127.0.0.1)配置
進(jìn)入Redis目錄打開Redis.conf配置文件阁吝,注釋掉bind對應(yīng)代碼砚婆。

vim /etc/redis/redis.conf

# bind 127.0.0.1
# 默認(rèn)不是守護(hù)進(jìn)程方式運(yùn)行,修改為yes
daemonize yes
#禁用保護(hù)模式
protected-mode no

kill掉已啟動的進(jìn)程突勇,然后重啟Redis并指明配置文件:

redis-server /etc/redis/redis.conf

4.2 redis無法向磁盤寫入RDB的報錯

現(xiàn)象:
redis set failed: MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.
分析:
日志顯示:overcommit_memory被設(shè)置成0装盯,redis后臺的保存操作在低可用內(nèi)存的情況下會失敗。這個時候很清楚甲馋,并不是磁盤被占滿的緣故埂奈,事實上磁盤剩余量還很多。
查了下定躏,內(nèi)核參數(shù) vm.overcommit_memory 接受三種取值:

0 – Heuristic overcommit handling. 這是缺省值账磺,它允許overcommit芹敌,但過于明目張膽的overcommit會被拒絕,比如malloc一次性申請的內(nèi)存大小就超過了系統(tǒng)總內(nèi)存垮抗。Heuristic的意思是“試探式的”氏捞,內(nèi)核利用某種算法(對該算法的詳細(xì)解釋請看文末)猜測你的內(nèi)存申請是否合理,它認(rèn)為不合理就會拒絕overcommit借宵。
1 – Always overcommit. 允許overcommit,對內(nèi)存申請來者不拒矾削。
2 – Don’t overcommit. 禁止overcommit壤玫。
CommitLimit 就是overcommit的閾值,申請的內(nèi)存總數(shù)超過CommitLimit的話就算是overcommit哼凯。
解決方案:
1欲间、打開redis配置文件

$ sudo vi /etc/redis/redis.conf  # 注意vi后面有空格

在下圖此行中將yes改為no,保存退出

2断部、指定配置加載文件

$ sudo redis-server /etc/redis/redis.conf
$ redis-cli

以上就是解決redis無法寫入數(shù)據(jù)的問題猎贴。

4.2 redis如何查看所有鍵值的內(nèi)容?

KEYS * 即可查看蝴光。

4.3 redis常見性能問題和解決方案她渴?

(1) Master最好不要做任何持久化工作,如RDB內(nèi)存快照和AOF日志文件
(2) 如果數(shù)據(jù)比較重要蔑祟,某個Slave開啟AOF備份數(shù)據(jù)趁耗,策略設(shè)置為每秒同步一次
(3) 為了主從復(fù)制的速度和連接的穩(wěn)定性,Master和Slave最好在同一個局域網(wǎng)內(nèi)
(4) 盡量避免在壓力很大的主庫上增加從庫
(5) 主從復(fù)制不要用圖狀結(jié)構(gòu)疆虚,用單向鏈表結(jié)構(gòu)更為穩(wěn)定苛败,即:Master <- Slave1 <- Slave2 <- Slave3…
這樣的結(jié)構(gòu)方便解決單點(diǎn)故障問題,實現(xiàn)Slave對Master的替換径簿。如果Master掛了罢屈,可以立刻啟用Slave1做Master,其他不變篇亭。

4.4 MySQL里有2000w數(shù)據(jù)缠捌,redis中只存20w的數(shù)據(jù),如何保證redis中的數(shù)據(jù)都是熱點(diǎn)數(shù)據(jù)译蒂?

相關(guān)知識:redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時候鄙币,就會施行數(shù)據(jù)淘汰策略。redis 提供 6種數(shù)據(jù)淘汰策略:
voltile-lru:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰蹂随;
volatile-ttl:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過期的數(shù)據(jù)淘汰十嘿;
volatile-random:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰;
allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰岳锁;
allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰
no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)绩衷;

5.Redis面試題

(1)吐血整理60個Redis面試題,全網(wǎng)最全了
https://zhuanlan.zhihu.com/p/93515595
(2)面圈網(wǎng)-真題
http://www.mianshigee.com/question/search/?q=redis

6.參考

(1)官網(wǎng)
https://redis.io/
(2)redis中文網(wǎng)
http://www.redis.cn/documentation.html
(3)Redis 教程
https://www.runoob.com/redis/redis-tutorial.html
(4)Redis 服務(wù)器
https://www.runoob.com/redis/redis-server.html
(5)Redis 數(shù)據(jù)備份與恢復(fù)
https://www.runoob.com/redis/redis-backup.html
(6)Redis 持久化
一起看懂Redis兩種持久化方式的原理
https://segmentfault.com/a/1190000015983518?utm_source=tag-newest
(6) memcache和redis原理對比
https://www.kancloud.cn/mayan0718/php/555555
(7) Redis底層數(shù)據(jù)結(jié)構(gòu) - 跳躍表
http://www.reibang.com/p/0206ef2cffa4

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子咳燕,更是在濱河造成了極大的恐慌勿决,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件招盲,死亡現(xiàn)場離奇詭異低缩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)曹货,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門咆繁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人顶籽,你說我怎么就攤上這事玩般。” “怎么了礼饱?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵坏为,是天一觀的道長。 經(jīng)常有香客問我镊绪,道長匀伏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任蝴韭,我火速辦了婚禮帘撰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘万皿。我一直安慰自己摧找,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布牢硅。 她就那樣靜靜地躺著蹬耘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪减余。 梳的紋絲不亂的頭發(fā)上综苔,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音位岔,去河邊找鬼如筛。 笑死,一個胖子當(dāng)著我的面吹牛抒抬,可吹牛的內(nèi)容都是我干的杨刨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼擦剑,長吁一口氣:“原來是場噩夢啊……” “哼妖胀!你這毒婦竟也來了芥颈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赚抡,失蹤者是張志新(化名)和其女友劉穎爬坑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涂臣,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盾计,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赁遗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片署辉。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吼和,靈堂內(nèi)的尸體忽然破棺而出涨薪,到底是詐尸還是另有隱情骑素,我是刑警寧澤炫乓,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站献丑,受9級特大地震影響末捣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜创橄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一箩做、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妥畏,春花似錦邦邦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至网棍,卻和暖如春黔龟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背滥玷。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工氏身, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惑畴。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓蛋欣,卻偏偏與公主長得像,于是被迫代替她去往敵國和親如贷。 傳聞我的和親對象是個殘疾皇子豁状,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • NOSQL類型簡介鍵值對:會使用到一個哈希表捉偏,表中有一個特定的鍵和一個指針指向特定的數(shù)據(jù),如redis泻红,volde...
    MicoCube閱讀 3,993評論 2 27
  • redis是一個以key-value存儲的非關(guān)系型數(shù)據(jù)庫夭禽。有五種數(shù)據(jù)類型,string谊路、hashes讹躯、list、s...
    林ze宏閱讀 997評論 0 0
  • 安全性 設(shè)置客戶端連接后進(jìn)行任何其他指令前需要使用的密碼缠劝。 警告:因為redis 速度相當(dāng)快潮梯,所以在一臺比較好的服...
    OzanShareing閱讀 1,777評論 1 7
  • 1 Redis介紹1.1 什么是NoSql為了解決高并發(fā)秉馏、高可擴(kuò)展、高可用脱羡、大數(shù)據(jù)存儲問題而產(chǎn)生的數(shù)據(jù)庫解決方...
    克魯?shù)吕?/span>閱讀 5,303評論 0 36
  • 不想說話是真的 不想睡也是真的 不知道喜歡你是不是真的 不喜歡你離開是真的 不想你靠太近還是真的 以前的他太假 現(xiàn)...
    六六歡喜閱讀 330評論 0 0