springboot redis(單機/集群)

来源:https://www.cnblogs.com/elvinle/archive/2018/01/31/8378484.html
-Advertisement-
Play Games

前言 前面redis弄了那麼多, 就是為了在項目中使用. 那這裡, 就分別來看一下, 單機版和集群版在springboot中的使用吧. 在裡面, 我會同時貼出Jedis版, 作為比較. 單機版 1. pom.xml 2. application.yml 這裡為redis設置了一個密碼, 可以在 re ...


前言

  前面redis弄了那麼多, 就是為了在項目中使用. 

  那這裡, 就分別來看一下, 單機版和集群版在springboot中的使用吧.  在裡面, 我會同時貼出Jedis版, 作為比較.

  

單機版

1. pom.xml 

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>1.5.9.RELEASE</version>
</dependency>

 

2. application.yml 

spring:
  redis:
    port: 6379
    host: 127.0.0.1
    password: redis

這裡為redis設置了一個密碼, 可以在 redis.conf 文件中設置: requirepass 密碼

 

3. controller

@RestController
@RequestMapping("simple")
public class SimpleController {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @GetMapping("set")
    public void set(){

        ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();
        operations.set("1", "1a");
        operations.set("2", "2b");
        operations.set("3", "3c");
        operations.set("4", "4d");
        operations.set("5", "5e");
        operations.set("elvin", "elvin");
        operations.set("abc", "abc");
        operations.set("xingming", "xingming");
    }
}

 

4. Jedis

來看一下單機版redis下, Jedis是怎麼玩的.

  @Test
    public void testJedisPool() throws Exception {
        // 第一步:創建一個JedisPool對象。需要指定服務端的ip及埠。
        JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
        // 第二步:從JedisPool中獲得Jedis對象。
        Jedis jedis = jedisPool.getResource();
        jedis.auth("redis");
        // 第三步:使用Jedis操作redis伺服器。
        String result = jedis.get("abc");
        System.out.println(result);
        // 第四步:操作完畢後關閉jedis對象,連接池回收資源。
        jedis.close();
        // 第五步:關閉JedisPool對象。
        jedisPool.close();
    }

結果我就不展示了, 通過以上步驟, 能把controller存入的數據, 讀取出來. 

這裡有一點要註意以下, 如果步驟3用的不是StringRedisTemplate, 而是RedisTemplate, 那麼通過步驟4是讀取不出來的. 

如果你裝了 redis desktop manager , 可以使用這個去看一下, 就會知道為啥讀不出來. 

具體為啥會產生這樣的情況呢?

可以看一下RedisTemplate的源碼:

看得出來, 這裡使用了 JdkSerializationRedisSerializer 來序列化 key 和 value.

直觀點的話, 可以看下圖:

 

so, 這裡就能看出來, 為啥用abc直接去查, 是查不到想要的結果的.

 

集群版

 在集群裡面, 如果你使用的是 spring-boot-starter-data-redis 的話, 就會發現, 超方便, 只要改一下配置文件就可以了, 其他的都可以不改.

1. application.yml

spring:
  redis:
    cluster:
      nodes:
       - 127.0.0.1:7001
       - 127.0.0.1:7002
       - 127.0.0.1:7003
       - 127.0.0.1:7004
       - 127.0.0.1:7005
       - 127.0.0.1:7006
    password: 123456

在application裡面配置集群節點.

 

2. controller

controller裡面的方法不變, 還是用那個. 直接用 Terminal 操作查看:

確實存進去了. 

 

3. Jedis

  @Test
    public void testJedisCluster() throws Exception {
        // 第一步:使用JedisCluster對象。需要一個Set<HostAndPort>參數。Redis節點的列表。
        Set<HostAndPort> nodes = new HashSet<>();
        nodes.add(new HostAndPort("127.0.0.1", 7001));
        nodes.add(new HostAndPort("127.0.0.1", 7002));
        nodes.add(new HostAndPort("127.0.0.1", 7003));
        nodes.add(new HostAndPort("127.0.0.1", 7004));
        nodes.add(new HostAndPort("127.0.0.1", 7005));
        nodes.add(new HostAndPort("127.0.0.1", 7006));
        JedisCluster jedisCluster = new JedisCluster(nodes, 2000, 5, 8, "123456", new GenericObjectPoolConfig());
        // 第二步:直接使用JedisCluster對象操作redis。在系統中單例存在。
        String result = jedisCluster.get("abc");
        // 第三步:列印結果
        System.out.println(result);
        // 第四步:系統關閉前,關閉JedisCluster對象。
        jedisCluster.close();
    }

這裡有個比較蛋疼的事情就是, 如果集群設置了密碼, 並不能通過jedisCluster.auth()方式來輸入密碼

剛開始, 我還以為這是不推薦使用的, 誰知道, 這tm是不能用啊. 過分了, 簡直.

通過Jedis的代碼, 可以發現, 單機版和集群版, 操作的對象是不一樣的, 那麼在開發的過程中, 怎麼來統一呢?(開發的時候, 不需要使用redis集群, 上線的時候, 直接切換過去就可以了)

那麼想要解決這個問題, 可以通過策略模式來解決, 定義一個操作介面, 在介面中定義方法, 我管你單機還是集群, 都要來實現這個介面. 那麼在操作的過程中, 就統一到介面了. 剩下來的就是賦值和切換了.

而使用  spring-boot-starter-data-redis 就不需要考慮那麼多了, 確實方便許多.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1:題目描述 Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would ...
  • 首先自己實現一個簡單的連接池: 數據準備: CREATE DATABASE mybase; USE mybase; CREATE TABLE users( uid INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(64), upassword VARC ...
  • 前面我們說了,在python中,一切皆對象。函數也是一個對象,而且函數對象可以被賦值給變數,通過變數也能調用該函數。如: 以上代碼,輸出: 函數對象有一個__name__屬性,可以拿到函數的名字: 以上代碼,輸出: 你會發現,上例中的變數 f 也獲得了sayHello函數的功能,而且本質上它就是 s ...
  • 前言 雖然windows下, tomcat和solr整合起來灰常的方便, 但是, 一般像這種東西, 都很少部署在windows中, 更多的是部署到linux中去. 其實, 步驟是一樣的, 這裡, 我在centos 中再部署一次. 下包 下載地址還是之前的那個: http://mirror.bit.e ...
  • 一、註意規範 註意:(1).XXXmapper.xml 文件中的 namespace 等於mapper 介面地址 (2).XXXmapper.java 介面中的方法輸入參數和 mapper.xml 中statement的parameterType指定的 類型一致。 (3) .mapper.java ...
  • 一、Spring? Spring興起:2003年,由Rod Johnson創建。總的來說,Spring Framwork從它誕生至今都一直為人所稱道,它的偉大之處自此可見一斑。 核心:IOC&AOP IOC 全稱:Inersion of control-->控制反轉。把對象的創建工作交給框架(有意取 ...
  • 一、什麼演算法 演算法:一個計算過程,解決問題的方法 二、時間複雜度 看代碼: Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<O(n2logn)< Ο(n3)<…<Ο(2^n)<Ο(n!) 三、空間複雜度 空間複雜度:用來評估演算法記憶體占用大小的一個式子 複習:遞歸 遞歸的兩個特點 ...
  • Item 1:View C++ as a federation of languages 單詞: sublanguage:子語言 Exception:異常 template:模板 procedual:過程 object-oriented:面向對象 generic:泛型 blocks:區塊{ } st ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...