《電馭叛客2077攻略》威斯特布魯克委託-傳家寶
Redis
安裝
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
//scl enable devtoolset-9 bash
echo “source /opt/rh/devtoolset-9/enable” >>/etc/profile
cd /usr/local/bin
cp /opt/redis-6.2.1/redis.conf zconfig/
systemctl status firewalld
systemctl start firewalld
檢視指定埠是否已開放
firewall-cmd --query-port=3690/tcp
提示 yes,表示開啟;no表示未開啟
新增指定需要開放的埠:
firewall-cmd --add-port=3690/tcp --permanent
過載入新增的埠:
firewall-cmd --reload
測試有效!
![(Redis.assets/image-20210412091937193.png)
從系統維度說,要了解 Redis 各項關鍵技術的設計原理,並掌握一些系統設計規範,比如 run-to-complete 模型、epoll 網路模型,以便應用到後續的系統開發中。但 Redis 的知識點很零碎,所以,可以按照“三大主線”為它們分類:
- 高效能主線,包括執行緒模型、資料結構、持久化、網路框架;
- 高可靠主線,包括主從複製、哨兵機制;
- 高可擴充套件主線,包括資料分片、負載均衡。
在應用維度上,可以按 “應用場景驅動”和“典型案例驅動”兩種方式學習,一個是“面”的梳理,一個是“點”的掌握。
五大資料型別使用場景
預設安裝路徑
/user/local/bin
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-dSdu1X3M-1619079935446)(Redis.assets/image-20210326130319401.png)]
-
將配置檔案重新拷貝一份,並修改config使用後臺啟動[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-HtuJqk2t-1619079935448)(Redis.assets/image-20210326130824405.png)]
-
啟動要使用後臺啟動:
redis-server redis.conf ---> redis-cli -p 6379
-
檢視redis程序
ps -ef|grep redis
-
關閉redis shutdown —> exit
命令不區分大小寫,key區分大小寫
String
商品編號,訂單編號 INCR自增生成
是否喜歡的文章
list
有序有重複
微信文章公眾號
hash
redis中的雜湊對應於java中的什麼資料結構
Map<String,Map<Object,Object>>
使用場景
購物車早期,中小廠使用
set有序集合
使用場景:
- 小程式抽獎
- 共同好友,標籤
zset(sorted tree)
使用場景
- 熱搜
- 商品排序,按照銷售量,按照搜尋,按照距離
bitmap
只有0,1兩個狀態
HyperLoglogs
GEO
Stream
事務:
不保證原子性
沒有隔離級別,所有的命令在事務中並沒有直接被執行而是在發起命令的時候才會在執行,先進入佇列
- 開啟事務: multi
- 命令入隊
- 執行事務:exec
鎖:Redis可以實現樂觀鎖
分散式鎖:
區別
- JVM層面的加鎖 單機版的鎖
- 分散式微服務架構,拆分後,為了避免衝突和資料故障加入的一種鎖
實現方案
- Mysql實現
- zookeper
- Redis
之前,String+setnx 自己手寫需要setnx + lua指令碼
現在使用RedisCluster — Redisson
-
單機版加鎖
- sychronized—程式碼塊不完成,不結束,請求積壓—不見不散
- lock-Renentrentlock
- trylock----過時不候,規避一直等待
不見不散
過時不候
-
ngix 反向代理和負載均衡
-
加上setnx分散式鎖
實現方式:setIfAbsent() == setnx操作
@GetMapping("/buy_goods") public String buy_Goods() { String value = UUID.randomUUID().toString() + Thread.currentThread().getName();//識別符號,不可重複 Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent(REDIS_LOCK, value);//缺席 nx if not exist == setnx if(!flag){ return "強鎖失敗"; } String result = stringRedisTemplate.opsForValue().get("goods:001"); // == get key 看看庫存的數量夠不夠 int goodNumber = result == null ? 0 : Integer.parseInt(result); //判斷產品是否為null if (goodNumber > 0) { int realNumber = goodNumber - 1; stringRedisTemplate.opsForValue().set("goods:001", String.valueOf(realNumber)); System.out.println("成功買到商品,庫存還剩下 : " + realNumber + "件" + "\t 服務提供埠為 " + serverPort); stringRedisTemplate.delete(REDIS_LOCK); return "成功買到商品,庫存還剩下 : " + realNumber + "件" + "\t 服務提供埠為 " + serverPort; } else { System.out.println("商品已經售罄/活動結束/呼叫超時" + "\t 服務提供埠:" + serverPort); return "商品已經售罄/活動結束/呼叫超時" + "\t 服務提供埠:" + serverPort; } }
-
業務操作出現異常無法解鎖----finally程式碼塊強制解鎖
-
部署了微服務jar包的機器掛了,程式碼層面根本沒有走到finally這塊, 沒辦法保證解鎖,這個key沒有被刪除,需要加入一個過期時間限定key
解決方法: 把key設定超時時間–expire
沒有保證原子性:加鎖和設定過期時間沒有保證原子性
-
設定key+過期時間分開了,必須要合併成一行具備原子性
解決方法:
Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent(REDIS_LOCK, value,10L,TimeUnit.SECONDS);
-
張冠李戴,刪除了別人的鎖
只能刪除自己得鎖—進行value判斷
-
finally塊的判斷+del刪除操作不是原子性的
LUA指令碼
不可以用LUA指令碼—redis自身事務
-
確保redisLock過期時間大於業務執行時間的問題
redis分散式鎖續期----
-
叢集+CAP 對比zookeeper
redis ap,主節點寫入,從節點還沒複製完成就宕機了,早成資料不一致,從機上位,主機降級
zookeeper沒有非同步複製丟失,併發性下降
-
規避快取續期和資料不一致性,Redlock之Redission實現
總結:
redis叢集環境下,我們自己寫的也不OK, 直接上RedLock之Redisson落地實現
Redisson lock/unlock
單點部署什麼問題,怎麼解決
叢集模式,比如主從模式,有沒有什麼問題
介紹一下Redlock,介紹一下Redission
了,早成資料不一致,從機上位,主機降級
zookeeper沒有非同步複製丟失,併發性下降
- 規避快取續期和資料不一致性,Redlock之Redission實現
總結:
redis叢集環境下,我們自己寫的也不OK, 直接上RedLock之Redisson落地實現
Redisson lock/unlock
單點部署什麼問題,怎麼解決
叢集模式,比如主從模式,有沒有什麼問題
介紹一下Redlock,介紹一下Redission
Redis分散式鎖如何續期,看門狗知道嗎