Redis基础高级学习笔记
筆記
https://github.com/7117/note/tree/master/Redis
https://blog.csdn.net/m0_46130323/category_9645862.html
https://blog.csdn.net/branwel/article/details/103897256
文章目錄
Redis(Remote Dictionary Server) Redis 運行快速的原因 數據類型 String 單條操作 多條操作 其他命令 Hash 單條操作 多條操作 其他命令 String存儲對象(Json) VS Hash存儲對象 List 添加 獲取 獲取并移除 Set 命令 Sorted_Set 命令 Key的操作 命令 數據庫操作 命令 持久化 RDB(Relational Database) 保存數據 常用配置項 RDB 持久化優點 RDB應用 RDB持久化缺點 AOF(Append Only File) 保存數據策略 配置 RDB 與 AOF 如何選擇 事務 命令 事務中的錯誤 命令錯誤 操作錯誤 鎖 命令 數據刪除策略 定時刪除(即可刪除) 惰性刪除 定期刪除 步驟 數據淘汰策略 配置 檢測易失數據集(可能會過期數據server.db[i].expires) 檢測全庫數據(所有數據集server.db[i].dict) 放棄數據驅逐 服務器基本配置 高級數據類型 Bitmaps 命令 HyperLoglog 命令 GEO 命令 主從復制 創建鏈接 數據同步 全量復制 部分復制 哨兵模式 配置 集群(cluster) 配置 命令Redis 運行快速的原因
完全基于內存操作
數據結構簡單,數據操作也簡單
使用多路I/O復用模型
數據類型
String
單條操作
增:set key value
查:get key
刪:del key
多條操作
增:mset key value [key1 value1]
查:mget key [key1]
其他命令
strlen key //獲取字符串長度
append key value //有則追加,無則新建
setnx key value //不存在就設置,存在就不設置
incr key //自增 1
incrby key num //給key的值增加num(int 類型),num 正數則為加,num 為負數 則為減
incrbyfloat key num //給key的值增加num(float 類型)
decr key //自減 1
decrby key num //給key的值減num
setex key second value //設置key的值為value存活時間為second秒
psetex key millisecond value //設置key的值為value存活時間為millisecond毫秒
注:
字符串值最大值為512m
Hash
和字符串相似,可理解為字符串厘米套字符串
單條操作
增:hset key field value
查:hget key field
刪:hdel key field
多條操作
增:hmset key field value [field1 value2]
查:hmget key field [field1]
其他命令
hgetall key //獲取key的全部的值
hlen key //獲取key的值的數量
hexists key field //是否存在field
hkeys key //所有key的字段(field)
hvals key //所有key的值
hincrby key field num //給key的field的值增加num (num 為int值)
hincrybyfloat key field num //給key的field的值增加num (num 為float)
hsetnx key field value //存在不設置,不存在設置
注:
Hash類型的value只能存字符串,不允許再嵌套其他類型,如果數據為空為Nil
每個Hash可以存儲232?12^{32}-12?
32
??1個鍵的值對
Hash類型十分貼近對象的數據存儲,并且可以靈活添加、刪除對象屬性。但Hash類型設計并不是存在量而設計的,切記不可濫用,更不可將Hash作為對象列表使用
hgetall操作可以獲取全部屬性,如果內部field過多,遍歷整體數據時效率會降低,很有可能成為數據訪問的瓶頸
String存儲對象(Json) VS Hash存儲對象
String存在對象講究整體性,以讀為主
Hash存儲對象講究分散性,以寫為主
List
講究順序
添加
lpush key value [value1] //從左添加
rpush key value [value1] //從右添加
獲取
lrange key start stop
lindex key index
llen key
獲取并移除
lpop key //從左出
rpop key //從右出
lpush?? ?list?? ?a?? ?b?? ?c
結果:c b a
===============================
rpush list a?? ?b?? ?c
結果:a b c
===============================
list=[a?? ?b?? ?c]
lpop list
結果:b c
===============================
list=[a b c]
rpop list
結果:a b
===============================
注:
list中保存的數據都是String,數據總量是有限的,最多232?12^{32}-12?
32
??1個元素
list具有索引的概念,但是操作數據時通常以隊列的形式進行入隊出隊操作(或以棧的形式進行入棧出棧操作)
當stop的值為-1時,獲取的是全部數據
list對數據進行分頁操作,通常第一頁的數據使的信息來自list,其他頁面的數據通過數據形式進行加載
Set
命令
增:sadd key member [member1]
查:smembers key
刪:srem key member [member1]
獲取總量:scard key
判定是否存在:sismember key member
隨機獲取(原集合保留):srandmember key [count]
隨機獲取(原集合不保留):spop key
集合交集:sinter key key1 key2
集合并集:sunion key key1 key2
集合差集:sdiff key key1 key2
存儲集合交集:sinterstore destination key key1 key2
存儲集合并集:sunionstore destination key key1 key2
存儲集合差集:sdiffstore destination key key1 key2
集合元素移動:smove source destination member
Sorted_Set
命令
增:zadd key score member [score1 member1]
刪:zrem key member [member1]
獲取全部(正序):zrange key start stop [withscores]
獲取全部(倒序):zrevrange key start stop [withscores]
按條件查(正序):zrangebyscore key min max [withscore limit]
按條件查(倒序):zrevrangebyscore key max min [withscore limit]
按條件刪除(索引):zremrangebyrank key start stop
按條件刪除(積分):zremrangebyscore key min max
獲取集合總量:zcard key | zcount key min max
存儲集合交集: zinterstore destination numkeys key key1
存儲集合并集:zunionstore destination numkeys key key1
獲取索引(正序):zrank key member
獲取索引(倒序):zrevrank key member
score值獲取:zscore key member
score值修改:zincrby key num member
Key的操作
命令
刪除:del key
判斷是否存在:exists key
獲取key類型:type key
指定有效期:
expire key seconds
pexpire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp
獲取有效期:
ttl key
pttl key
設置永久:persist key
查詢key:key pattern //*,?,[]
重命名:rename key newkey | renamenx key newkey
對key排序:sort
數據庫操作
命令
選擇數據庫:select index
數據移動:move key db
數據庫大小:dbsize
數據清除:
單庫刪除:flushdb
多庫刪除:flushall
持久化
RDB(Relational Database)
保存數據
指令(前臺):save //阻塞 立即保存
指令(后臺):bgsave //不立即執行
配置:save second changes //用bgsave執行操作
常用配置項
數據文件名稱:dbfilename dump.rdb //默認
數據保存路徑:dir
是否開啟壓縮:rdbcompression yes //默認
是否開啟格式檢查:rdbchecksum yes|no //默認no
RDB 持久化優點
RDB是一個緊湊壓縮的二進制文件,存儲效率高
RDB存儲的是Redis在某個時間點的數據快照,非常適用于數據備份全量復制等場景
RDB恢復數據速度比AOF快
RDB應用
服務器中每X小時執行bgsave備份,并將RDB文件拷貝到遠程機器中,用于災難恢復
RDB持久化缺點
RDB方式無論是執行命令還是進行配置,無法做到實時持久化,具有較大可能丟失數據
bgsave每次運行要執行fork操作創建子進程,要犧牲一些性能
Redis的眾多版本中未進行RDB文件格式的版本統一,有可能出現各個版本服務器之間數據格式無法兼容
存儲數量較大時,效率較低
大數據量下的I/O性能較低
基于fork創建子進程,內存產生額外消耗
宕機帶來的數據丟失風險
AOF(Append Only File)
保存數據策略
每次:always
每秒:everysec
系統控制:no
配置
是否開啟:appendonly yes|no //默認no
保存策略:appendfsync always|everysec|no
重寫:
手動:bgrewriteaof
自動:
auto-aof-rewrite-min-size size
auto-aof-rewrite-percentage percentage
RDB 與 AOF 如何選擇
對數據非常敏感,建議使用默認的AOF持久化方案
AOF策略使用everysec,每秒fsync一次,該策略仍可保持很好性能,出現問題最多丟失一秒內的數據
數據呈現階段有效性,建議使用RDB持久化方案
數據可以做到階段內無丟失,且恢復較快,階段點數據恢復通常使用RDB方案
注意:
AOF文件存儲體積較大,恢復速度較慢
利用RDB使用線緊湊的數據持久化會使Redis性能降低
綜合:
RDB與AOF選擇實際上是在一種權衡,每種都有利有弊
如果不能承受分鐘內的數據丟失,對業務數據非常敏感,選用AOF
如果能承受分鐘內的數據丟失,且追求大數據集的恢復速度選用RDB
災難恢復選用RDB
雙保險策略,同時開啟RDB和AOF,重啟后Redis優先使用AOF來恢復數據,降低丟失數據量
事務
Redis事務不具有回滾機制
命令
開啟:multi
結束:exec
中斷:discard
事務中的錯誤
命令錯誤
執行事務過程中輸入的命令出現錯誤,Redis會結束事務不再執行,并報出錯誤的命令
操作錯誤
執行事務過程中輸入的命令正確,其他操作錯誤,事務中其他命令正常執行,錯誤操作報錯
鎖
Redis中鎖和事務是相搭配使用的,可解決對key的監控
命令
加鎖:watch key [key1]
解鎖:unwatch //取消掉所有key的監控
數據刪除策略
當key過期后執行數據刪除的策略
定時刪除(即可刪除)
創建一個具有時效性的key時,同時會創建一個定時器來監控該key是否過期,當key過期后立即進行key的刪除
優點:節約內存,到時就會進行刪除,快速釋放占用空間
缺點:CPU壓力大影響Redis響應時間和吞吐量
總結:用處理器性能換取存儲空間
惰性刪除
當一個具有實效性的key過期后不會有刪除操作,直到下一次調用時會先檢查該key是否過期,如果過期則進行刪除操作,并返回nil(該key不存在)
優點:節約CPU性能,發現必須刪除的時候才會刪除
缺點:內存壓力大,出現長期占用內存的數據
總結:用存儲空間換取處理器性能
定期刪除
Redis會根據設置的參數,定期對具有時效性的key進行清理工作,它是定時刪除和惰性刪除的結合者,既不像定時刪除會立即進行刪除給予CPU壓力,也不會像惰性刪除給予內存壓力
步驟
Redis啟動服務器初始化時,讀取配置server.hz的值(默認為10)
每秒鐘執行server.hz次serverCron()服務(serverCron【服務器級別】->databasesCron【數據庫級別】->activeExpireCyle【活躍數據級別】)
acitveExpireCyle()對每個expires[*](數據庫)逐一進行檢測,每次執行250ms/server.hz
對某個expires[*]檢測時,隨機挑選w個key進行檢測
如果key超時,刪除key
如果一輪中刪除的kye的數量>w*25%,循環該過程
如果一輪中刪除的可以的數量<=w25%檢查下一個expires[],0-15(所有的數據庫)循環
W=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP
參數current_db用于記錄activeExpireCyle進入哪個expires[*]執行
數據淘汰策略
當內存到達最大內存限制時進行的數據淘汰策略
數據驅逐淘汰策略配置依據,使用info命令輸出相關監控信息,查新緩存hit 命中次數和miss的次數,根據業務調優
配置
最大可用內存:maxmemory //默認為0,一般設置全部內存50%以上
每次選取帶刪除數據個數:maxmemory-samples //采用隨機獲取方式
刪除策略:maxmemory-policy //達到最大內存后,對被選取帶數據進行的刪除策略
檢測易失數據集(可能會過期數據server.db[i].expires)
volatile-lru:挑選最近最少使用的數據淘汰(最近數據中使用時間離當前最遠的數據)。常用
volatile-lfu:挑選最近使用次數最少的數據淘汰(最近數據中使用次數最少的數據)
volatile-ttl:挑選將要過期數據淘汰
volatile-random:任意挑選數據淘汰
ttl:time to live
lru:least recently used
lfu:least frequently used
檢測全庫數據(所有數據集server.db[i].dict)
allkeys-lru:挑選最近最少使用的數據淘汰
allkeys-lfu:挑選最近使用次數最少的數據淘汰
allkeys-random:任意挑選數據淘汰
放棄數據驅逐
no-enviction //禁止驅逐數據
4.0中默認策略,會引發OOM
服務器基本配置
設置服務器守護進程方式:daemonize yes|no
綁定地址:bing 127.0.0.1
設置服務器端口:port 6379
設置數據庫數量:databases 16
設置服務器日志級別:loglevel debug|verbose|notice|warning
日志文件名稱:logfile 端口號.log
設置客戶端最大連接數:maxclients 0
客戶端閑置最大等待時長:timeout 0
高級數據類型
Bitmaps
標記統計
命令
獲取:getbit key offset
設置:setbit key offset value // 0 或 1
交、并、或異
bitop op destkey key1 key2
op:
交:and
并:or
非:not
異或:xor
統計指定key中1的數量:bitcount key [start end]
HyperLoglog
基數統計
命令
添加:pfadd key element [element1]
統計:pfcount key [key1]
合并:pfmerge destkey sourcekey [sourcekey1]
GEO
距離計算(只計算水平距離)
命令
添加:geoadd key longitude latitude member [longitude1 latitude1 member1]
獲取:geopos key member [member1]
計算距離:geodist key member1 member2 [count]
根據坐標求范圍內數據:georadius key longitude latitude radius m|km|ft|mi
根據點求范圍內的數據:georadusbymember key member radius m|km|ft|mi
獲取指定點對應的hash值:geohash key member [member1]
主從復制
創建鏈接
方式一:客戶端發指令:slaveof masterip masterport
方式二:參數啟動:redis-server --slaveof masterip masterport
方式三:服務器配置:slaveof masterip masterport
數據同步
全量復制
從:發送指令(psync2)
主:執行bgsave
主:第一個slave鏈接時,創建命令緩沖區
主:生成RDB文件,通過socket發送給slave
從:接收RDB文件,清空自己數據,執行RDB文件恢復過程
部分復制
從:發送命令告知RDB恢復完成
主:發送復制緩沖區信息
從:接收信息,執行bgsavewriteaof,恢復數據
哨兵模式
配置
sentinel.conf
啟動:redis-sentinel
集群(cluster)
配置
開啟:cluster-enabled yes|no
配置文件名稱:cluster-config-file filename
節點超時時間:cluster-node-timeout milliseconds
master鏈接slave最小數:cluster-migration-barrier count
命令
查看節點信息:cluster nodes
從一個節點Redis,切換其主節點:cluster replicate masterip
新增主節點:cluster meet ip:port
忽略一個節點:cluster foeget id
手動故障轉移:cluster failover
?
?
總結
以上是生活随笔為你收集整理的Redis基础高级学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 400千卡等于多少脂肪(1千卡等于多少脂
- 下一篇: Mysql京东的一道面试题目 比较综合