一、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.
Redis與MySQL/Oracle的區別:
(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過期時間
為什么需要設置過期時間?
涉及的業務場景 有數據更新要求(每秒/每天,根據業務的不同,更新頻率也不同)
行情數據,則每秒需要更新; 賬戶資產等數據 ,則滿足每天更新即可;
測試案例分析:
1. 內存占用過大問題【問題描述:面對后台一張"表"400w的資金賬戶數據量(Hadoop HDFS分布式系統存儲映射后的其中一張表),中台接口通過impala查詢(類似Oracle查詢語法)將得到的結果以bitmap的形式存放至Redis,供其它中台接口調用,最終將數據在前端展示。】
經過計算1byte=8bit, 每個客戶進行一次查詢存儲的key占用的內存400w/8/1024/1024=0.47M,粗略估計2000客戶進行查詢,存儲key占用的內存=2000*0.47(將近1G),如果查詢頻繁,則必然會出現內存溢出的風險。
優化方法:針對客戶的操作頻率,一般不會不停地進行數據查詢操作,所以可以將客戶查詢存儲的key設置過期時間,這樣可以減小內存壓力。
五、Redis 架構模式
1.單機版
優點:簡單;缺點:內存容量有限;處理能力有限;無法高可用
2.集群版
- 無中心架構(不存在哪個節點影響性能瓶頸),少了 proxy 層。
- 數據按照 slot 存儲分布在多個節點,節點間數據共享,可動態調整數據分布。
- 可擴展性,可線性擴展到 1000 個節點,節點可動態添加或刪除。
- 高可用性,部分節點不可用時,集群仍可用。通過增加 Slave 做備份數據副本
- 實現故障自動 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