SpringBoot快速上手——《四》:SpringBoot 集成Redis +SpringCache做緩存

SpringBoot 集成Redis +SpringCache做緩存

一.給user加緩存

1.首先創(chuàng)建springboot-redis-cache模塊,并把springboot-restful-api的內容復制過來秧了。

2.修改三層架構坦敌,即加service層

添加service.UserService接口欺冀,再創(chuàng)建實現(xiàn)類service.impl.UserServiceimpl贮庞,記得實現(xiàn)類要加上@Service注解蹄葱。并實現(xiàn)user的增刪改查功能氏义。同時將Controller的調用改成UserService。

3.加入redis cache pool等依賴

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
    </dependency>
    

4.配置redis

server:
  port: 8090

# 掃描mapper.xml文件
mybatis:
  mapper-locations:
    - classpath:mapping/*.xml
spring:
  application:
    name: springboot-ssm
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/springboot?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: 123zxc
  redis:
    host: 127.0.0.1
    port: 6379
    password: 123zxc
    database: 0
    lettuce:
      pool:
        max-active: 32
        max-wait: 300ms
        max-idle: 16
        min-idle: 8
        

5.啟動類加上@EnableCaching注解

6.Service加緩存

@Service
public class UserServiceImpl implements UserService {

    private Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);

    @Resource
    private UserMapper userMapper;

    @Override
    @Cacheable(value = "user:id",key = "#id")
    public User getOneUser(int id) {
        logger.info("get one go mysql ...");
        return userMapper.selectByPrimaryKey(id);
    }

    @Cacheable(value = "user:list")
    @Override
    public List<User> findAll() {
        logger.info("find all go mysql ...");
        return userMapper.list();
    }

    @CacheEvict(value = "user:list",allEntries = true)
    @Override
    public int add(User user) {
        return userMapper.insert(user);
    }

    @Caching(
            evict = {
                    @CacheEvict(value = "user:id", key = "#user.id"),
                    @CacheEvict(value = "user:list", allEntries = true)
            }
    )
    @Override
    public int update(User user) {
        return userMapper.updateByPrimaryKey(user);
    }

    @Caching(
            evict = {
                    @CacheEvict(value = "user:id", key = "#id"),
                    @CacheEvict(value = "user:list", allEntries = true)
            }
    )
    @Override
    public int delete(int id) {
        return delete(id);
    }
}

以上SpringBoot默認對redis 的配置图云,如果我們想修改redis的配置惯悠,如序列化方式、默認過期時間等等竣况。則需要我們創(chuàng)建RedisConfig.java配置類克婶。

二.手動配置RedisConfig.java

具體配置如下,其中一個是操作redis 的RedisTemplate,一個是緩存使用的CacheManager,其中修改了序列化方式情萤,所以要把原來的緩存清空鸭蛙。

@Component
@Configuration
@ConfigurationProperties("spring.cache.redis")
public class RedisConfig extends CachingConfigurerSupport {
    private Duration timeToLive = Duration.ofMinutes(30);

    public void setTimeToLive(Duration timeToLive) {
        this.timeToLive = timeToLive;
    }


    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        //解決查詢緩存轉換異常的問題
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        // 配置序列化(解決亂碼的問題)
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(timeToLive)
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();

        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }

    //RedisTemplate配置
    @Bean
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);
        //配置事務
        template.setEnableTransactionSupport(true);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

}

二.SpringBoot如何操作Redis

Springboot 操作redis引入的依賴可以不用引入

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

1.說明

SpringBoot Redis提供一個強大的模版操作redis,它就是RedisTemplate筋岛,使用它可以很方便的操作redis 的五大數(shù)據(jù)類型娶视。下面我們寫一個測試類使用RedisTemplate的相關API。

首先把引入spring-boot-starter-test依賴泉蝌,同時去掉junit依賴歇万,否則會報錯!

2.添加RedisTemplateTest

在test/java/xyz.java1024 下創(chuàng)建RedisTemplateTest測試類勋陪,加上@RunWith(SpringRunner.class)
@SpringBootTest(classes = RedisApp.class)注解贪磺,指定啟動類作用是讀取配置信息。具體代碼如下:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = RedisApp.class)
public class RedisTemplateTest {

    @Resource
    private RedisTemplate redisTemplate;

    /**
     *
     * 介紹 如何使用 redisTemplate 操作String List Set ZSet Hash五種數(shù)據(jù)類型
     * 本測試只 使用了部分常用的 api诅愚,如在集合等復雜數(shù)據(jù)類型 有更多的api 實現(xiàn)更加強大的功能寒锚,查閱相關文檔即可!
     *
     */

    /**
     * String 類型set
     */
    @Test
    public void testSet() {
        redisTemplate.opsForValue().set("test","this is test");
    }

    /**
     * String 類型get
     */
    @Test
    public void testGet() {
        Object test = redisTemplate.opsForValue().get("test");
        System.out.println("test = " + test);
    }

    /**
     * 添加元素
     */
    @Test
    public void testLSet() {
        redisTemplate.opsForList().leftPush("testList","testList1");
    }

    /**
     * 獲取List 的所有元素
     */
    @Test
    public void testLGet() {
        List testList = redisTemplate.opsForList().range("testList", 0, -1);
        System.out.println("testList = " + testList);
    }

    /**
     * Set類型 set
     */
    @Test
    public void testSSet() {
        redisTemplate.opsForSet().add("testSet","testSet1");
    }

    /**
     * Set 類型get
     */
    @Test
    public void testSGet() {
        Set testSet = redisTemplate.opsForSet().members("testSet");
        System.out.println("testSet = " + testSet);
    }

    /**
     * hash set
     */
    @Test
    public void testHSet() {

        redisTemplate.opsForHash().put("testHash","value1","key1");
        redisTemplate.opsForHash().put("testHash","value2","key2");
    }

    /**
     * hash get
     */
    @Test
    public void testHget() {
        Object o = redisTemplate.opsForHash().get("testHash", "value1");
        System.out.println("o = " + o);
    }

    /**
     * Zset set
     */
    @Test
    public void testZSet() {
        redisTemplate.opsForZSet().add("java1024","SpringBoot",10);
        redisTemplate.opsForZSet().add("java1024","SpringCloud",3);
    }

    /**
     * Zset get
     */
    @Test
    public void testZGet() {

        // 正序
        Set all = redisTemplate.opsForZSet().range("java1024", 0, -1);
        System.out.println("all = " + all);

        //反序
        Set reverseRange = redisTemplate.opsForZSet().reverseRange("java1024", 0, -1);
        System.out.println("reverseRange = " + reverseRange);
    }
}

