1. 程式人生 > >Redis資料型別與常用操作詳解

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

, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster. 

(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)。 只要主從伺服器之間的網路連線正常,主從伺服器兩者會具有相同的資料,主伺服器就會一直將發生在自己身上的資料更新同步 給從伺服器,從而一直保證主從伺服器的資料相同。 高可用
  1. 無中心架構(不存在哪個節點影響效能瓶頸),少了 proxy 層。
  2. 資料按照 slot 儲存分佈在多個節點,節點間資料共享,可動態調整資料分佈。
  3. 可擴充套件性,可線性擴充套件到 1000 個節點,節點可動態新增或刪除。
  4. 高可用性,部分節點不可用時,叢集仍可用。通過增加 Slave 做備份資料副本
  5. 實現故障自動 failover,節點之間通過 gossip 協議交換狀態資訊,用投票機制完成 Slave到 Master的角色提升。
思維導圖:

------------------------------------------分割線------------------------------------------

具體下載目錄在 /2018年資料/12月/19日/Redis資料型別與常用操作詳解/

------------------------------------------分割線------------------------------------------