2020-08-23

非關(guān)系型數(shù)據(jù)庫 Redis 的知識點(diǎn)總結(jié)

一、Redis 概述

Redis 是一種基于 內(nèi)存 的分布式非關(guān)系型數(shù)據(jù)庫,使用 KV鍵值對 來保存數(shù)據(jù);

純內(nèi)存操作以及單線程的模型,讓 Redis 具有優(yōu)越的性能。

【 官方給定的讀取速度為:110000 次/s ( GET ) 81000 次/s ( SET )

二、安裝與配置

  1. 啟動服務(wù)器:redis-server.exe redis.windows.conf
  2. 啟動客戶端:redis-cli.exe
  3. 桌面管理工具:RedisDesktopManager
  4. 設(shè)置密碼:在 redis.windows.conf 的配置文件中設(shè)置 requirepass 密碼

三、Redis 的五種數(shù)據(jù)類型

(1) String(字符串)

常規(guī)的 set/get 操作,value可以是String也可以是數(shù)字,一般做一些復(fù)雜的計(jì)數(shù)功能的緩存

set 鍵 值
get 鍵

(2) Hash(哈希)

這里value存放的是 結(jié)構(gòu)化 的對象,每個(gè)hash可以存儲4294967295個(gè)鍵值對(2^31-1)

hset 鍵 字段 值
hmset 鍵 字段1 值1 字段2 值2 字段n 值n
hget 鍵 字段
hmget 鍵 字段1 值1 字段2 值2 字段n 值n
hgetall 鍵

(3) List(列表)

可以利用 lrange 命令,做基于redis 的分頁功能;每個(gè)列表可以存儲4294967295個(gè)值(2^31-1)

lpush 鍵 值1 值2 值3 值n
lrange 鍵 開始下標(biāo) 結(jié)束下標(biāo)

(4) Set(集合)

集合中的值不允許重復(fù),因此可以用來實(shí)現(xiàn)全局去重的功能

sadd 鍵 值1 值2 值3 值n
smembers 鍵

(5)Zset(Score Set 有序集合)

Zet集合中的元素能夠按score進(jìn)行排列,因此可用來實(shí)現(xiàn)排行榜應(yīng)用,取 TOP N 的操作

zadd 鍵 分?jǐn)?shù)1 值1 分?jǐn)?shù)2 值2 分?jǐn)?shù)n 值n
zrange 鍵 開始下標(biāo) 結(jié)束下標(biāo)
zanngebyscore 鍵 開始分值 結(jié)束分值

四、Redis的常用命令

  1. 【 獲取所有鍵 】: **keys ***

  2. 【 獲取鍵總數(shù) 】: dbsize

  3. 【 查詢鍵是否存在 】: exists key 鍵

  4. 【 刪除鍵 】: del key 鍵

  5. 【 查詢鍵類型 】: type 鍵

  6. 【 查詢key的生命周期(秒)】 ( -1:永不過期 )

    ① 秒語法: ttl key

    ② 亳秒語法: pttl key

  7. 【 設(shè)置過期時(shí)間 】

    ① 秒語法: expire key seconds

    ② 亳秒語法: pexpire key milliseconds

  8. 【 設(shè)置永不過期 】: persist 鍵

  9. 【 更改鍵名稱 】: rename 鍵 新鍵

五、常見問題

1. Redis為什么這么快?

Redis采用內(nèi)存作為存儲介質(zhì),純內(nèi)存操作以及單線程的模型,避免了頻繁的上下文切換,減少了額外的性能開銷;Redis使用C/C++開發(fā),數(shù)據(jù)庫操作更貼近底層,上述特點(diǎn)使得Redis具有優(yōu)越的性能。

2. 緩存穿透

緩存穿透是指緩存和數(shù)據(jù)庫中都沒有的數(shù)據(jù),而用戶不斷發(fā)起請求,如發(fā)起為id為"-1 "的數(shù)據(jù)或id為特別大不存在的數(shù)據(jù)。這時(shí)的用戶很可能是攻擊者,攻擊會導(dǎo)致數(shù)據(jù)庫壓力過大。

【解決方案】

? ① 接口層增加校驗(yàn),如用戶鑒權(quán)校驗(yàn),id做基礎(chǔ)校驗(yàn),id<=0的直接攔截;

? ② 從緩存取不到的數(shù)據(jù),在數(shù)據(jù)庫中也沒有取到,這時(shí)也可以將key-value對寫為key-null, 緩存有效時(shí)間可以設(shè)置短點(diǎn),如30秒(設(shè)置太長會導(dǎo)致正常情況也沒法使用)。這樣可以防止攻擊用戶反復(fù)用同一個(gè)id暴力攻擊。

3. 緩存擊穿

緩存擊穿是指緩存中沒有但數(shù)據(jù)庫中有的數(shù)據(jù)(一般是緩存時(shí)間到期),這時(shí)由于并發(fā)用戶特別多,同時(shí)讀緩存沒讀到數(shù)據(jù),又同時(shí)去數(shù)據(jù)庫去取數(shù)據(jù),引起數(shù)據(jù)庫壓力瞬間增大,造成過大壓力。

【解決方案】

? ① 設(shè)置熱點(diǎn)數(shù)據(jù)永遠(yuǎn)不過期。

? ② 定時(shí)任務(wù)更新緩存數(shù)據(jù)

? ③ 加互斥鎖

4. 緩存雪崩

緩存雪崩是指緩存中數(shù)據(jù)大批量到過期時(shí)間,而查詢數(shù)據(jù)量巨大,引起數(shù)據(jù)庫壓力過大甚至down機(jī)。和緩存擊穿不同的是,緩存擊穿指并發(fā)查同一條數(shù)據(jù),緩存雪崩是不同數(shù)據(jù)都過期了,很多數(shù)據(jù)都查不到從而查數(shù)據(jù)庫。

【解決方案】

? ① 緩存數(shù)據(jù)的過期時(shí)間設(shè)置隨機(jī),防止同一時(shí)間大量數(shù)據(jù)過期現(xiàn)象發(fā)生。

? ② 如果緩存數(shù)據(jù)庫是分布式部署,將熱點(diǎn)數(shù)據(jù)均勻分布在不同的緩存數(shù)據(jù)庫中。

? ③ 設(shè)置熱點(diǎn)數(shù)據(jù)永遠(yuǎn)不過期。

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

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

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