總結

操作Redis不依賴SpringCache违孝,實現(xiàn)SpringCache也不止Redis刹前,也可以用ehCache做緩存!只是現(xiàn)在主流還是用Redis做緩存雌桑。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末喇喉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子校坑,更是在濱河造成了極大的恐慌拣技,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耍目,死亡現(xiàn)場離奇詭異膏斤,居然都是意外死亡,警方通過查閱死者的電腦和手機邪驮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門莫辨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人毅访,你說我怎么就攤上這事沮榜。” “怎么了喻粹?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵敞映,是天一觀的道長。 經常有香客問我磷斧,道長振愿,這世上最難降的妖魔是什么捷犹? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮冕末,結果婚禮上萍歉,老公的妹妹穿的比我還像新娘。我一直安慰自己档桃,他們只是感情好枪孩,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著藻肄,像睡著了一般蔑舞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嘹屯,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天攻询,我揣著相機與錄音,去河邊找鬼州弟。 笑死钧栖,一個胖子當著我的面吹牛,可吹牛的內容都是我干的婆翔。 我是一名探鬼主播拯杠,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼啃奴!你這毒婦竟也來了潭陪?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤最蕾,失蹤者是張志新(化名)和其女友劉穎依溯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揖膜,經...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡誓沸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年梅桩,在試婚紗的時候發(fā)現(xiàn)自己被綠了壹粟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡宿百,死狀恐怖趁仙,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情垦页,我是刑警寧澤雀费,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站痊焊,受9級特大地震影響盏袄,放射性物質發(fā)生泄漏忿峻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一辕羽、第九天 我趴在偏房一處隱蔽的房頂上張望逛尚。 院中可真熱鬧,春花似錦刁愿、人聲如沸绰寞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滤钱。三九已至,卻和暖如春脑题,著一層夾襖步出監(jiān)牢的瞬間件缸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工旭蠕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留停团,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓掏熬,卻偏偏與公主長得像佑稠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子旗芬,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內容