Redis跟Spring整合,sentinel模式

来源:http://www.cnblogs.com/happyflyingpig/archive/2017/10/29/7750927.html
-Advertisement-
Play Games

普通模式整合 一、在pom.xml中引入redis的依賴 二、新建redis.xml文件 三、在spring的配置文件中引入redis.xml 四、編寫dao層 五、編寫service層 六、寫測試類進行測試 哨兵模式(sentinel) 就一個配置文件獨特一點 redis-sentinel.xml ...


普通模式整合

一、在pom.xml中引入redis的依賴

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.8.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

 二、新建redis.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-4.0.xsd">


    <!-- Redis連接池配置 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxWaitMillis" value="${redis.maxWait}"/>
        <property name="maxIdle" value="${redis.maxIdle}" />
        <property name="minIdle" value="${redis.minIdle}" />
        <property name="maxTotal" value="${redis.maxTotal}" />
        <property name="testOnBorrow" value="true" />
    </bean>

    <bean id="jedisShardInfo" class="redis.clients.jedis.JedisShardInfo">
        <constructor-arg index="0" value="${redis.host}" />
        <constructor-arg index="1" value="${redis.port}" type="int" />
        <!--如果redis沒有設置密碼,就不需要這個-->
        <property name="password" value="${redis.password}" />
    </bean>

    <!-- Redis連接 -->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
          p:shardInfo-ref="jedisShardInfo"
          p:poolConfig-ref="jedisPoolConfig" />

    <!-- 緩存序列化方式 -->
    <!-- 如果不配置Serializer,那麼存儲的時候只能使用String,如果用對象類型存儲,那麼會提示錯誤 can't cast to String!!!-->
    <bean id="keySerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />
    <bean id="valueSerializer" class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
    <bean id="hashKeySerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    <bean id="hashValueSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>

    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
            p:connectionFactory-ref="jedisConnectionFactory"
            p:keySerializer-ref="keySerializer"
            p:valueSerializer-ref="valueSerializer"
            p:enableTransactionSupport="false"
            p:hashKeySerializer-ref="hashKeySerializer"
            p:hashValueSerializer-ref="hashValueSerializer"/>
</beans>

三、在spring的配置文件中引入redis.xml

<import resource="classpath*:spring/redis.xml" />

四、編寫dao層

public abstract class RedisGeneratorDao<K extends Serializable, V extends Serializable> {

    @Autowired
    protected RedisTemplate<K, V> redisTemplate;

    public void setRedisTemplate(RedisTemplate<K, V> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    /**
     * 獲取 RedisSerializer
     */
    protected RedisSerializer<String> getRedisSerializer() {
        return redisTemplate.getStringSerializer();
    }

}

 

public interface MemberDao {
    public boolean add(final Member member);

    public boolean add(final List<Member> list);

    public void delete(String key);

    public void delete(List<String> keys);

    public boolean update(final Member member);

    public Member get(final String keyId);

    public void deleteStr(String key);
}

 

import org.burning.sport.redis.model.Member;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Repository;
import org.springframework.util.Assert;

import java.util.ArrayList;
import java.util.List;

@Repository("memberDao")
public class MemberDaoImpl extends RedisGeneratorDao<String, Member> implements MemberDao {

    /**
     * 添加對象
     * @param member
     * @return
     */
    @Override
    public boolean add(final Member member) {
        Boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {

            @Override
            public Boolean doInRedis(RedisConnection redisConnection) throws DataAccessException {
                RedisSerializer<String> serializer = getRedisSerializer();
                byte[] key = serializer.serialize(member.getId());
                byte[] name = serializer.serialize(member.getNickname());
                return redisConnection.setNX(key, name);
            }
        });
        return result;
    }


    /**
     * 添加集合
     * @param list
     * @return
     */
    @Override
    public boolean add(final List<Member> list) {
        Assert.notEmpty(list);
        Boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
            @Override
            public Boolean doInRedis(RedisConnection redisConnection) throws DataAccessException {
                RedisSerializer<String> serializer = getRedisSerializer();
                for(Member member : list) {
                    byte[] key = serializer.serialize(member.getId());
                    byte[] name = serializer.serialize(member.getNickname());
                    return redisConnection.setNX(key, name);
                }

                return true;
            }
        }, false, true);
        return false;
    }

    /**
     * 刪除對象 ,依賴key
     * @param key
     */
    @Override
    public void delete(String key) {
        List<String> list = new ArrayList<String>();
        list.add(key);
        delete(list);
    }

    /**
     * 刪除字元串
     * @param key
     */
    @Override
    public void deleteStr(String key) {
        redisTemplate.delete(key);
    }

    /**
     * 刪除集合 ,依賴key集合
     * @param keys
     */
    @Override
    public void delete(List<String> keys) {
        redisTemplate.delete(keys);
    }

    /**
     * 修改對象
     * @param member
     * @return
     */
    @Override
    public boolean update(final Member member) {
        String key = member.getId();
        if(get(key) == null) {
            throw new NullPointerException("數據行不存在, key = " + key);
        }

        Boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
            @Override
            public Boolean doInRedis(RedisConnection redisConnection) throws DataAccessException {
                RedisSerializer<String> serializer = getRedisSerializer();
                byte[] key = serializer.serialize(member.getId());
                byte[] value = serializer.serialize(member.getNickname());
                redisConnection.setNX(key, value);
                return true;
            }
        });
        return result;
    }

    /**
     * 根據key獲取對象
     * @param keyId
     * @return
     */
    @Override
    public Member get(final String keyId) {
        Member result = redisTemplate.execute(new RedisCallback<Member>() {
            @Override
            public Member doInRedis(RedisConnection redisConnection) throws DataAccessException {
                RedisSerializer<String> serializer = getRedisSerializer();
                byte[] key = serializer.serialize(keyId);
                byte[] value = redisConnection.get(key);
                if(value == null) {
                    return null;
                }

                String nickName = serializer.deserialize(value);
                return new Member(keyId, nickName);
            }
        });

        return result;
    }
}

