redis緩存在什么情況下使用 redis屬于哪一層?
redis屬于哪一層?Redis底層結(jié)構(gòu)redis 存儲(chǔ)結(jié)構(gòu)redis的存儲(chǔ)結(jié)構(gòu)從外層往內(nèi)層依次是redisDb、dict、dictht、dictEntry。redis的Db默認(rèn)情況下有16個(gè),每個(gè)r
redis屬于哪一層?
Redis底層結(jié)構(gòu)
redis 存儲(chǔ)結(jié)構(gòu)
redis的存儲(chǔ)結(jié)構(gòu)從外層往內(nèi)層依次是redisDb、dict、dictht、dictEntry。
redis的Db默認(rèn)情況下有16個(gè),每個(gè)redisDb內(nèi)部包含一個(gè)dict的數(shù)據(jù)結(jié)構(gòu)。
redis的dict內(nèi)部包含dictht的數(shù)組,數(shù)組個(gè)數(shù)為2,主要用于hash擴(kuò)容使用。
dictht內(nèi)部包含dictEntry的數(shù)組,可以理解就是hash的桶,然后如果通過(guò)掛鏈法解決
redis做消息隊(duì)列還緩存消息嗎?
一般不會(huì),如果做消息隊(duì)列,一般使用list,消息被消費(fèi)方消費(fèi)后,即lpop掉后,該消息就在內(nèi)存中刪除了。如果是緩存的話,一般不主動(dòng)刪除或過(guò)期,數(shù)據(jù)會(huì)一直存在。
為什么要用redis,redis有哪些優(yōu)缺點(diǎn)?redis如何實(shí)現(xiàn)擴(kuò)容?
Redis 與其他 key - value 緩存產(chǎn)品有以下三個(gè)特點(diǎn):Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用。Redis不僅僅支持簡(jiǎn)單的key-value類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)。Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。Redis 優(yōu)勢(shì)性能極高 C Redis能讀的速度是110000次/s,寫的速度是81000次/s 。豐富的數(shù)據(jù)類型 C Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。原子 C Redis的所有操作都是原子性的,同時(shí)Redis還支持對(duì)幾個(gè)操作全并后的原子性執(zhí)行。豐富的特性 C Redis還支持 publish/subscribe, 通知, key 過(guò)期等等特性。
redis怎么緩存用戶列表,做到可以分頁(yè)展示?
普通分頁(yè)
一般分頁(yè)做緩存都是直接查找出來(lái),按頁(yè)放到緩存里,但是這種緩存有很多缺點(diǎn)。
如緩存不能及時(shí)更新,一旦數(shù)據(jù)有變化,所有的之前的分頁(yè)緩存都失效了。
比如像微博這樣的場(chǎng)景,微博下面現(xiàn)在有一個(gè)頂次數(shù)的排序。這個(gè)用傳統(tǒng)的分頁(yè)很難應(yīng)對(duì)。
一種思路
最近想到了另一種思路。
數(shù)據(jù)以ID為key緩存到Redis里;
把數(shù)據(jù)ID和排序打分存到Redis的skip list,即zset里;
當(dāng)查找數(shù)據(jù)時(shí),先從Redis里的skip list取出對(duì)應(yīng)的分頁(yè)數(shù)據(jù),得到ID列表。
用multi get從redis上一次性把ID列表里的所有數(shù)據(jù)都取出來(lái)。如果有缺少某些ID的數(shù)據(jù),再?gòu)臄?shù)據(jù)庫(kù)里查找,再一塊返回給用戶,并把查出來(lái)的數(shù)據(jù)按ID緩存到Redis里。
在最后一步,可以有一些小技巧:
比如在缺少一些ID數(shù)據(jù)的情況下,先直接返回給用戶,然后前端再用ajax請(qǐng)求缺少的ID的數(shù)據(jù),再動(dòng)態(tài)刷新。
還有一些可能用Lua腳本合并操作的優(yōu)化,不過(guò)考慮到Lua腳本比較慢,可能要仔細(xì)測(cè)試。
如果是利用Lua腳本的話,可以在一個(gè)請(qǐng)求里完成下面的操作:
查找某頁(yè)的所有文章,返回已緩存的文章的ID及內(nèi)容,還有不在緩存里的文章的ID列表。
其它的一些東東:
Lua是支持LRU模式的,即像Memcached一樣工作。但是貌似沒(méi)有見(jiàn)到有人這樣用,很是奇怪。
可能是用redis早就準(zhǔn)備好把redis做存儲(chǔ)了,也不擔(dān)心內(nèi)存的容量問(wèn)題。