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