最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Spring Data Redis實現(xiàn)數據緩存的方法

 更新時間:2018年11月02日 14:17:46   作者:JavaQ  
目前在系統(tǒng)架構設計中使用Redis實現(xiàn)緩存,這篇文章主要介紹了使用Spring Data Redis實現(xiàn)數據緩存的方法,具有一定的參考價值,需要的朋友可以參考下

引言

目前很多系統(tǒng)為了解決數據讀寫的性能瓶頸,在系統(tǒng)架構設計中使用Redis實現(xiàn)緩存,Spring框架為了讓開發(fā)人員更加方便快捷的使用Redis實現(xiàn)緩存,對Redis的操作進行了包裝。

0.緩存

個人理解的緩存是指用于存儲頻繁使用的數據的空間,關注點是存儲數據的空間和使用頻繁的數據。緩存技術,簡單的說就是先從緩存中查詢數據是否存在,存在則直接返回,不存在再執(zhí)行相應的操作獲取數據,并將獲取的數據存儲到緩存中,它是一種提升系統(tǒng)性能的重要方法。

1.Redis

Redis是一個開源的、內存存儲key-value類型的數據結構服務器,可用作數據庫、高速緩存和消息隊列代理。它支持的數據類型有字符串、哈希表、列表、集合、有序集合等,同時通過Redis Sentinel提供高可用,通過Redis Cluster提供分區(qū)功能。

2.jedis

jedis是Redis的Java版客戶端實現(xiàn),也是官方推薦的Java版客戶端。它封裝了對Redis的各種操作,并且支持事務、管道及有jedis自身實現(xiàn)的分布式。

3.Spring Data Redis

Spring Data是Spring框架中的一個主要項目,目的是為了簡化構建基于Spring框架應用的數據訪問,包括非關系數據庫、Map-Reduce框架、云數據服務等,另外也包含對關系數據庫的訪問支持。
Spring Data Redis是Spring Data項目中的一個主要模塊,實現(xiàn)了對jedis客戶端API的高度封裝,使對Redis的操作更加便捷。

4.關系圖

Redis、jedis、Spring Data Redis三者之間的關系圖如下所示。


5.Spring Cache

從Spring3.1開始,Spring框架提供了對Cache的支持,提供了一個對緩存使用的抽象,通過在既有代碼中添加少量它定義的各種 annotation,即能夠達到緩存方法的返回對象的作用。提供的主要注解有@Cacheable、@CachePut、@CacheEvict和@Caching,具體見表1。

@Cacheable的常用屬性及說明如表2所示。



@CacheEvict的常用屬性見表4。@CachePut的常用屬性同@Cacheable。


當需要在類上或方法上同時使用多個注解時,可以使用@Caching,如@Caching(cacheable = @Cacheable("User"), evict = {@CacheEvict("Member"), @CacheEvict(value = "Customer", allEntries = true)})

6.使用示例

下面使用Spring Data Reds、Redis和jedis實現(xiàn)一個簡單的數據緩存。

1)依賴配置

示例使用了gradle,所以需要在build.gradle中加入如下依賴配置來管理所需要的jar。

compile "org.springframework.data:spring-data-redis:1.7.2.RELEASE"
compile "redis.clients:jedis:2.7.2"
testCompile "junit:junit:4.12"

2)Redis配置

示例連接的是本地的Redis,redis.properties配置如下。

# Redis settings
redis.host=127.0.0.1
redis.port=6379
redis.pass=
redis.dbIndex=0
redis.expiration=3000
redis.maxIdle=300
redis.maxActive=600
redis.maxWait=1000
redis.testOnBorrow=true

3)Spring配置

Spring的配置文件如下。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:cache="http://www.springframework.org/schema/cache"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
  <context:component-scan base-package="redis.cache"/>
  <context:annotation-config/>
  <cache:annotation-driven cache-manager="redisCacheManager"/>
  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
      <list>
        <value>classpath:redis.properties</value>
      </list>
    </property>
  </bean>
  <!-- 配置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>
</beans>

4)Service

示例代碼的Servicer如下。

@Service("userService")
public class UserService {
  @Cacheable(value = "User", key = "'UserId_' + #id",condition = "#id<=110")
  public String queryFullNameById(long id) {
    System.out.println("execute queryFullNameById method");
    return "ZhangSanFeng";
  }

  @CacheEvict(value = "User", key = "'UserId_' + #id")
  public void deleteById(long id) {
    System.out.println("execute deleteById method");
  }

  @CachePut(value = "User", key = "'UserId_' + #id")
  public String modifyFullNameById(long id, String newName) {
    System.out.println("execute modifyFullNameById method");
    return newName;
  }
}

