2022年Redis最新面試題第9篇 - Redis運(yùn)維和部署

大家好,我是漫步coding, 最近在整理2022年Redis最新面試題, 大家也可以通過我下面的博客地址在線閱讀,今天講講第9篇 - Redis運(yùn)維和部署。本文首發(fā)于公眾號(hào):漫步coding

image

2022年Redis最新面試題目錄

運(yùn)維和部署
Redis 如何設(shè)置密碼及驗(yàn)證密碼?

Redis 如何做內(nèi)存優(yōu)化?

Redis 如何設(shè)置密碼及驗(yàn)證密碼?
出現(xiàn)概率: ★★★

redis沒有實(shí)現(xiàn)訪問控制這個(gè)功能,但是它提供了一個(gè)輕量級(jí)的認(rèn)證方式,可以編輯redis.conf配置來啟用認(rèn)證。

1、初始化Redis密碼:

在配置文件中有個(gè)參數(shù):requirepass 這個(gè)就是配置redis訪問密碼的參數(shù);

比如 requirepass test123;(Ps:需重啟Redis才能生效)

redis的查詢速度是非??斓?,外部用戶一秒內(nèi)可以嘗試多達(dá)150K個(gè)密碼;所以密碼要盡量長(zhǎng)(對(duì)于DBA 沒有必要必須記住密碼);

2、不重啟Redis設(shè)置密碼:

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

redis 127.0.0.1:6379> config set requirepass test123
查詢密碼:

redis 127.0.0.1:6379> config get requirepass
(error) ERR operation not permitted
密碼驗(yàn)證:

redis 127.0.0.1:6379> auth test123
OK
再次查詢:

redis 127.0.0.1:6379> config get requirepass

  1. "requirepass"
  2. "test123"
    PS:如果配置文件中沒添加密碼 那么redis重啟后,密碼失效;

3、在Redis集群中使用認(rèn)證密碼

如果Redis服務(wù)器,使用了集群。除了在master中配置密碼外,也需要在slave中進(jìn)行相應(yīng)配置。在slave的配置文件中找到如下行,去掉注釋并修改與master相同的密碼即可:

masterauth master-password

Redis 如何做內(nèi)存優(yōu)化?
出現(xiàn)概率: ★★★

在思考如何做內(nèi)存優(yōu)化之前, 我們先看看redisObject對(duì)象的結(jié)構(gòu)


image.png

type 代表數(shù)據(jù)類型,比如 list, set, hash, 由于一共是 4 bits, 所以 redis 最多能支持 16 種

encoding 代表底層編碼類型,比如 ziplist, intset, EMBSTR, raw 等等

refcount 引用計(jì)數(shù),對(duì)象創(chuàng)建時(shí)為 1, 當(dāng)值為 0 時(shí)釋放

ptr 指向真實(shí)數(shù)據(jù),雖然是個(gè)指針,但有時(shí)為了高效使用內(nèi)存,直接存儲(chǔ)整型

對(duì)象有如下特性:

redis 在執(zhí)行命令之前,根據(jù)對(duì)象的類型就可以判斷命令是否可以執(zhí)行。

依托對(duì)象,可以針對(duì)不同的使用場(chǎng)景,為對(duì)象設(shè)置不同的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),從而優(yōu)化對(duì)象在不同場(chǎng)景下的使用效率。

redis 對(duì)象系統(tǒng)實(shí)現(xiàn)了基于引用計(jì)數(shù)技術(shù)的內(nèi)存回收機(jī)制,當(dāng)程序不再使用某個(gè)對(duì)象的時(shí)候,這個(gè)對(duì)象所占用的內(nèi)存就會(huì)被自動(dòng)釋放。

redis 使用引用計(jì)數(shù)技術(shù)實(shí)現(xiàn)了對(duì)象共享機(jī)制,一定場(chǎng)景下,可以通過讓多個(gè)數(shù)據(jù)庫(kù)鍵共享同一個(gè)對(duì)象來節(jié)約內(nèi)存。

redis 對(duì)象帶有訪問時(shí)間記錄,可以用來計(jì)算數(shù)據(jù)庫(kù)鍵的空轉(zhuǎn)時(shí)間,在服務(wù)器啟用 maxmemory 的情況下,空轉(zhuǎn)時(shí)長(zhǎng)較大的鍵可能被優(yōu)先刪除。

1、縮減鍵值對(duì)象

縮減鍵(key)和值(value)的長(zhǎng)度

key長(zhǎng)度:如在設(shè)計(jì)鍵時(shí),在完整描述業(yè)務(wù)情況下,鍵值越短越好。
value長(zhǎng)度:值對(duì)象縮減比較復(fù)雜,常見需求是把業(yè)務(wù)對(duì)象序列化成二進(jìn)制數(shù)組放入Redis。

類似如果想在Redis 存用戶的簡(jiǎn)介:

這樣如果一個(gè)用戶的

{gender: 'male', name: '漫步coding'}
可以做一些映射

keyMap = {
'gender': 'a'
'sex': 'b',
...
'profile': 'a1',
'name': 'b1',
}
存在redis映射后就是

{'a': 'male', 'b1': '漫步coding'}
同時(shí)也可以對(duì)female, male 這些枚舉值做一次映射。

