Redis是一個高效的NoSQL數據庫,採用Key-Value保存數據,通常做爲高速分佈式緩存使用。html
Redis做爲高速緩存,要能經過Key快速的查到須要的數據,通常做爲數據庫的緩存,因此Redis的Key設計可參考數據庫表。
以user表爲例,數據庫設計以下:數據庫
user_id | user_name | password | |
---|---|---|---|
1 | zhangsan | secret1 | zhangsan@163.com |
2 | lisi | secret2 | lisi@163.com |
Key是設計建議以下:緩存
如今要經過user_id
(1)快速查詢用戶user_name
(zhangsan)
則緩存數據設計以下:dom
set user:user_id:1:username zhangsan
若是user_name
字段是索引字段,且須要頻繁經過user_name查詢用戶信息,則能夠把查詢關鍵字段。
則緩存數據設計以下:數據庫設計
set user:user_name:zhangsan:user_id 1
而後在經過user_id查詢其餘用戶信息。
固然,Key的設計仍是須要根據業務須要靈活處理,這裏只是給出一個通常思路。好比以關鍵字+日期爲Key進行日期相關的統計。分佈式
Redis基礎的數據類型包括String、List、Hash(Map)、Set、SortedSet 5種。性能
String
String是最基本的數據類型,它不但能夠保存字符串,也用來保存int,long,float等單值數據,也能夠做爲計數器。不少項目也會把對象經過JSON序列化後保存爲String,使用的時候在反序列化回來。若是使用這種方式,須要經過代碼註釋或文檔對字段進行詳細的說明,避免往後本身或他人維護時「相見不相識」。
場景使用場景包括:.net
SET if Not eXists
)List
List是有序列表,使用方式和Java中的List相似,支持列表頭尾插入(LPUSH,RPUSH),頭尾彈出(LPOP,RPOP),阻塞式彈出(BLPOP,BRPOP),按範圍獲取(LRANGE)等豐富的操做。
常見使用場景包括:設計
Hash
Hash類型相似Java中的HashMap,保存Key-Value鍵值對。能夠直接把一個數據庫表的行映射到緩存,也能夠保存無嵌套類型的POJO。code
Set
Set是無序不重複的集合,使用方式和Java中的Set相似,能夠作高效的Set間的交、並、差集等操做(SINTER,SUNION,SDIFF)。
Sorted Set
有序集合,相似Java中的LinkedHashSet,但不是根據插入順利來排序的,而是Set的每一個元素能夠關聯一個double類型的分值(score)用於排序。基於這個特性,Sorted Set的典型場景包括:
Bitmap
經過基本類型中String的BIT操做方法,實現位操做,包括SETBIT,GETBIT,BITCOUNT,BITOP等,可用於海量數據統計或Bloom過濾器等。
HyperLogLog
這個待研究!!!
pub/sub:
Pipeline:
Lua:
緩存數據淘汰策略
noeviction(內存滿後不主動回收,沒法寫入新數據)
allkeys-lru(最近最少使用的Key)
allkeys-random(隨機回收)
volatile-lru(過時集合中最近最少使用的Key)
volatile-random(過時隨機回收)
volatile-ttl(過時最短存活)
Redis Pipleline是啥??
Redis部署模式
主備:哨兵、主備、主備鏈
集羣
Redis vs Memcached
性能問題
緩存穿透
緩存擊穿
緩存雪崩
數據持久化機制
RDB、AOF
RDB:Fork子進程,新數據COW模式
AOF:同步策略:定時,數據量
集羣同步機制
經過RDB完成基準數據同步,再經過AOF進行增量數據同步
緩存和數據庫數據一致性
Keys和Scan方法
LRU vs LFU
https://www.jianshu.com/p/02b...
https://blog.csdn.net/a319204...
https://www.cnblogs.com/sddai...