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操做,若是反覆頻繁的訪問數據庫。第一:會在反覆連接數據庫上花費大量時間,從而致使運行效率過慢;第二:反覆的訪問數據庫也會致使數據庫的負載太高。服務器
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)
優勢:實時性較好
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設置過時時間,這樣能夠減少內存壓力。
1.單機版
優勢:簡單;缺點:內存容量有限;處理能力有限;沒法高可用
2.集羣版
附件:redis簡易操做的python腳本 連接:https://pan.baidu.com/s/13KTadH68-GRHuHH3ZaPSXw%20%20提取碼:klw8
redis思惟導圖:
連接:https://pan.baidu.com/s/1WPZuTYuxLhfpyDz7OxWE-g 提取碼:pp2p