Java实现redis的key生成策略

   在开发过程中,为了提高访问的效率,不免会用到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
 */
@RestController
public class DemoController {

    private DemoService demoService;

    @PostMapping("/demo")
    public void  demo(@RequestBody QueryInfoRequest queryInfoRequest) {
        demoService.getInfo(queryInfoRequest);
    }

}

package com.example.leardemo;

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

/**
 * @author qiuhongyu
 * @date 2022/4/7 14:46
 */

@Service
public class DemoService {

    //将请求参数作为查询的条件, value文件夹名,keyGenerator通过主键生成策略生成redis的主键
    @Cacheable(value = "demo:quest", keyGenerator = DefaultCacheableKeyGenerator.NAME)
    public String  getInfo(QueryInfoRequest queryInfoRequest) {

        //处理业务逻辑,如:从数据库中查询除业务中需要的数据,将页面中需要的数据反给前端

        return null;
    }
}


package com.example.leardemo;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * @author qiuhongyu
 * @date 2022/4/7 14:52
 *
 * redis主键生成策略
 *
 */
@Component(DefaultCacheableKeyGenerator.NAME)
public class DefaultCacheableKeyGenerator implements KeyGenerator {
    //从配置文件中读取application中使用那种环境,dev,sit,prod,便于区分是在哪个环境下,根据自己需求定。
//    @Value("${spring.profiles.active}")
//    private String active;

    private String active;

    public static final String NAME = "defaultCacheableKeyGenerator";

    @Override
    public Object generate(Object target, Method method, Object... params) {
        //此处一大段可以根据自己的业务需求来,比如还可以添加上一些登录用户的id等信息等等
        StringBuilder key = new StringBuilder(active);
        key.append(":").append(method.getName());
        for (Object param : params) {
            if(param != null) {
                key.append(":")
                        .append(param.toString());
            }
        }
        return key.toString();
    }
}


查询条件

package com.example.leardemo;

import lombok.Data;
import lombok.ToString;

import java.io.Serializable;

/**
 * @author qiuhongyu
 * @date 2022/4/7 14:56
 *
 * 查询条件请求参数
 */
@Data
@ToString
public class QueryInfoRequest implements Serializable {

    private static final long serialVersionUID = 8295461128875889050L;

    /**
     * 性别
     */
    private String sex;

    /**
     * 年龄
     */
    private String age;

}
// 如果不用抽出来的策略也可以,那么写法就类似下面的这种,key中QueryInfoRequest 要重写toString 
  @Cacheable(value = "demo:quest",key = "#queryInfoRequest")
    public String  getInfo(QueryInfoRequest queryInfoRequest) {
    }
// 也可以指定对象中的哪个属性作为key 
  @Cacheable(value = "demo:quest",key = "#queryInfoRequest.age + '':" + #queryInfoRequest.sex)
    public String  getInfo(QueryInfoRequest queryInfoRequest) {
    //
    return null;
    }

需要用到的依赖

     <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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值