Redis資料型別與常用操作詳解
一、redis 簡介
redis適合放一些頻繁使用,比較熱的資料,因為是放在記憶體中,讀寫速度都非常快,一般會應用在下面一些場景,排行榜、計數器、訊息佇列推送、好友關注、粉絲。
首先要知道mysql儲存在磁盤裡,redis儲存在記憶體裡,redis既可以用來做持久儲存,也可以做快取,而目前大多數公司的儲存都是mysql + redis,mysql作為主儲存,redis作為輔助儲存被用作快取,加快訪問讀取的速度,提高效能。
官方定義:
Redis is an open source (BSD licensed), in-memory data structure store, used as a database
(1)儲存介質:Redis儲存在記憶體,但是可以將資料持久化到硬碟。MySQL/Oracle將資料持久化的儲存到硬碟;
(2)資料庫型別:Redis屬於非關係型資料庫;MySQL/Oracle關係型資料庫
(3)存取效率:Redis直接在記憶體中存取資料效率高;MySQL/Oracle每次請求訪問資料庫時,都存在著I/O操作,如果反覆頻繁的訪問資料庫。第一:會在反覆連結資料庫上花費大量時間,從而導致執行效率過慢;第二:反覆的訪問資料庫也會導致資料庫的負載過高。
二、資料型別與常用操作
Redis支援五種資料型別:字串(String), 雜湊(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)
字串(String): 增刪改查
set key value
del key
set key newvalue
get key
mset key1 value1 key2 value2 --批量增加
雜湊(Hash): key {filed1: value, filed2:vaule.....,fieldN:value}
hset key field_1 value1 -- 增 hmset key field_1 value1 filed_2 value2 --批量增 hdel key filed-- 刪 hset key field newValue -- 改 hget key field --查某一field值 hvals filed -- 查key對應的field-values
hlen key --計算field個數
hkeys --獲取所有field
列表(list)
rpush key value [value ...] --右插 lpush key value [value ...] -- 左插 linsert key BEFORE|AFTER pivot value lrange key start stop lindex key index llen key lpop key -- 左彈 rpop key -- 右彈 lset key index value --修改下標index的元素值
集合(sets) (集合內不允許相同的元素)
-- 集合內元素操作
sadd key element [element ...] --增
srem key element [element ...] --刪
scard key --計算元素個數
sismember key element --判斷元素是否在集合中
spop key
smembers key --獲取所有元素
-- 集合間元素操作
sinter key [key ...] --交集
sunion key [key ...] -- 並集
sdiff key [key ...] --差集
-- 將結果儲存
sinterstore destination key [key ...]
suionstore destination key [key ...]
sdiffstore destination key [key ...]
(有序集合) 參考sets
常用操作
ttl -1 鍵沒設定過期時間/永久有效 -2 鍵不存在 >0 鍵剩餘的過期時間 type --檢視鍵的型別 flushdb/flushall --刪除資料 info memory --檢視記憶體資訊
select db --選擇庫
Expire -- 設定過期時間
三、資料持久化
為什麼資料持久化?
由於redis的強大效能很大程度上是因為所有資料都是儲存在記憶體中,然而當出現伺服器宕機、redis重啟等特殊場景,所有儲存在記憶體中的資料將會丟失,這是無法容忍的事情,所以必須將記憶體資料持久化。例如:將redis作為資料庫使用的;將redis作為快取伺服器使用等場景。
持久化存在的方式?
目前持久化存在兩種方式:RDB方式和AOF方式。
RDB方式
RDB持久化是把當前程序資料生成快照儲存到硬碟的過程, 觸發RDB持久化過程分為手動觸發和自動觸發。一般存在以下情況會對資料進行快照
根據配置規則進行自動快照;
使用者執行SAVE, BGSAVE命令;
執行FLUSHALL命令;
執行復制(replication)時。
優缺點:恢復資料較AOF更快;
RDB方式資料沒辦法做到實時持久化/秒級持久化;存在老版本Redis服務無法相容新版RDB格式的問題;非實時性。
AOF方式
以獨立日誌的方式記錄每次寫命令(寫入的內容直接是文字協議格式 ),重啟時再重新執行AOF檔案中的命令達到恢復資料的目的。
AOF的工作流程操作: 命令寫入(append) 、 檔案同步(sync) 、 檔案重寫(rewrite) 、 重啟載入(load)
優點:實時性較好
四、redis過期時間
為什麼需要設定過期時間?
涉及的業務場景 有資料更新要求(每秒/每天,根據業務的不同,更新頻率也不同)
行情資料,則每秒需要更新; 賬戶資產等資料 ,則滿足每天更新即可;
測試案例分析:
經過計算1byte=8bit, 每個客戶進行一次查詢儲存的key佔用的記憶體400w/8/1024/1024=0.47M,粗略估計2000客戶進行查詢,儲存key佔用的記憶體=2000*0.47(將近1G),如果查詢頻繁,則必然會出現記憶體溢位的風險。
優化方法:針對客戶的操作頻率,一般不會不停地進行資料查詢操作,所以可以將客戶查詢儲存的key設定過期時間,這樣可以減小記憶體壓力。
五、Redis 架構模式
1.單機版
優點:簡單;缺點:記憶體容量有限;處理能力有限;無法高可用
2.叢集版
優點: 主從複製:Redis 的複製(replication)功能允許使用者根據一個 Redis 伺服器來建立任意多個該伺服器的複製品,其中被複制的伺服器為主伺服器(master),而通過複製創建出來的伺服器複製品則為從伺服器(slave)。 只要主從伺服器之間的網路連線正常,主從伺服器兩者會具有相同的資料,主伺服器就會一直將發生在自己身上的資料更新同步 給從伺服器,從而一直保證主從伺服器的資料相同。 高可用- 無中心架構(不存在哪個節點影響效能瓶頸),少了 proxy 層。
- 資料按照 slot 儲存分佈在多個節點,節點間資料共享,可動態調整資料分佈。
- 可擴充套件性,可線性擴充套件到 1000 個節點,節點可動態新增或刪除。
- 高可用性,部分節點不可用時,叢集仍可用。通過增加 Slave 做備份資料副本
- 實現故障自動 failover,節點之間通過 gossip 協議交換狀態資訊,用投票機制完成 Slave到 Master的角色提升。
------------------------------------------分割線------------------------------------------
具體下載目錄在 /2018年資料/12月/19日/Redis資料型別與常用操作詳解/
------------------------------------------分割線------------------------------------------