Java实现redis的key生成策略

2022-08-14 11:29:59
   在开发过程中,为了提高访问的效率,不免会用到redis。比如本例子中使用某种条件去查询某种数据,但是每次去数据库中查询速度会很慢,此时可以考虑将第一次查询的结果放到redis缓存中,当第二次查询的时候,直接从redis缓存中取就可以。
redis中事key-value。所以可以考虑将查询条件作为key,所以这里拿查询条件作为key写了个通用的方方,即key的生成策略。当让每个方法都将查询的条件转成字符串这样写也可以,但是抽出来,这样能做到代码的公用,减少冗余代码。
注意要现在启动类中加上启动缓存的注解@EnableCaching
![在这里插入图片描述](https://img-blog.csdnimg.cn/3767ff379d7149ef97768a81a73d54c1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pif56m6MTAyNA==,size_20,color_FFFFFF,t_70,g_se,x_16)
/**
 * @author qiuhongyu
 * @date 2022/4/7 14:46
 */@RestControllerpublicclassDemoController{privateDemoService demoService;@PostMapping("/demo")publicvoiddemo(@RequestBodyQueryInfoRequest queryInfoRequest){
        demoService.getInfo(queryInfoRequest);}}
packagecom.example.leardemo;importorg.springframework.cache.annotation.Cacheable;importorg.springframework.stereotype.Service;/**
 * @author qiuhongyu
 * @date 2022/4/7 14:46
 */@ServicepublicclassDemoService{//将请求参数作为查询的条件, value文件夹名,keyGenerator通过主键生成策略生成redis的主键@Cacheable(value="demo:quest", keyGenerator=DefaultCacheableKeyGenerator.NAME)publicStringgetInfo(QueryInfoRequest queryInfoRequest){//处理业务逻辑,如:从数据库中查询除业务中需要的数据,将页面中需要的数据反给前端returnnull;}}
packagecom.example.leardemo;importorg.springframework.cache.interceptor.KeyGenerator;importorg.springframework.stereotype.Component;importjava.lang.reflect.Method;/**
 * @author qiuhongyu
 * @date 2022/4/7 14:52
 *
 * redis主键生成策略
 *
 */@Component(DefaultCacheableKeyGenerator.NAME)publicclassDefaultCacheableKeyGeneratorimplementsKeyGenerator{//从配置文件中读取application中使用那种环境,dev,sit,prod,便于区分是在哪个环境下,根据自己需求定。//    @Value("${spring.profiles.active}")//    private String active;privateString active;publicstaticfinalString NAME="defaultCacheableKeyGenerator";@OverridepublicObjectgenerate(Object target,Method method,Object... params){//此处一大段可以根据自己的业务需求来,比如还可以添加上一些登录用户的id等信息等等StringBuilder key=newStringBuilder(active);
        key.append(":").append(method.getName());for(Object param: params){if(param!=null){
                key.append(":").append(param.toString());}}return key.toString();}}

查询条件

packagecom.example.leardemo;importlombok.Data;importlombok.ToString;importjava.io.Serializable;/**
 * @author qiuhongyu
 * @date 2022/4/7 14:56
 *
 * 查询条件请求参数
 */@Data@ToStringpublicclassQueryInfoRequestimplementsSerializable{privatestaticfinallong serialVersionUID=8295461128875889050L;/**
     * 性别
     */privateString sex;/**
     * 年龄
     */privateString age;}
// 如果不用抽出来的策略也可以,那么写法就类似下面的这种,key中QueryInfoRequest 要重写toString@Cacheable(value="demo:quest",key="#queryInfoRequest")publicStringgetInfo(QueryInfoRequest queryInfoRequest){}
// 也可以指定对象中的哪个属性作为key@Cacheable(value="demo:quest",key="#queryInfoRequest.age + '':"+ #queryInfoRequest.sex)publicStringgetInfo(QueryInfoRequest queryInfoRequest){//returnnull;}

需要用到的依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--整合spring cache的启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><!--        springboot 整合redis的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--        redis缓存管理器用来序列化和反序列化 缓存内容所使用到的一个依赖--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies>```

配置文件中

server:
  port:8090
spring:
  cache:
    type: REDIS
  redis:
    host: localhost
    jedis:
      pool:
        max-active:10
        max-idle:10
        max-wait:3000ms
        min-idle:20
    port:6379
    timeout:3000ms
    database:0
  • 作者:星空1024
  • 原文链接:https://blog.csdn.net/qq_41934680/article/details/124017121
    更新时间:2022-08-14 11:29:59