1. 程式人生 > 電馭叛客2077攻略 >《電馭叛客2077攻略》威斯特布魯克委託-傳家寶

《電馭叛客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

測試有效!

image-20210412091810198![(Redis.assets/image-20210412091937193.png)

image-20210412091937193

系統維度說,要了解 Redis 各項關鍵技術的設計原理,並掌握一些系統設計規範,比如 run-to-complete 模型、epoll 網路模型,以便應用到後續的系統開發中。但 Redis 的知識點很零碎,所以,可以按照“三大主線”為它們分類:

  • 高效能主線,包括執行緒模型、資料結構、持久化、網路框架;
  • 高可靠主線,包括主從複製、哨兵機制;
  • 高可擴充套件主線,包括資料分片、負載均衡。

在應用維度上,可以按 “應用場景驅動”和“典型案例驅動”兩種方式學習,一個是“面”的梳理,一個是“點”的掌握。

五大資料型別使用場景

image-20210324220359298

預設安裝路徑

/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區分大小寫

[email protected]名詞

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

  1. 單機版加鎖

    • sychronized—程式碼塊不完成,不結束,請求積壓—不見不散
    • lock-Renentrentlock
      • trylock----過時不候,規避一直等待

    不見不散

    過時不候

  2. ngix 反向代理和負載均衡

  3. 加上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;
        }
    
    }
    
  4. 業務操作出現異常無法解鎖----finally程式碼塊強制解鎖

  5. 部署了微服務jar包的機器掛了,程式碼層面根本沒有走到finally這塊, 沒辦法保證解鎖,這個key沒有被刪除,需要加入一個過期時間限定key

    解決方法: 把key設定超時時間–expire

    沒有保證原子性:加鎖和設定過期時間沒有保證原子性

  6. 設定key+過期時間分開了,必須要合併成一行具備原子性

    解決方法:

    Boolean flag = stringRedisTemplate.opsForValue().setIfAbsent(REDIS_LOCK, value,10L,TimeUnit.SECONDS);
    
  7. 張冠李戴,刪除了別人的鎖

    只能刪除自己得鎖—進行value判斷

  8. finally塊的判斷+del刪除操作不是原子性的

    LUA指令碼

    不可以用LUA指令碼—redis自身事務

  9. 確保redisLock過期時間大於業務執行時間的問題

    redis分散式鎖續期----

  10. 叢集+CAP 對比zookeeper

    redis ap,主節點寫入,從節點還沒複製完成就宕機了,早成資料不一致,從機上位,主機降級

    zookeeper沒有非同步複製丟失,併發性下降

  11. 規避快取續期和資料不一致性,Redlock之Redission實現

總結:

redis叢集環境下,我們自己寫的也不OK, 直接上RedLock之Redisson落地實現

Redisson lock/unlock

單點部署什麼問題,怎麼解決

叢集模式,比如主從模式,有沒有什麼問題

介紹一下Redlock,介紹一下Redission

了,早成資料不一致,從機上位,主機降級

zookeeper沒有非同步複製丟失,併發性下降
  1. 規避快取續期和資料不一致性,Redlock之Redission實現

總結:

redis叢集環境下,我們自己寫的也不OK, 直接上RedLock之Redisson落地實現

Redisson lock/unlock

單點部署什麼問題,怎麼解決

叢集模式,比如主從模式,有沒有什麼問題

介紹一下Redlock,介紹一下Redission

Redis分散式鎖如何續期,看門狗知道嗎