1. 使用redis有哪些好處? (1) 速度快,因為數據存在記憶體中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1) (2) 支持豐富數據類型,支持string,list,set,sorted set,hash (3) 支持事務,操作都是原子性,所謂的原子性就是對數 ...
1. 使用redis有哪些好處?
(1) 速度快,因為數據存在記憶體中,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1)
(2) 支持豐富數據類型,支持string,list,set,sorted set,hash
(3) 支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行
(4) 豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除
2、Redis支持的數據類型
String字元串:
格式: set key value
string類型是二進位安全的。意思是redis的string可以包含任何數據。比如jpg圖片或者序列化的對象 。
string類型是Redis最基本的數據類型,一個鍵最大能存儲512MB。
Hash(哈希)
格式: hmset name key1 value1 key2 value2
Redis hash 是一個鍵值(key=>value)對集合。
Redis hash是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
List(列表)
Redis 列表是簡單的字元串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)
格式: lpush name value
在 key 對應 list 的頭部添加字元串元素
格式: rpush name value
在 key 對應 list 的尾部添加字元串元素
格式: lrem name index
key 對應 list 中刪除 count 個和 value 相同的元素
格式: llen name
返回 key 對應 list 的長度
Set(集合)
格式: sadd name value
Redis的Set是string類型的無序集合。
集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是O(1)。
zset(sorted set:有序集合)
格式: zadd name score value
Redis zset 和 set 一樣也是string類型元素的集合,且不允許重覆的成員。
不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。
zset的成員是唯一的,但分數(score)卻可以重覆。
3、什麼是Redis持久化?Redis有哪幾種持久化方式?優缺點是什麼?
持久化就是把記憶體的數據寫到磁碟中去,防止服務宕機了記憶體數據丟失。
Redis 提供了兩種持久化方式:RDB(預設) 和AOF
RDB:
rdb是Redis DataBase縮寫
功能核心函數rdbSave(生成RDB文件)和rdbLoad(從文件載入記憶體)兩個函數
AOF:
Aof是Append-only file縮寫,
每當執行伺服器(定時)任務或者函數時flushAppendOnlyFile 函數都會被調用, 這個函數執行以下兩個工作
aof寫入保存:
WRITE:根據條件,將 aof_buf 中的緩存寫入到 AOF 文件
SAVE:根據條件,調用 fsync 或 fdatasync 函數,將 AOF 文件保存到磁碟中。
存儲結構:
內容是redis通訊協議(RESP )格式的命令文本存儲。
(RESP 是redis客戶端和服務端之前使用的一種通訊協議;
RESP 的特點:實現簡單、快速解析、可讀性好)
比較:
1、aof文件比rdb更新頻率高,優先使用aof還原數據。
2、aof比rdb更安全也更大
3、rdb性能比aof好
4、如果兩個都配了優先載入AOF
4、Redis 有哪些架構模式?講講各自的特點
Redis sentinel 是一個分散式系統中監控 redis 主從伺服器,併在主伺服器下線時自動進行故障轉移。其中三個特性:
監控(Monitoring): Sentinel 會不斷地檢查你的主伺服器和從伺服器是否運作正常。
提醒(Notification): 當被監控的某個 Redis 伺服器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程式發送通知。
自動故障遷移(Automatic failover): 當一個主伺服器不能正常工作時, Sentinel 會開始一次自動故障遷移操作。
特點:
1、保證高可用
2、監控各個節點
3、自動故障遷移
缺點:主從模式,切換需要時間丟數據
沒有解決 master 寫的壓力
集群(proxy 型):
Twemproxy 是一個 Twitter 開源的一個 redis 和 memcache 快速/輕量級代理伺服器; Twemproxy 是一個快速的單線程代理程式,支持 Memcached ASCII 協議和 redis 協議。
特點:1、多種 hash 演算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins
2、支持失敗節點自動刪除
3、後端 Sharding 分片邏輯對業務透明,業務方的讀寫方式和操作單個 Redis 一致
缺點:增加了新的 proxy,需要維護其高可用。
failover 邏輯需要自己實現,其本身不能支持故障的自動轉移可擴展性差,進行擴縮容都需要手動干預
集群(直連型):
從redis 3.0之後版本支持redis-cluster集群,Redis-Cluster採用無中心結構,每個節點保存數據和整個集群狀態,每個節點都和其他所有節點連接。
特點:
1、無中心架構(不存在哪個節點影響性能瓶頸),少了 proxy 層。
2、數據按照 slot 存儲分佈在多個節點,節點間數據共用,可動態調整數據分佈。
3、可擴展性,可線性擴展到 1000 個節點,節點可動態添加或刪除。
4、高可用性,部分節點不可用時,集群仍可用。通過增加 Slave 做備份數據副本
5、實現故障自動 failover,節點之間通過 gossip 協議交換狀態信息,用投票機制完成 Slave到 Master 的角色提升。
缺點:
1、資源隔離性較差,容易出現相互影響的情況。
2、數據通過非同步複製,不保證數據的強一致性
5、Redis常用命令?
Keys pattern
*表示區配所有,
以bit開頭的,
查看Exists key是否存在。
Set
設置 key 對應的值為 string 類型的 value。
setnx
設置 key 對應的值為 string 類型的 value。如果 key 已經存在,返回 0,nx 是 not exist 的意思。
刪除某個key
第一次返回1 刪除了 第二次返回0
Expire 設置過期時間(單位秒)
TTL查看剩下多少時間,
返回負數則key失效,key不存在了。
Setex
設置 key 對應的值為 string 類型的 value,並指定此鍵值對應的有效期。
Mset
一次設置多個 key 的值,成功返回 ok 表示所有的值都設置了,失敗返回 0 表示沒有任何值被設置。
Getset
設置 key 的值,並返回 key 的舊值。
Mget
一次獲取多個 key 的值,如果對應 key 不存在,則對應返回 nil。
Incr
對 key 的值做加加操作,並返回新的值。註意 incr 一個不是 int 的 value 會返回錯誤,incr 一個不存在的 key,則設置 key 為 1
incrby
同 incr 類似,加指定值 ,key 不存在時候會設置 key,並認為原來的 value 是 0
Decr
對 key 的值做的是減減操作,decr 一個不存在 key,則設置 key 為-1
Decrby
同 decr,減指定值。
Append
給指定 key 的字元串值追加 value,返回新字元串值的長度。
Strlen
取指定 key 的 value 值的長度。
persist xxx(取消過期時間)
選擇資料庫(0-15庫)
Select 0 //選擇資料庫
move age 1//把age 移動到1庫
Randomkey隨機返回一個key
Rename重命名
Type 返回數據類型
6、使用過Redis分散式鎖麽,它是怎麼實現的?
先拿setnx來爭搶鎖,搶到之後,再用expire給鎖加一個過期時間防止鎖忘記了釋放。
如果在setnx之後執行expire之前進程意外crash或者要重啟維護了,那會怎麼樣?
set指令有非常複雜的參數,這個應該是可以同時把setnx和expire合成一條指令來用的!
7、使用過Redis做非同步隊列麽,你是怎麼用的?有什麼缺點?
一般使用list結構作為隊列,rpush生產消息,lpop消費消息。當lpop沒有消息的時候,要適當sleep一會再重試。
缺點:
在消費者下線的情況下,生產的消息會丟失,得使用專業的消息隊列如rabbitmq等。
8、什麼是緩存穿透?如何避免?什麼是緩存雪崩?何如避免?
緩存穿透
一般的緩存系統,都是按照key去緩存查詢,如果不存在對應的value,就應該去後端系統查找(比如DB)。一些惡意的請求會故意查詢不存在的key,請求量很大,就會對後端系統造成很大的壓力。這就叫做緩存穿透。
如何避免?
1:對查詢結果為空的情況也進行緩存,緩存時間設置短一點,或者該key對應的數據insert了之後清理緩存。
2:對一定不存在的key進行過濾。可以把所有的可能存在的key放到一個大的Bitmap中,查詢時通過該bitmap過濾。
緩存雪崩
當緩存伺服器重啟或者大量緩存集中在某一個時間段失效,這樣在失效的時候,會給後端系統帶來很大壓力。導致系統崩潰。
如何避免?
1:在緩存失效後,通過加鎖或者隊列來控制讀資料庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。
2:做二級緩存,A1為原始緩存,A2為拷貝緩存,A1失效時,可以訪問A2,A1緩存失效時間設置為短期,A2設置為長期
3:不同的key,設置不同的過期時間,讓緩存失效的時間點儘量均勻。
上海尚學堂Java大數據培訓課程免費試學開啟,redis學習資料視頻免費領取哦~~~