同時(shí)值對(duì)象除了存儲(chǔ)二進(jìn)制數(shù)據(jù)之外,通常還會(huì)使用通用格式存儲(chǔ)數(shù)據(jù)比如:json,xml等作為字符串存儲(chǔ)在Redis中。這種方式優(yōu)點(diǎn)是方便調(diào)試和跨語(yǔ)言,但是同樣的數(shù)據(jù)相比字節(jié)數(shù)組所需的空間更大,在內(nèi)存緊張的情況下,可以使用通用壓縮算法壓縮json,xml后再存入Redis,從而降低內(nèi)存占用,例如使用GZIP壓縮后的json可降低約60%的空間。

2、共享對(duì)象池

對(duì)象共享池指Redis內(nèi)部維護(hù)[0-9999]的整數(shù)對(duì)象池。創(chuàng)建大量的整數(shù)類型redisObject存在內(nèi)存開銷,每個(gè)redisObject內(nèi)部結(jié)構(gòu)至少占16字節(jié),甚至超過了整數(shù)自身空間消耗。所以Redis內(nèi)存維護(hù)一個(gè)[0-9999]的整數(shù)對(duì)象池,用于節(jié)約內(nèi)存。除了整數(shù)值對(duì)象,其他類型如list,hash,set,zset內(nèi)部元素也可以使用整數(shù)對(duì)象池。因此開發(fā)中在滿足需求的前提下,盡量使用整數(shù)對(duì)象以節(jié)省內(nèi)存。

127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> object refcount a
(integer) 2147483647
127.0.0.1:6379> set b 1
OK
127.0.0.1:6379> object refcount b
(integer) 2147483647
127.0.0.1:6379> set c 10000
OK
127.0.0.1:6379> object refcount c
(integer) 1
127.0.0.1:6379>
object refcount b和 object refcount a為什么是2147483647, 查看源碼,發(fā)現(xiàn)新版本的redis中OBJ_SHARED_INTEGERS變量定義了共享整數(shù)10000(0-9999),并且定義不被銷毀的全局對(duì)象的引用數(shù)量OBJ_SHARED_REFCOUNT為INT_MAX,INT_MAX = 2^31 - 1 =2147483647。

image.png
image.png

但是如果對(duì)象超出 9999 范圍等于 10000 的時(shí)候,比如 object refcount c 返回的是 (integer) 1,就不會(huì)使用對(duì)象內(nèi)存。另外, 這些共享對(duì)象不單單只有字符串鍵可以使用, 那些在數(shù)據(jù)結(jié)構(gòu)中嵌套了字符串對(duì)象的對(duì)象(linkedlist 編碼的列表對(duì)象、 hashtable 編碼的哈希對(duì)象、 hashtable 編碼的集合對(duì)象、以及 zset 編碼的有序集合對(duì)象)都可以使用這些共享對(duì)象。

為什么 Redis 不共享包含字符串的對(duì)象?

redis 之所以只能使用數(shù)字共享,因?yàn)閿?shù)字的復(fù)用概率最大,其次就是對(duì)于使用對(duì)象共享的關(guān)鍵問題就是判斷相等性,只有在共享對(duì)象和目標(biāo)對(duì)象完全相等的情況下,redis 才會(huì)使用共享對(duì)象。數(shù)字的比較算法復(fù)雜度是 o (1),如果判斷的是字符串,那么比較的復(fù)雜度是 o (n),特別是長(zhǎng)字符串更消耗性能。對(duì)于更復(fù)雜的數(shù)據(jù)結(jié)構(gòu),比如 hash、list 等,相等比較復(fù)雜度需要 o (n ^ 2)。對(duì)于單線程的 reids 來說,這顯然不合理。其中只保留 10000 個(gè)對(duì)象共享也是防止對(duì)象池浪費(fèi)。

3、字符串優(yōu)化

Redis自身實(shí)現(xiàn)的字符串結(jié)構(gòu)有如下特點(diǎn):

O(1)時(shí)間復(fù)雜度獲?。鹤址L(zhǎng)度,已用長(zhǎng)度,未用長(zhǎng)度。
可用于保存字節(jié)數(shù)組,支持安全的二進(jìn)制數(shù)據(jù)存儲(chǔ)。
內(nèi)部實(shí)現(xiàn)空間預(yù)分配機(jī)制,降低內(nèi)存再分配次數(shù)。
惰性刪除機(jī)制,字符串縮減后的空間不釋放,作為預(yù)分配空間保留。
在高并發(fā)寫入場(chǎng)景中,條件允許的情況下建議字符串長(zhǎng)度控制在39字節(jié)以內(nèi),減少創(chuàng)建redisObject內(nèi)存分配次數(shù)從而提高性能。

4、控制key的數(shù)量

當(dāng)使用Redis存儲(chǔ)大量數(shù)據(jù)時(shí),通常會(huì)存在大量鍵,過多的鍵同樣會(huì)消耗大量?jī)?nèi)存。Redis本質(zhì)是一個(gè)數(shù)據(jù)結(jié)構(gòu)服務(wù)器,它為我們提供多種數(shù)據(jù)結(jié)構(gòu),如hash,list,set,zset 等結(jié)構(gòu)。使用Redis時(shí)不要進(jìn)入一個(gè)誤區(qū),大量使用get/set這樣的API,把Redis當(dāng)成Memcached使用。對(duì)于存儲(chǔ)相同的數(shù)據(jù)內(nèi)容利用Redis的數(shù)據(jù)結(jié)構(gòu)降低外層鍵的數(shù)量,也可以節(jié)省大量?jī)?nèi)存。如下圖所示,通過在客戶端預(yù)估鍵規(guī)模,把大量鍵分組映射到多個(gè)hash結(jié)構(gòu)中降低鍵的數(shù)量。

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容