redis cli 删除key 模糊_Redis集群及雪崩
redis分布式集群
上一篇 主從復(fù)制(哨兵),雖然主從能提升讀的并發(fā),但是單個(gè)master節(jié)點(diǎn)的容量是有限的,內(nèi)存數(shù)據(jù)達(dá)到一定程度就會(huì)有瓶頸,無論多少套主從,master的容量都是最終的瓶頸。這個(gè)時(shí)候我們需要水平擴(kuò)展內(nèi)存,而分布式集群恰好能解決這點(diǎn),redis集群最少要求三組進(jìn)行確立集群,客戶端建立與集群連接,只需要與其中的一個(gè)進(jìn)行連接就可以,數(shù)據(jù)不具體存儲(chǔ)到集群中的某個(gè)節(jié)點(diǎn)上,而是存儲(chǔ)到集群的槽點(diǎn)上。
集群能解決那些問題
- 高并發(fā)
- 高可用
- 訪問/存儲(chǔ)水平擴(kuò)展
redis集群配置
#解釋下,我主機(jī)上上redis是以端口來區(qū)別的,沒有分開部署到8臺(tái)機(jī)子上#集群中單機(jī)配置 redis.confdaemonize yesdir /usr/local/redis-cluster/8001bind 0.0.0.0requirepass cqp1116 #因?yàn)閞edis是隨機(jī)分配主從,所以盡量密碼弄成一樣的方便記憶。masterauth cqp1116 #集群創(chuàng)建會(huì)自動(dòng)搭建主從關(guān)系,所以不要手工配置replicaofport 8001pidfile /var/run/redis_8001.pid# 開啟集群配置cluster-enabled yes# 集群每個(gè)節(jié)點(diǎn)都需要的配置文件cluster-config-file nodes-8001.conf# master超時(shí)時(shí)間,超過后主備切換cluster-node-timeout 3000# 開啟AOFappendonly yes#因?yàn)槲沂窃谝慌_(tái)服務(wù)器上搭建集群,可以用批命令的方式進(jìn)行chmod 777 cluster.shredis-server /usr/local/redis-cluster/8001/redis.confredis-server /usr/local/redis-cluster/8002/redis.confredis-server /usr/local/redis-cluster/8003/redis.confredis-server /usr/local/redis-cluster/8004/redis.confredis-server /usr/local/redis-cluster/8005/redis.confredis-server /usr/local/redis-cluster/8006/redis.conf#運(yùn)行./cluster.sh啟動(dòng)搭建集群
# Redis 3.x開始有集群,redis-trib.rb# Redis 5.x使用redis-cli就可以了# 集群創(chuàng)建的命令# --cluster-replicas 1 每個(gè)master有幾個(gè)slaveredis-cli -a cqp1116 --cluster create 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8005 127.0.0.1:8006 --cluster-replicas 1# 查看集群信息redis-cli -a cqp1116 --cluster check 127.0.0.1:8001# 查看集群命令幫助redis-cli -a cqp1116 --cluster help數(shù)據(jù)存儲(chǔ)
當(dāng)我們?cè)诩簡(jiǎn)我还?jié)點(diǎn)上保存數(shù)據(jù)的時(shí)候,會(huì)一定保存到當(dāng)前登錄節(jié)點(diǎn)么?
# 單機(jī)登錄節(jié)點(diǎn)redis-cli -a cqp1116 -p 8001# 集群登錄節(jié)點(diǎn)redis-cli -c -a cqp1116 -p 8001set key valueget key127.0.0.1:8001> cluster info127.0.0.1:8001> cluster nodeskeys * # 在集群狀態(tài)下只能拿到當(dāng)前節(jié)點(diǎn)的所有數(shù)據(jù)#-> Redirected to slot [12539] located at 127.0.0.1:8003slot槽點(diǎn)
slot就是支持分布式存儲(chǔ)的核心,redis集群創(chuàng)建后會(huì)創(chuàng)建16384個(gè)槽點(diǎn),并且根據(jù)集群的master數(shù)據(jù)平均分配給master
- 如果有3個(gè)master,16384/3=(大約)5460個(gè)
- 當(dāng)你往redis集群中插入數(shù)據(jù)時(shí),數(shù)據(jù)只存一份,不一定在你登錄節(jié)點(diǎn)上,redis集群會(huì)使用crc16(key)mod16384來計(jì)算這個(gè)key應(yīng)該放在那個(gè)hash slot中
- 獲取數(shù)據(jù)的時(shí)候也會(huì)根據(jù)key來取模,就知道在哪個(gè)slot上了,也就能redirect了
- 一個(gè)slot其實(shí)就是一個(gè)文件夾,就能存很多key
集群如何實(shí)現(xiàn)分布式
- 每個(gè)master只保存mod后的slot數(shù)據(jù)
- 如果要擴(kuò)展,再加入一個(gè),只需要給這個(gè)新節(jié)點(diǎn)再分一些slot就行了,但注意無論多少個(gè)node,slots總數(shù)不變都是16384
- 8g(2460),8g(2460),8g(2460),這個(gè)時(shí)候加入一個(gè)16g(4000) 16g(5000):total-16384
- slot移動(dòng),slot里的數(shù)據(jù)也跟著移動(dòng)
- 一個(gè)master節(jié)點(diǎn)是否內(nèi)存裝滿,是slots數(shù)量多少還是slot里存放的文件多少導(dǎo)致的?
集群搭建簡(jiǎn)易
- 建議是奇數(shù)個(gè),至少3個(gè)master節(jié)點(diǎn)
- 主從切換:節(jié)點(diǎn)間會(huì)相互通信,一半以上的節(jié)點(diǎn)ping不通某個(gè)節(jié)點(diǎn),就認(rèn)為這個(gè)master掛了,這個(gè)時(shí)候從節(jié)點(diǎn)頂上
- 什么時(shí)候整個(gè)集群不可用
- 如果集群中任意master掛掉,且沒有slave頂上,集群就進(jìn)入fail狀態(tài)
- 如果超半數(shù)以上的master掛掉,無論是否有slave,集群都進(jìn)入fail狀態(tài)
集群新增節(jié)點(diǎn)
#add-node new_host:new_port existing_host:existing_port# --cluster-slave# --cluster-master-id # 新增主節(jié)點(diǎn)redis-cli -a cqp1116 --cluster add-node 127.0.0.1:8007 127.0.0.1:8001# 加入后可以通過cluster nodes來查看127.0.0.1:8001> cluster nodes# 給8007分配slot# --cluster-from 從哪個(gè)節(jié)點(diǎn)來分配slot,這里只能寫node_id,就是cluster nodes獲得id,from可以是一個(gè)節(jié)點(diǎn)也可以是多個(gè)節(jié)點(diǎn)# --cluster-to 到8007節(jié)點(diǎn),同樣是node_id# --cluster-slots 從from節(jié)點(diǎn)一共分多少slot,并且from中的node是平均分這個(gè)總數(shù)的 4096/3# --cluster-yes 不用提示直接執(zhí)行redis-cli -a cqp1116 --cluster reshard 127.0.0.1:8001 --cluster-from 4248563f9000101bff9ff1beb27a7d595c99fa8e,21ccab2ac6b6724b3469f9c0662119a4ce3a06fc,598304ac00aa2daa61773b1fc32d26f99e6f8463 --cluster-to 75b831369eedd8b5fe0aee4b2819f573ae0592a2 --cluster-slots 4096 --cluster-yes# 給8007增加8008的slave節(jié)點(diǎn)redis-cli -a cqp1116 --cluster add-node 127.0.0.1:8008 127.0.0.1:8001 --cluster-slave --cluster-master-id 75b831369eedd8b5fe0aee4b2819f573ae0592a2節(jié)點(diǎn)下線
# 下線節(jié)點(diǎn),現(xiàn)有考慮把slots分給其他節(jié)點(diǎn),這就是在做數(shù)據(jù)遷移# 我這一次分配,也可以分批移動(dòng)給多個(gè)節(jié)點(diǎn),我要下架8001/8006redis-cli -a cqp1116 --cluster reshard 127.0.0.1:8002 --cluster-from 4248563f9000101bff9ff1beb27a7d595c99fa8e --cluster-to 21ccab2ac6b6724b3469f9c0662119a4ce3a06fc --cluster-slots 4096 --cluster-yes# 檢查一下8001的slot是否全部轉(zhuǎn)移走127.0.0.1:8002> cluster nodes# 刪除8001節(jié)點(diǎn),這里的節(jié)點(diǎn)建議寫成刪除節(jié)點(diǎn)redis-cli -a cqp1116 --cluster del-node 127.0.0.1:8001 4248563f9000101bff9ff1beb27a7d595c99fa8e# 刪除8006節(jié)點(diǎn),這里的節(jié)點(diǎn)建議寫成刪除節(jié)點(diǎn)redis-cli -a cqp1116 --cluster del-node 127.0.0.1:8006 58d18e90e4ed86de44a6c14455e2f24825924e93redis-cluster常用命令
# redis-cli --cluster查看幫助redis-cli --cluster help# 給新加入的node分配slot,all代表所有master節(jié)點(diǎn)redis-cli -a cqp1116 --cluster reshard 127.0.0.1:8001 --cluster-from all --cluster-to 60709ef9ee8238811115c38970468af8b611643a --cluster-slots 4000 --cluster-yes# cluster命令,是執(zhí)行在redis-cli,一定要先登錄到集群中# 新增master節(jié)點(diǎn)cluster meet 127.0.0.1 8007# 使用rebalance命令來自動(dòng)平均分配slot# --cluster-threshold 1 只要不均衡的slot數(shù)量超過1,就觸發(fā)rebanlance# --cluster-use-empty-masters 沒有slot槽點(diǎn)的節(jié)點(diǎn)也參數(shù)均分redis-cli -a cqp1116 --cluster rebalance 127.0.0.1:8001 --cluster-threshold 1 --cluster-use-empty-masters# cluster命令,是執(zhí)行在redis-cli,一定要先登錄到集群中# 新增slave節(jié)點(diǎn)# REPLICATE -- Configure current node as replica to .# 前提是這個(gè)副本節(jié)點(diǎn)要先在集群中cluster meet 127.0.0.1 8008# 加入后切換到新增的slave 8008cluster replicate 60709ef9ee8238811115c38970468af8b611643aspringboot整合集群
spring: redis: password: cqp1116 cluster: nodes: 127.0.0.1:8001,127.0.0.1:8002,127.0.0.1:8003,127.0.0.1:8004,127.0.0.1:8005,127.0.0.1:8006,127.0.0.1:8007,127.0.0.1:8008redis性能監(jiān)控
# redis-benchmark檢查redis的并發(fā)性能的# -c 100個(gè)連接# -n 500個(gè)請(qǐng)求# 主要是測(cè)試redis主機(jī)的一個(gè)本地性能redis-benchmark -h 127.0.0.1 -p 8001 -a cqp1116 -c 100 -n 500慢查詢
# redis.conf配置# 設(shè)置慢查詢的時(shí)間下限,超過多少微秒的進(jìn)行記錄slowlog-log-slower-than 10000# 慢產(chǎn)訊對(duì)應(yīng)的日志長度,單位:命令數(shù)slowlog-max-len 128查看慢查詢
# redis-cli客戶端下# 查看慢查詢127.0.0.1:6379> slowlog get# 獲取慢查詢條目127.0.0.1:6379> slowlog len# 重置慢查詢?nèi)罩?27.0.0.1:6379> slowlog resetredis雪崩
什么是redis雪崩
雪崩是基于數(shù)據(jù)庫,所有原理應(yīng)該到Redis的查詢?nèi)紻B,并且是同時(shí)到達(dá)
緩存在同一時(shí)間大量的key過期(key)
多個(gè)用戶同時(shí)請(qǐng)求并到達(dá)數(shù)據(jù),而且這個(gè)請(qǐng)求只有一個(gè)是有意義的,其他的都是重復(fù)無用功
redis雪崩解決方案
- 緩存用不過期:冰封了
- 過期時(shí)間錯(cuò)開(可以在key創(chuàng)建時(shí)加入一個(gè)1-10分鐘的隨機(jī)數(shù)給到key)
- 多緩存數(shù)據(jù)結(jié)合(不要直接打到DB上,可以在DB上再加一個(gè)搜索引擎)
- 在代碼里通過鎖解決(synchronized,分布式鎖zookeeper)
Redisson實(shí)現(xiàn)分布式鎖機(jī)制
分布式鎖的核心
- 加鎖
- 鎖刪除:一定不能因?yàn)殒i提前超時(shí)導(dǎo)致刪除非自己的鎖
- 鎖超時(shí):如果業(yè)務(wù)沒有執(zhí)行完就應(yīng)該給鎖延時(shí)
java代碼實(shí)現(xiàn)
@Configurationpublic class controller { @Autowired RedissonClient redissonClient; @GetMapping("/redisson") @ResponseBody public String redissonLock(){ RLock rLock = redissonClient.getLock("orderId"); System.out.println("開啟鎖**********"); try { //如果有鎖等待5秒,加鎖后持有30秒 rLock.tryLock(5, 30, TimeUnit.SECONDS); System.out.println("獲取鎖*********"); }catch (Exception ex){ ex.printStackTrace(); } finally { System.out.println("釋放鎖*********"); rLock.unlock(); } return "redisson"; }}redisson默認(rèn)就是加鎖30秒,建議也是30秒以上,默認(rèn)的lockWatchdogTimeout會(huì)每隔10秒觀察一下,待到20秒的時(shí)候如果主進(jìn)程還沒有釋放鎖,就會(huì)主動(dòng)續(xù)期30秒
總結(jié)
以上是生活随笔為你收集整理的redis cli 删除key 模糊_Redis集群及雪崩的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 写入第二列_python读
- 下一篇: linux cmake编译源码,linu