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