5)測試

  @Test
  public void test() {
    ApplicationContext context = new ClassPathXmlApplicationContext("redisCacheContext.xml");
    UserService userService = (UserService) context.getBean("userService");
    System.out.println("第一次執(zhí)行查詢:" + userService.queryFullNameById(110L));
    System.out.println("----------------------------------");

    System.out.println("第二次執(zhí)行查詢:" + userService.queryFullNameById(110L));
    System.out.println("----------------------------------");

    userService.deleteById(110L);
    System.out.println("----------------------------------");

    System.out.println("清除緩存后查詢:" + userService.queryFullNameById(110L));
    System.out.println("----------------------------------");

    System.out.println(userService.modifyFullNameById(110L, "ZhangJunBao"));
    System.out.println("----------------------------------");

    System.out.println("修改數據后查詢:" + userService.queryFullNameById(110L));
    System.out.println("----------------------------------");

    System.out.println("第一次執(zhí)行查詢:" + userService.queryFullNameById(112L));
    System.out.println("----------------------------------");

    System.out.println("第二次執(zhí)行查詢:" + userService.queryFullNameById(112L));
    System.out.println("----------------------------------");
  }

6)測試結果

輸出結果如下。

execute queryFullNameById method
第一次執(zhí)行查詢:ZhangSanFeng
----------------------------------
第二次執(zhí)行查詢:ZhangSanFeng
----------------------------------
execute deleteById method
----------------------------------
execute queryFullNameById method
清除緩存后查詢:ZhangSanFeng
----------------------------------
execute modifyFullNameById method
ZhangJunBao
----------------------------------
修改數據后查詢:ZhangJunBao
----------------------------------
execute queryFullNameById method
第一次執(zhí)行查詢:ZhangSanFeng
----------------------------------
execute queryFullNameById method
第二次執(zhí)行查詢:ZhangSanFeng
----------------------------------

從結果可以看到,使用緩存后,第二次查詢沒有執(zhí)行查詢方法體,直接返回了緩存中的數據;清除緩存后,再次查詢就執(zhí)行了查詢方法體;修改數據后,相應的緩存數據也被修改了;不符合緩存條件的數據沒有被緩存。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 關于spring的自定義緩存注解分析

    關于spring的自定義緩存注解分析

    這篇文章主要介紹了關于spring的自定義緩存注解分析,因為所有的key的失效時間都一樣,要想實現(xiàn)不同的key不同的失效時間,就得需要自定義緩存注解,需要的朋友可以參考下
    2023-05-05
  • intellij idea旗艦版解決學生無法注冊問題詳解

    intellij idea旗艦版解決學生無法注冊問題詳解

    這篇文章主要介紹了intellij idea旗艦版解決學生無法注冊問題詳解,文中通過圖文示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • SpringBoot集成RocketMQ的使用示例

    SpringBoot集成RocketMQ的使用示例

    RocketMQ是阿里巴巴開源的一款消息中間件,性能優(yōu)秀,功能齊全,被廣泛應用在各種業(yè)務場景,本文就來介紹一下SpringBoot集成RocketMQ的使用示例,感興趣的可以了解一下
    2023-11-11
  • TreeSet判斷重復元素解析及代碼示例

    TreeSet判斷重復元素解析及代碼示例

    這篇文章主要介紹了TreeSet判斷重復元素解析及代碼示例,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 詳解Java基礎知識——JDBC

    詳解Java基礎知識——JDBC

    這篇文章主要介紹了Java基礎知識——JDBC,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 深入Java萬物之母Object類詳情

    深入Java萬物之母Object類詳情

    這篇文章主要介紹了Java萬物之母Object類詳情,Object類,它是所有類的默認父類 ,子類不用使用extends關鍵字繼承它,不管是JDK中的類,還是自定義的類
    2022-06-06
  • RabbitMQ死信機制實現(xiàn)延遲隊列的實戰(zhàn)

    RabbitMQ死信機制實現(xiàn)延遲隊列的實戰(zhàn)

    本文主要介紹了RabbitMQ死信機制實現(xiàn)延遲隊列的實戰(zhàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 新手易懂的Java客戶管理小項目

    新手易懂的Java客戶管理小項目

    本篇文章是作為一個很適合新手閱讀的初級小項目,客戶管理,它主要實現(xiàn)數據庫的增刪查改操作,管理每位客戶的不同信息,如果你也是開始學Java不久,這篇文章將很適合你
    2021-11-11
  • javaweb上傳下載實例完整版解析(上)

    javaweb上傳下載實例完整版解析(上)

    這篇文章主要為大家詳細解析了javaweb上傳下載實例,本文重點在于文件上傳功能的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Java中的形式參數和實際參數案例詳解

    Java中的形式參數和實際參數案例詳解

    這篇文章主要介紹了Java中的形式參數和實際參數,形參和實參間的關系,兩者是在調用的時候進行結合的,通常實參會將取值傳遞給形參,形參去之后進行函數過程運算,然后可能將某些值經過參數或函數符號返回給調用者,需要的朋友可以參考下
    2023-10-10

最新評論

宜丰县| 临清市| 资中县| 乌拉特中旗| 麻阳| 江都市| 社旗县| 铜山县| 山东省| 新龙县| 辽阳县| 青田县| 缙云县| 多伦县| 桃园县| 延吉市| 上思县| 乳源| 二手房| 中江县| 五莲县| 贞丰县| 册亨县| 信宜市| 永川市| 安庆市| 双江| 临城县| 文昌市| 建阳市| 双桥区| 承德县| 纳雍县| 云安县| 鸡西市| 资源县| 巴林左旗| 大连市| 天长市| 历史| 略阳县|