1膘魄,Redis支持的數(shù)據(jù)類型?
String(字符串類型)
String數(shù)據(jù)結(jié)構(gòu)是簡(jiǎn)單的key-value類型创葡,value其實(shí)不僅可以是String,也可以是數(shù)字成黄。 常規(guī)key-value緩存應(yīng)用; 常規(guī)計(jì)數(shù):微博數(shù),粉絲數(shù)等荸百。
常用命令:
set,get,incr,decr,mget 等:
set key value 設(shè)置值
get key 獲取值
incr key 加一
decr key 減一
hash(哈希)
Redis hash是一個(gè)string類型的field和value的映射表,hash特別適合用于存儲(chǔ)對(duì)象蓝翰,后續(xù)操作的時(shí)候女嘲,你可以直接僅僅修改這個(gè)對(duì)象中的某個(gè)字段的值。
常用命令:
set,get,decr,incr,mget 等:
hset key field value 設(shè)置值
hget key field 獲取值
hincrby key field num 設(shè)置增數(shù)量
list(列表)
Redis list 的實(shí)現(xiàn)為一個(gè)雙向鏈表爆雹,即可以支持反向查找和遍歷愕鼓,更方便操作,不過(guò)帶來(lái)了部分額外的內(nèi)存開(kāi)銷册倒。
Redis list 的應(yīng)用場(chǎng)景非常多磺送,也是Redis最重要的數(shù)據(jù)結(jié)構(gòu)之一,比如微博的關(guān)注列表崇呵,粉絲列表甲捏,消息列表等功能都可以用Redis的 list 結(jié)構(gòu)來(lái)實(shí)現(xiàn)。
可以通過(guò) lrange 命令芒粹,就是從某個(gè)元素開(kāi)始讀取多少個(gè)元素大溜,可以基于 list 實(shí)現(xiàn)分頁(yè)查詢,這個(gè)很棒的一個(gè)功能钦奋,基于 redis 實(shí)現(xiàn)簡(jiǎn)單的高性能分頁(yè),可以做類似微博那種下拉不斷分頁(yè)的東西(一頁(yè)一頁(yè)的往下走)朦拖,性能高。
常用命令:
lpush,rpush,lpop,rpop,lrange等:
lpush list a b c d (從list左邊添加元素)
rpush list 1 2 3 4 (從list右邊添加元素)
lrange list 0 -1(從0 到 -1 元素查看:也就表示查看所有)
lpop list (從list左邊取捍岳,刪除)睬隶、 rpop list (從list右邊取,刪除)
set(集合)
Redis的Set是string類型的無(wú)序集合银萍。集合是通過(guò)哈希表實(shí)現(xiàn)的恤左,所以添加,刪除滤蝠,查找的復(fù)雜度都是O(1)授嘀。
常用命令:
sadd,spop,smembers,sunion 等:
sadd set1 a b c d d (向set1中添加元素) 元素不重復(fù)
smembers set1(查詢?cè)兀?srem set1 a(刪除元素)
sorted set(zset,有序集合)
和set相比览闰,sorted set增加了一個(gè)權(quán)重參數(shù)score巷折,使得集合中的元素能夠按score進(jìn)行有序排列。
例:在直播系統(tǒng)中锻拘,實(shí)時(shí)排行信息包含直播間在線用戶列表署拟,各種禮物排行榜,彈幕消息(可以理解為按消息維度的消息排行榜)等信息推穷,適合使用 Redis 中的 Sorted Set 結(jié)構(gòu)進(jìn)行存儲(chǔ)馒铃。
常用命令:
zadd,zrange,zrem,zcard等:
zadd zset1 1 a 2 b 3 c (添加元素 zadd key score member痕惋,這里添加元素a:1分娃殖、元素b:2分、元素c:3分 )
zrange zset1 0 -1 (查看zset1的所有元素述寡,默認(rèn)從小到大)
zrange zset1 0 -1 withscores (查看zset1的所有元素,包括分?jǐn)?shù)score)
zrevrange zset1 0 -1 (查看zset1的所有元素叶洞,從大到小)
zincrby zset1 5 a (對(duì)zset1的a元素增加5分)
2禀崖,什么是Redis持久化?Redis有哪幾種持久化方式艺晴??jī)?yōu)缺點(diǎn)是什么
持久化就是把內(nèi)存的數(shù)據(jù)寫到磁盤中去掸屡,防止服務(wù)宕機(jī)了內(nèi)存數(shù)據(jù)丟失。
(Redis 數(shù)據(jù)都放在內(nèi)存中狈究。如果機(jī)器掛掉盏求,內(nèi)存的數(shù)據(jù)就不存在。所以需要做持久化磅废,將內(nèi)存中的數(shù)據(jù)保存在磁盤荆烈,下一次啟動(dòng)的時(shí)候就可以恢復(fù)數(shù)據(jù)到內(nèi)存中。)
Redis 提供了兩種持久化方式:RDB(默認(rèn)) 和AOF 宫峦。
RDB (快照):
Redis可以通過(guò)創(chuàng)建快照來(lái) 獲得存儲(chǔ)在內(nèi)存里面的數(shù)據(jù)在某個(gè)時(shí)間點(diǎn)上的副本倦始。Redis創(chuàng)建快照之后,可以對(duì)快照進(jìn)行備份鞋邑,可以將快照復(fù)制到其他服務(wù)器從而創(chuàng)建具有相同數(shù)據(jù)的服務(wù)器副本(Redis主從結(jié)構(gòu),主要用來(lái)提高Redis性能)逾一,還可以將快照留在原地以便重啟服務(wù)器的時(shí)候使用遵堵。
快照持久化是Redis默認(rèn)采用的持久化方式,在redis.conf配置文件中默認(rèn)有此下配置:
save 900 1 #在900秒(15分鐘)之后陌宿,如果至少有1個(gè)key發(fā)生變化壳坪,Redis就會(huì)自動(dòng)觸發(fā)BGSAVE命令創(chuàng)建快照。
save 300 10 #在300秒(5分鐘)之后爽蝴,如果至少有10個(gè)key發(fā)生變化,Redis就會(huì)自動(dòng)觸發(fā)BGSAVE命令創(chuàng)建快照蝎亚。
save 60 10000 #在60秒(1分鐘)之后,如果至少有10000個(gè)key發(fā)生變化躺彬,Redis就會(huì)自動(dòng)觸發(fā)BGSAVE命令創(chuàng)建快照缤底。
AOF(只追加文件):
與快照持久化相比,AOF持久化的實(shí)時(shí)性更好江解,因此已成為主流的持久化方案徙歼。默認(rèn)情況下Redis沒(méi)有開(kāi)啟AOF(append only file)方式的持久化,可以通過(guò)appendonly參數(shù)開(kāi)啟:appendonly yes
開(kāi)啟AOF持久化后每執(zhí)行一條會(huì)更改Redis中的數(shù)據(jù)的命令桨螺,Redis就會(huì)將該命令寫入硬盤中的AOF文件酿秸。AOF文件的保存位置和RDB文件的位置相同,都是通過(guò)dir參數(shù)設(shè)置的肝箱,默認(rèn)的文件名是appendonly.aof。
在Redis的配置文件中存在三種不同的 AOF 持久化方式呐赡,它們分別是:
appendfsync always #每次有數(shù)據(jù)修改發(fā)生時(shí)都會(huì)寫入AOF文件,這樣會(huì)嚴(yán)重降低Redis的速度
appendfsync everysec #每秒鐘同步一次骏融,顯示地將多個(gè)寫命令同步到硬盤
appendfsync no #讓操作系統(tǒng)決定何時(shí)進(jìn)行同步
為了兼顧數(shù)據(jù)和寫入性能,用戶可以考慮 appendfsync everysec選項(xiàng) 怀泊,讓Redis每秒同步一次AOF文件误趴,Redis性能幾乎沒(méi)受到任何影響。而且這樣即使出現(xiàn)系統(tǒng)崩潰,用戶最多只會(huì)丟失一秒之內(nèi)產(chǎn)生的數(shù)據(jù)纤怒。當(dāng)硬盤忙于執(zhí)行寫入操作的時(shí)候天通,Redis還會(huì)優(yōu)雅的放慢自己的速度以便適應(yīng)硬盤的最大寫入速度。
RDB (快照):快照形式 烘豹,定期將當(dāng)前時(shí)刻的數(shù)據(jù)保存磁盤中诺祸。會(huì)產(chǎn)生一個(gè)dump.rdb文件
特點(diǎn):性能較好,數(shù)據(jù)備份憔鬼。但可能會(huì)存在數(shù)據(jù)丟失胃夏。
AOF(只追加文件) :append only file (所有對(duì)redis的操作命令記錄在aof文件中),恢復(fù)數(shù)據(jù)照雁,重新執(zhí)行一遍即可答恶。
特點(diǎn):每秒保存萍诱,數(shù)據(jù)比較完整卸勺。但耗費(fèi)性能。
【注】如果兩個(gè)都配了優(yōu)先加載AOF碍庵。(同時(shí)開(kāi)啟兩個(gè)持久化方案悟狱,則按照 AOF的持久化放案恢復(fù)數(shù)據(jù)。)
3苹享,Redis 有哪些架構(gòu)模式浴麻?講講各自的特點(diǎn)?
主從模式(redis2.8版本之前的模式)宫纬、哨兵sentinel模式(redis2.8及之后的模式)膏萧、redis cluster模式(redis3.0版本之后)
4,什么是緩存穿透蝌蹂?如何避免曹锨?什么是緩存雪崩?何如避免硼身?
4.1覆享、緩存穿透
一般的緩存系統(tǒng),都是按照key去緩存查詢丑罪,如果不存在對(duì)應(yīng)的value,就應(yīng)該去后端系統(tǒng)查找(比如DB)跪另。一些惡意的請(qǐng)求會(huì)故意查詢不存在的key,請(qǐng)求量很大煤搜,就會(huì)對(duì)后端系統(tǒng)造成很大的壓力。這就叫做緩存穿透嘲驾。
如何避免迹卢?
1:對(duì)查詢結(jié)果為空的情況也進(jìn)行緩存,緩存時(shí)間設(shè)置短一點(diǎn)誊垢,或者該key對(duì)應(yīng)的數(shù)據(jù)insert了之后清理緩存症见。
2:對(duì)一定不存在的key進(jìn)行過(guò)濾〗煞龋可以把所有的可能存在的key放到一個(gè)大的Bitmap中瓷们,查詢時(shí)通過(guò)該bitmap過(guò)濾
3:也可以使用流行的bloom filter布隆過(guò)濾器
4.2谬晕、緩存雪崩
當(dāng)緩存服務(wù)器重啟或者大量緩存集中在某一個(gè)時(shí)間段失效携取,這樣在失效的時(shí)候,會(huì)給后端系統(tǒng)帶來(lái)很大壓力不撑。導(dǎo)致系統(tǒng)崩潰晤斩。
如何避免?
1:在緩存失效后实愚,通過(guò)加鎖或者隊(duì)列來(lái)控制讀數(shù)據(jù)庫(kù)寫緩存的線程數(shù)量。比如對(duì)某個(gè)key只允許一個(gè)線程查詢數(shù)據(jù)和寫緩存击喂,其他線程等待碰辅。
2:做二級(jí)緩存,A1為原始緩存凌彬,A2為拷貝緩存榕吼,A1失效時(shí),可以訪問(wèn)A2原探,A1緩存失效時(shí)間設(shè)置為短期顽素,A2設(shè)置為長(zhǎng)期
3:不同的key,設(shè)置不同的過(guò)期時(shí)間型型,讓緩存失效的時(shí)間點(diǎn)盡量均勻全蝶。