Redis講解以及測試要點

1、redis 簡介

redis適合放一些頻繁使用,比較熱的數據,由於是放在內存中,讀寫速度都很是快,通常會應用在下面一些場景,排行榜、計數器、消息隊列推送、好友關注、粉絲。前端

首先要知道mysql存儲在磁盤裏,redis存儲在內存裏,redis既能夠用來作持久存儲,也能夠作緩存,而目前大多數公司的存儲都是mysql + redis,mysql做爲主存儲,redis做爲輔助存儲被用做緩存,加快訪問讀取的速度,提升性能。python

官方定義:mysql

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. redis

Redis與MySQL/Oracle的區別:sql

(1)存儲介質:Redis存儲在內存,可是能夠將數據持久化到硬盤。MySQL/Oracle將數據持久化的存儲到硬盤;數據庫

(2)數據庫類型:Redis屬於非關係型數據庫;MySQL/Oracle關係型數據庫緩存

(3)存取效率:Redis直接在內存中存取數據效率高;MySQL/Oracle每次請求訪問數據庫時,都存在着I/O操做,若是反覆頻繁的訪問數據庫。第一:會在反覆連接數據庫上花費大量時間,從而致使運行效率過慢;第二:反覆的訪問數據庫也會致使數據庫的負載太高。服務器

2、數據類型與經常使用操做

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 -- 設置過時時間

 

3、數據持久化

爲何數據持久化?

因爲redis的強大性能很大程度上是由於全部數據都是存儲在內存中,然而當出現服務器宕機、redis重啓等特殊場景,全部存儲在內存中的數據將會丟失,這是沒法容忍的事情,因此必須將內存數據持久化。例如:將redis做爲數據庫使用的;將redis做爲緩存服務器使用等場景。

持久化存在的方式?

目前持久化存在兩種方式:RDB方式和AOF方式。

RDB方式

RDB持久化是把當前進程數據生成快照保存到硬盤的過程, 觸發RDB持久化過程分爲手動觸發和自動觸發。通常存在如下狀況會對數據進行快照

根據配置規則進行自動快照;
用戶執行SAVE, BGSAVE命令;
執行FLUSHALL命令;
執行復制(replication)時。

優缺點:恢復數據較AOF更快;

RDB方式數據沒辦法作到實時持久化/秒級持久化;存在老版本Redis服務沒法兼容新版RDB格式的問題;非實時性。

AOF方式

以獨立日誌的方式記錄每次寫命令(寫入的內容直接是文本協議格式 ,重啓時再從新執行AOF文件中的命令達到恢復數據的目的。

AOF的工做流程操做: 命令寫入(append) 、 文件同步(sync) 、 文件重寫(rewrite) 、 重啓加載(load)

優勢:實時性較好

 

4、redis過時時間

爲何須要設置過時時間?

涉及的業務場景 有數據更新要求(每秒/天天,根據業務的不一樣,更新頻率也不一樣)

行情數據,則每秒須要更新; 帳戶資產等數據 ,則知足天天更新便可;

測試案例分析: 

1. 內存佔用過大問題【問題描述:面對後臺一張"表"400w的資金帳戶數據量(Hadoop HDFS分佈式系統存儲映射後其中一張表),中臺接口經過impala查詢(相似Oracle查詢語法)將獲得的結果以bitmap的形式存放至Redis,供其它中臺接口調用,最終將數據在前端展現。】

通過計算1byte=8bit, 每一個客戶進行一次查詢存儲的key佔用的內存400w/8/1024/1024=0.47M,粗略估計2000客戶進行查詢,存儲key佔用的內存=2000*0.47(將近1G),若是查詢頻繁,則必然會出現內存溢出的風險。

優化方法:針對客戶的操做頻率,通常不會不停地進行數據查詢操做,因此能夠將客戶查詢存儲的key設置過時時間,這樣能夠減少內存壓力。

 

5、Redis 架構模式

1.單機版

優勢:簡單;缺點:內存容量有限;處理能力有限;沒法高可用

2.集羣版

優勢:
主從複製:Redis 的複製(replication)功能容許用戶根據一個 Redis 服務器來建立任意多個該服務器的複製品,其中被複制的服務器爲主服務器(master),而經過複製建立出來的服務器複製品則爲從服務器(slave)。 只要主從服務器之間的網絡鏈接正常,主從服務器二者會具備相同的數據,主服務器就會一直將發生在本身身上的數據更新同步 給從服務器,從而一直保證主從服務器的數據相同。
高可用
  1. 無中心架構(不存在哪一個節點影響性能瓶頸),少了 proxy 層。
  2. 數據按照 slot 存儲分佈在多個節點,節點間數據共享,可動態調整數據分佈。
  3. 可擴展性,可線性擴展到 1000 個節點,節點可動態添加或刪除。
  4. 高可用性,部分節點不可用時,集羣仍可用。經過增長 Slave 作備份數據副本
  5. 實現故障自動 failover,節點之間經過 gossip 協議交換狀態信息,用投票機制完成 Slave到 Master的角色提高。
 
思惟導圖:

附件:redis簡易操做的python腳本  連接:https://pan.baidu.com/s/13KTadH68-GRHuHH3ZaPSXw%20%20提取碼:klw8

redis思惟導圖:

連接:https://pan.baidu.com/s/1WPZuTYuxLhfpyDz7OxWE-g 提取碼:pp2p

相關文章
相關標籤/搜索