五、編寫service層

public interface MemberService {
    /**
     * 添加對象
     */
    public boolean add(final Member member);

    /**
     * 添加集合
     */
    public boolean add(final List<Member> list);
    /**
     * 刪除對象 ,依賴key
     */
    public void delete(String key);

    /**
     * 刪除字元串,依賴key
     * @param key
     */
    public void deleteStr(String key);
    /**
     * 刪除集合 ,依賴key集合
     */
    public void delete(List<String> keys);

    /**
     * 修改對象
     */
    public boolean update(final Member member);
    /**
     * 根據key獲取對象
     */
    public Member get(final String keyId);

}

 

@Service("memberService")
public class MemberServicefImpl implements MemberService {

    @Autowired
    private MemberDao memberDao;

    @Override
    public boolean add(Member member) {
        return memberDao.add(member);
    }

    @Override
    public boolean add(List<Member> list) {
        return memberDao.add(list);
    }

    @Override
    public void delete(String key) {
        memberDao.delete(key);
    }

    @Override
    public void deleteStr(String key) {
        memberDao.deleteStr(key);
    }

    @Override
    public void delete(List<String> keys) {
        memberDao.delete(keys);
    }

    @Override
    public boolean update(Member member) {
        return memberDao.update(member);
    }

    @Override
    public Member get(String keyId) {
        return memberDao.get(keyId);
    }
}

六、寫測試類進行測試

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:applicationContext.xml"})
public class RedisTest {

    @Autowired
    private MemberService memberService;

    @Test
    public void redisAddMember() {
        Member member = new Member();
        member.setId("1");
        member.setNickname("ls");

        memberService.add(member);
    }

    @Test
    public void redisDeleteStr() {
        memberService.deleteStr("1");
    }

}

哨兵模式(sentinel)

就一個配置文件獨特一點 redis-sentinel.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <!--redis 哨兵模式(sentinel) 配置-->
    <bean id="redisSentinelConfiguration" class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
        <property name="master">
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <property name="name" value="mymaster" />
            </bean>
        </property>
        <property name="sentinels">
            <set>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg index="0" value="10.6.1**.**6" /><!--ip-->
                    <constructor-arg index="1" value="9980" /><!--port-->
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg index="0" value="10.6.1**.**4" /><!--ip-->
                    <constructor-arg index="1" value="9980" /><!--port-->
                </bean>
            </set>
        </property>
    </bean>

    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <constructor-arg ref="redisSentinelConfiguration"/>
    </bean>

    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" value="jedisConnectionFactory" />
    </bean>
</beans>

https://gitee.com/play-happy/base-project


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

-Advertisement-
Play Games
更多相關文章
  • MongoDB 極簡實踐入門 ===================== 1. 為什麼用MongoDB? 傳統的電腦應用大多使用關係型資料庫來存儲數據,比如大家可能熟悉的MySql, Sqlite等等,它的特點是數據以表格(table)的形式儲存起來的。資料庫由一張張排列整齊的表格構成,就好像一個 ...
  • Python進行KMeans聚類是比較簡單的,首先需要import numpy,從sklearn.cluster中import KMeans模塊: 然後讀取txt文件,獲取相應的數據並轉換成numpy array: 設置類的數量,並聚類: 完整代碼: 運行結果: ...
  • 事務的性質: 原子性:同一個事務中的所有操作要不然全部成功要不然全部失敗 一致性:一致性是指事務必須使資料庫從一個一致性狀態變換到另一個一致性狀態,,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。 隔離性:隔離性是當多個用戶併發訪問資料庫時,比如操作同一張表時,資料庫為每一個用戶開啟的事務 ...
  • #系統表 --查詢某類表中,某個欄位有哪些分佈 select * from user_tab_cols a where a.TABLE_NAME like '%TBL%' and a.COLUMN_NAME like '%CLEAR%' #分區 --分區表有哪些 SELECT * FROM useR ...
  • 1.什麼是資料庫? 資料庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,長期儲存在電腦內、有組織的、可共用的數據集合。 資料庫中的數據指的是以一定的數據模型組織、描述和儲存在一起、具有儘可能小的冗餘度、較高的數據獨立性和易擴展性的特點並可在一定範圍內為多個用戶共用。 2.主要特點 ...
  • --表變數 update invent set goodInfo=null declare @tmp_goods table( gno char(5) ) insert into @tmp_goods select gno from invent group by gno declare @gno ... ...
  • Success loading Mysql Driver!Mon Apr 04 15:43:00 CST 2016 WARN: Establishing SSL connection without server‘s identity verification is not recommended. ...
  • 環境: Linux js代碼: 迴圈刪除表中的數據: clear-mongodb-dialog.js 執行: --quiet 參數代表靜默執行,不會列印log等。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...