非關(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 ) 】
二、安裝與配置
-
啟動服務(wù)器:redis-server.exe redis.windows.conf
-
啟動客戶端:redis-cli.exe
-
桌面管理工具:RedisDesktopManager
-
設(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的常用命令
【 獲取所有鍵 】: **keys ***
【 獲取鍵總數(shù) 】: dbsize
【 查詢鍵是否存在 】: exists key 鍵
【 刪除鍵 】: del key 鍵
【 查詢鍵類型 】: type 鍵
-
【 查詢key的生命周期(秒)】 ( -1:永不過期 )
① 秒語法: ttl key
② 亳秒語法: pttl key
-
【 設(shè)置過期時(shí)間 】
① 秒語法: expire key seconds
② 亳秒語法: pexpire key milliseconds
【 設(shè)置永不過期 】: persist 鍵
【 更改鍵名稱 】: 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)不過期。