溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

利用spring-data-redis如何將redis集成到spring項目中

發(fā)布時間:2020-11-25 17:04:55 來源:億速云 閱讀:405 作者:Leah 欄目:編程語言

利用spring-data-redis如何將redis集成到spring項目中?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

Redis 做為基于內(nèi)存的 Key-Value 數(shù)據(jù)庫,用來做緩存服務(wù)器性價比相當(dāng)高。

官方推出的面向 Java 的 Client Jedis,提供了很多接口和方法,可以讓 Java 操作使用 Redis。

Spring Data Redis 為 Spring 團(tuán)隊對 Jedis 進(jìn)行了封裝,集成 Jedis 的一些命令和方法。

1. 添加項目依賴

    <!--redis 緩存-->
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-redis</artifactId>
      <version>1.8.4.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.9.0</version>
    </dependency>

2. 添加 spring-redis-context 配置

<&#63;xml version="1.0" encoding="UTF-8"&#63;>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
  <description>redis 相關(guān)類 Spring 托管</description>

  <!--載入 redis 配置文件-->
  <context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true"/>

  <!-- 配置 JedisPoolConfig 實例 -->
  <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <property name="maxIdle" value="${redis.maxIdle}"/>
    <property name="maxTotal" value="${redis.maxActive}"/>
    <property name="maxWaitMillis" value="${redis.maxWait}"/>
    <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
  </bean>

  <!-- 配置JedisConnectionFactory -->
  <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <property name="hostName" value="${redis.host}"/>
    <property name="port" value="${redis.port}"/>
    <property name="password" value="${redis.pass}"/>
    <property name="database" value="${redis.dbIndex}"/>
    <property name="poolConfig" ref="poolConfig"/>
  </bean>

  <!-- 配置RedisTemplate -->
  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
    <property name="connectionFactory" ref="jedisConnectionFactory"/>
  </bean>

  <!-- 配置RedisCacheManager -->
  <bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
    <constructor-arg name="redisOperations" ref="redisTemplate"/>
    <property name="defaultExpiration" value="${redis.expiration}"/>
  </bean>

  <!-- 配置RedisCacheConfig -->
  <bean id="redisCacheConfig" class="com.rambo.sdh.common.util.RedisCacheConfig">
    <constructor-arg ref="jedisConnectionFactory"/>
    <constructor-arg ref="redisTemplate"/>
    <constructor-arg ref="redisCacheManager"/>
  </bean>
</beans>

JedisConnectionFactory 為 Jedis 連接工廠,配置由單獨抽象的 JedisPoolConfig 提供。

如果你熟悉 Spring 的 JdbcTemplate 對象的話,這里大概能猜出來 RedisTemplate 的作用,RedisTemplate 對 RedisConnection 進(jìn)行了封裝。

提供連接管理,序列化等功能,它對 Redis 的交互進(jìn)行了更高層次的抽象,極大的方便和簡化了 Redis 的操作。

RedisCacheManager 做為 redis 統(tǒng)一的調(diào)度和管理者,有興趣可以反編譯源碼看看。

繼承自 org.springframework.cache.transaction.AbstractTransactionSupportingCacheManager 并實現(xiàn) org.springframework.cache.CacheManager。

3. 添加 redis.properties

#============================#
#==== Redis settings ====#
#============================#
#redis 服務(wù)器 IP
redis.host=127.0.0.1

#redis 服務(wù)器端口
redis.port=6379

#redis 密碼
redis.pass=redis#2017

#redis 支持16個數(shù)據(jù)庫(相當(dāng)于不同用戶)可以使不同的應(yīng)用程序數(shù)據(jù)彼此分開同時又存儲在相同的實例上
redis.dbIndex=0

#redis 緩存數(shù)據(jù)過期時間單位秒
redis.expiration=3000

#控制一個 pool 最多有多少個狀態(tài)為 idle 的jedis實例
redis.maxIdle=300

#控制一個 pool 可分配多少個jedis實例
redis.maxActive=600

#當(dāng)borrow一個jedis實例時,最大的等待時間,如果超過等待時間,則直接拋出JedisConnectionException;
redis.maxWait=1000

#在borrow一個jedis實例時,是否提前進(jìn)行alidate操作;如果為true,則得到的jedis實例均是可用的;
redis.testOnBorrow=true

當(dāng)然配置文件你也可以硬編碼到程序中,只是在參數(shù)發(fā)生改變的時候比較痛苦一點而已。

其中大部分配置項都是圍繞著 jedisPool ,如果你對數(shù)據(jù)庫連接池比較熟,你會發(fā)現(xiàn)它倆的配置項有點相似。

當(dāng)系統(tǒng) redis 遇到問題出現(xiàn)故障時,理解這里的選項是個不錯的選擇。

4. 編寫自定義 redis 配置類

@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport {
  protected final static Logger log = LoggerFactory.getLogger(RedisCacheConfig.class);

  private volatile JedisConnectionFactory mJedisConnectionFactory;
  private volatile RedisTemplate<String, String> mRedisTemplate;
  private volatile RedisCacheManager mRedisCacheManager;

  public RedisCacheConfig() {
    super();
  }

  public RedisCacheConfig(JedisConnectionFactory mJedisConnectionFactory, RedisTemplate<String, String> mRedisTemplate, RedisCacheManager mRedisCacheManager) {
    super();
    this.mJedisConnectionFactory = mJedisConnectionFactory;
    this.mRedisTemplate = mRedisTemplate;
    this.mRedisCacheManager = mRedisCacheManager;
  }

  public JedisConnectionFactory redisConnectionFactory() {
    return mJedisConnectionFactory;
  }

  public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
    return mRedisTemplate;
  }

  public CacheManager cacheManager(RedisTemplate<&#63;, &#63;> redisTemplate) {
    return mRedisCacheManager;
  }

  @Bean
  public KeyGenerator keyGenerator() {
    return new KeyGenerator() {
      @Override
      public Object generate(Object o, Method method, Object... objects) {
        StringBuilder sb = new StringBuilder();
        sb.append(o.getClass().getName());
        sb.append(method.getName());
        for (Object obj : objects) {
          sb.append(obj.toString());
        }
        return sb.toString();
      }
    };
  }
}

該配置類繼承自 org.springframework.cache.annotation.CachingConfigurerSupport 并實現(xiàn) org.springframework.cache.annotation.CachingConfigurer 的方法。

通俗一點,該類告訴 spring 當(dāng)前使用的緩存服務(wù)為 redis 并自定義了緩存 key 生成的規(guī)則。

5. 在你喜歡的地方進(jìn)行注解緩存

利用spring-data-redis如何將redis集成到spring項目中

緩存一般使用在服務(wù)層,在你想緩存的方法上面添加相應(yīng)的注解即可,下面三個緩存的注解你得掌握。

@Cacheable  spring 會在其被調(diào)用后將返回值緩存起來,以保證下次利用同樣的參數(shù)來執(zhí)行該方法時可以直接從緩存中獲取結(jié)果,而不需要再次執(zhí)行該方法。

@CachePut  標(biāo)注的方法在執(zhí)行前不會去檢查緩存中是否存在之前執(zhí)行過的結(jié)果,而是每次都會執(zhí)行該方法,并將執(zhí)行結(jié)果以鍵值對的形式存入指定的緩存中。

@CacheEvict 用來標(biāo)注在需要清除緩存元素的方法或類上的。

當(dāng)然這些注解里面還有很多其他的屬性配置,配合 spring-el 表達(dá)式能做的事情還有很多,大概只有你想不到,沒有做不到。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI