欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring Boot 基于注解的 Redis 缓存使用详解

程序员文章站 2024-02-21 09:10:58
看文本之前,请先确定你看过上一篇文章《spring boot redis 集成配置》并保证 redis 集成后正常可用,因为本文是基于上文继续增加的代码。 一、创建 ca...

看文本之前,请先确定你看过上一篇文章《spring boot redis 集成配置》并保证 redis 集成后正常可用,因为本文是基于上文继续增加的代码。

一、创建 caching 配置类

rediskeys.java

package com.shanhy.example.redis;

import java.util.hashmap;
import java.util.map;

import javax.annotation.postconstruct;

import org.springframework.stereotype.component;

/**
 * 方法缓存key常量
 * 
 * @author shanhy
 */
@component
public class rediskeys {

  // 测试 begin
  public static final string _cache_test = "_cache_test";// 缓存key
  public static final long _cache_test_second = 20l;// 缓存时间
  // 测试 end

  // 根据key设定具体的缓存时间
  private map<string, long> expiresmap = null;

  @postconstruct
  public void init(){
    expiresmap = new hashmap<>();
    expiresmap.put(_cache_test, _cache_test_second);
  }

  public map<string, long> getexpiresmap(){
    return this.expiresmap;
  }
}

cachingconfig.java

package com.shanhy.example.redis;

import java.lang.reflect.method;
import java.util.arraylist;
import java.util.list;

import org.springframework.cache.cachemanager;
import org.springframework.cache.annotation.cachingconfigurersupport;
import org.springframework.cache.annotation.enablecaching;
import org.springframework.cache.interceptor.keygenerator;
import org.springframework.cache.interceptor.simplekeygenerator;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.data.redis.cache.rediscachemanager;
import org.springframework.data.redis.core.redistemplate;

/**
 * 注解式环境管理
 * 
 * @author 单红宇(csdn catoop)
 * @create 2016年9月12日
 */
@configuration
@enablecaching
public class cachingconfig extends cachingconfigurersupport {

  /**
   * 在使用@cacheable时,如果不指定key,则使用找个默认的key生成器生成的key
   *
   * @return
   * 
   * @author 单红宇(csdn catoop)
   * @create 2017年3月11日
   */
  @override
  public keygenerator keygenerator() {
    return new simplekeygenerator() {

      /**
       * 对参数进行拼接后md5
       */
      @override
      public object generate(object target, method method, object... params) {
        stringbuilder sb = new stringbuilder();
        sb.append(target.getclass().getname());
        sb.append(".").append(method.getname());

        stringbuilder paramssb = new stringbuilder();
        for (object param : params) {
          // 如果不指定,默认生成包含到键值中
          if (param != null) {
            paramssb.append(param.tostring());
          }
        }

        if (paramssb.length() > 0) {
          sb.append("_").append(paramssb);
        }
        return sb.tostring();
      }

    };

  }

  /**
   * 管理缓存
   *
   * @param redistemplate
   * @return
   */
  @bean
  public cachemanager cachemanager(redistemplate<string, object> redistemplate, rediskeys rediskeys) {
    rediscachemanager rcm = new rediscachemanager(redistemplate);
    // 设置缓存默认过期时间(全局的)
    rcm.setdefaultexpiration(1800);// 30分钟

    // 根据key设定具体的缓存时间,key统一放在常量类rediskeys中
    rcm.setexpires(rediskeys.getexpiresmap());

    list<string> cachenames = new arraylist<string>(rediskeys.getexpiresmap().keyset());
    rcm.setcachenames(cachenames);

    return rcm;
  }

}

二、创建需要缓存数据的类

testservice.java

package com.shanhy.example.service;

import org.apache.commons.lang3.randomstringutils;
import org.springframework.cache.annotation.cacheable;
import org.springframework.stereotype.service;

import com.shanhy.example.redis.rediskeys;

@service
public class testservice {

  /**
   * 固定key
   *
   * @return
   * @author shanhy
   * @create 2017年4月9日
   */
  @cacheable(value = rediskeys._cache_test, key = "'" + rediskeys._cache_test + "'")
  public string testcache() {
    return randomstringutils.randomnumeric(4);
  }

  /**
   * 存储在redis中的key自动生成,生成规则详见cachingconfig.keygenerator()方法
   *
   * @param str1
   * @param str2
   * @return
   * @author shanhy
   * @create 2017年4月9日
   */
  @cacheable(value = rediskeys._cache_test)
  public string testcache2(string str1, string str2) {
    return randomstringutils.randomnumeric(4);
  }
}

说明一下,其中 @cacheable 中的 value 值是在 cachingconfig的cachemanager 中配置的,那里是为了配置我们的缓存有效时间。其中 methodkeygenerator 为 cachingconfig 中声明的 keygenerator。

另外,cache 相关的注解还有几个,大家可以了解下,不过我们常用的就是 @cacheable,一般情况也可以满足我们的大部分需求了。还有 @cacheable 也可以配置表达式根据我们传递的参数值判断是否需要缓存。

注: testservice 中 testcache 中的 mapper.get 大家不用关心,这里面我只是访问了一下数据库而已,你只需要在这里做自己的业务代码即可。

三、测试方法

下面代码,随便放一个 controller 中

package com.shanhy.example.controller;

import org.slf4j.logger;
import org.slf4j.loggerfactory;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.data.redis.connection.jedis.redisclient;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.restcontroller;

import com.shanhy.example.service.testservice;

/**
 * 测试controller
 * 
 * @author 单红宇(365384722)
 * @create 2017年4月9日
 */
@restcontroller
@requestmapping("/test")
public class testcontroller {

  private static final logger log = loggerfactory.getlogger(testcontroller.class);

  @autowired
  private redisclient redisclient;

  @autowired
  private testservice testservice;

  @getmapping("/rediscache")
  public string rediscache() {
    redisclient.set("shanhy", "hello,shanhy", 100);
    log.info("getredisvalue = {}", redisclient.get("shanhy"));
    testservice.testcache2("aaa", "bbb");
    return testservice.testcache();
  }
}

至此完毕!

最后说一下,这个 @cacheable 基本是可以放在所有方法上的,controller 的方法上也是可以的(这个我没有测试 ^_^)。

源码下载地址:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。