首页 > 数据库 >【Spring】Redis缓存+ehcache

【Spring】Redis缓存+ehcache

时间:2025-01-08 17:01:30浏览次数:3  
标签:ehcache 缓存 Spring Redis id 序列化 public redisTemplate

文章目录

基于Spring的Redis+ehcache

Redis 缓存配置

在项目中添加 Redis 的依赖

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

示例 Redis 配置

spring:
  redis:
    host: 127.0.0.1
	port: 6379
	password: 123456
	database: 1

在上述配置文件中,host 和 port 属性指定了 Redis 服务器的主机名和端口号,password 属性用于指定 Redis 服务器的密码(如果有的话),而 database 属性则指定了 Redis 服务器使用的数据库编号。

Redis 的默认序列化器是 JdkSerializationRedisSerializer,但是在实际使用中,由于其序列化后的大小通常比较大,因此我们通常使用 StringRedisSerializer 或者 Jackson2JsonRedisSerializer 将缓存值序列化为字符串或者 JSON 格式。以下是一个自定义序列化器的示例

@Configuration
public class RedisConfig{
    /**
     * redisTemplate 默认使用JDK的序列化机制, 存储二进制字节码, 所以自定义序列化类
     * @param redisConnectionFactory redis连接工厂类
     * @return RedisTemplate
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory
                                                               redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
		// 使用Jackson2JsonRedisSerialize 替换默认序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
                Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL,
                JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
		// 设置value的序列化规则和 key的序列化规则
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

通过自定义 Bean 配置了 RedisTemplate,使用 StringRedisSerializer 序列化 Redis 键,并使用 Jackson2JsonRedisSerializer 序列化 Redis 值为 JSON 格式。

yml 配置如下

spring:
  cache:
    type: redis
    redis:
      cache-null-values: false #查询结果为 null 不进行缓存
      time-to-live: 90000ms #缓存毫秒 设置过期时间
      use-key-prefix: true #配置key的前缀 如果指定了前缀,就用指定的,如果没有,就默认使
    # 用缓存的名字作为前缀
    cache-names: userCache #缓存名称列表

@Cacheable 注解

@Service
public class UserService {
    @Cacheable(value = "userCache", key = "#id")
    public User getUserById(Long id) {
        // 查询用户并返回
    }
}

@Cacheable 注解用于标记 getUserById 方法,而 value 属性则用于指定缓存的存储区域的名称。Redis 中的 key 将由 Cacheable 注解中的 key 属性指定。

此例中,key 属性设置为 #id,意味着将使用方法参数 id 作为 Redis 缓存的键。

以多个参数作为 key 来缓存数据。可以对 key 属性使用表达式 language(SpEL)来设置多个参数。

@Service
public class UserService {
    @Cacheable(value = "userCache", key = "#id + '_' + #name")
    public User getUserByIdAndName(Long id, String name) {
        // 查询用户并返回
    }
}

此例中,使用表达式语言(SpEL)将 id 和 name 两个参数组合成了一个 Redis 缓存键。

@CacheEvict 注解

清除 Redis 缓存中的数据

@Service
public class UserService {
    @Cacheable(value = "userCache", key = "#id")
    public User getUserById(Long id) {
        // 查询用户并返回
    }
    @CacheEvict(value = "userCache", key = "#id")
    public void deleteUserById(Long id) {
        // 删除用户并返回
    }
    @CacheEvict(value = "userCache", allEntries = true)
    public void deleteAllUsers() {
        // 删除所有用户并返回
    }
}

此例中,添加了删除单个用户和删除所有用户两个方法,allEntries 属性为 true 以删除所有缓存中的数据。

缓存配置

期望的使用方式

@Cacheable(cacheNames = "demoCache#3600", key = "#id")

通过 # 分隔,后面部分表示此 Cache 的TTL(单位:秒)

删除 yml 的 cache 配置,保留 redis 配置。

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    password: 123456
    database: 1

编写配置类

/**
 * @Description: redis缓存配置类
 */
public class MyRedisCacheManager extends RedisCacheManager {
    public MyRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {
        super(cacheWriter, defaultCacheConfiguration);
    }
    public RedisCache createRedisCache(String name, @Nullable RedisCacheConfiguration cacheConfig) {
        String arrays[] = StringUtils.delimitedListToStringArray(name,"#");  
        // proCache#1000
        if(arrays.length > 1){
            name = arrays[0];
            cacheConfig = cacheConfig.entryTtl(Duration.ofSeconds(Long.parseLong(arrays[1])));
        }
        return super.createRedisCache(name,cacheConfig);
    }
}
/**
 * @Description: Redis配置类
 */
@Configuration
@EnableCaching //开启缓存
public class RedisConfig extends CachingConfigurerSupport {

    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.password}")
    private String password;
    @Value("${spring.redis.port}")
    private int port;
    @Value("${spring.redis.database}")
    private int database;
    @Bean
    public CacheManager cacheManager() {
        //默认配置
        RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(60)) //默认时间
                .computePrefixWith(cacheName -> "myCache:" + cacheName);

        MyRedisCacheManager myRedisCacheManager =
                new MyRedisCacheManager(
                        RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory())
                        ,defaultCacheConfig);
        return myRedisCacheManager;
    }
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        //创建连接Redis工厂
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(host);
        redisStandaloneConfiguration.setPort(port);
        redisStandaloneConfiguration.setDatabase(database);
        redisStandaloneConfiguration.setPassword(password);

        LettuceConnectionFactory factory = new LettuceConnectionFactory(redisStandaloneConfiguration);
        return factory;
    }

    /**
     * redisTemplate 默认使用JDK的序列化机制, 存储二进制字节码, 所以自定义序列化类
     * @param redisConnectionFactory redis连接工厂类
     * @return RedisTemplate
     */
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory
                                                               redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 使用Jackson2JsonRedisSerialize 替换默认序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
                Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL,
                JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        // 设置value的序列化规则和 key的序列化规则
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

测试

@Service
public class ProviderServiceImpl implements ProviderService {
    @Resource
    ProviderMapper providerMapper;
    @Cacheable(cacheNames = "proList#2000")
    @Override
    public ResultLayui findList() {
        return ResultLayui.success(providerMapper.findListCount(),providerMapper.findList());
    }
    @Cacheable(cacheNames = "proByid#100", key = "#id")
    @Override
    public ResultJSON findById(Integer id) {
        return ResultJSON.success(providerMapper.findById(id));
    }
}

调用 controller 层相关 API 接口

@RestController
@RequestMapping("/provider")
@CrossOrigin // 跨域请求
@Slf4j
public class ProviderController {
    @Resource
    private ProviderService providerService;
    @GetMapping("/lists")
    public ResultLayui list(){
        return providerService.findList();
    }
    @GetMapping("/byId")
    public ResultJSON byId(Integer id){
        return ResultJSON.success(providerService.findById(id));
    }
}
http://localhost:8080/provider/lists
http://localhost:8080/provider/byId?id=1
http://localhost:8080/provider/byId?id=2

在这里插入图片描述

标签:ehcache,缓存,Spring,Redis,id,序列化,public,redisTemplate
From: https://blog.csdn.net/m0_66584716/article/details/145012130

相关文章

  • SpringBoot日常:集成Kafka
    文章目录1、pom.xml文件2、application.yml3、生产者配置类4、消费者配置类5、消息订阅6、生产者发送消息7、测试发送消息本章内容主要介绍如何在springboot项目对kafka进行整合,最终能达到的效果就是能够在项目中通过配置相关的kafka配置,就能进行消息的生产和消费。......
  • Spring AMQP-保证消息的可靠性
    1.消息发送者的可靠性保证消息的可靠性可以通过发送者重连和发送者确认来实现发送者重连发送者重连机制就是在发送信息的时候如果连接不上mq不会立即结束,而是会在一定的时间间隔之类进行重新连接,连接的次数和时间都是由我们在配置文件中指定的,具体的就是通过retry属性来......
  • LInux单机安装Redis
    1.安装gee工具包由于Redis是基于c语言编写的所以安装的时候需要先安装gee以及gcc的依赖,yum云用不了可以看一下这个 linux替换yum源镜像_更换yum镜像源-CSDN博客yuminstall-ygcctcl2.添加redis的压缩包3.上传到Linux上传到 /usr/local/src目录、这个目录......
  • springboot水环境检测系统-计算机设计毕业源码43284
    目录1绪论1.1选题背景1.2选题的目的意义1.3论文结构与章节安排2系统分析2.1.1技术可行性分析2.1.2 经济可行性分析2.1.3法律可行性分析2.2系统流程分析2.2.1添加信息流程2.2.2修改信息流程2.2.3删除信息流程2.3 系统功能分析2.3.1功能......
  • springboot城乡居民医疗信息管理系统-计算机设计毕业源码70573
    目 录摘要Abstract绪论1.1 选题背景1.2研究内容1.3本文的组织结构2相关技术介绍2.1MySQL数据库2.2Java编程语言2.3SpringBoot框架介绍3 系统需求分析与设计3.1可行性分析3.1.1技术可行性分析3.1.2经济可行性分析3.1.3法律可行性分析......
  • 【Spring Boot开发】Spring Boot基于事件实现接口请求的性能监控
    前言在Spring框架中,监控接口请求的性能可以通过ServletRequestHandledEvent事件实现。这种方法简单有效,能够帮助开发者实时跟踪和分析请求的性能。它在请求处理完成后发布,包含了请求的详细信息,如客户端地址、请求URL、请求方法和处理时间。使用这个事件可以轻松地监控和记录每个......
  • 基于Spring Boot的动物之家平台
    目录项目介绍系统操作流程 系统架构设计演示视频系统功能实现代码实现 推荐项目项目开发总结为什么选择我 源码获取博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者......
  • 基于Spring Boot的二手在线交易平台
    目录项目介绍系统操作流程 系统架构设计演示视频系统功能实现代码实现 推荐项目项目开发总结为什么选择我 源码获取博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者......
  • 基于Spring Boot的飞天外卖配送系统
    目录项目介绍系统操作流程 系统架构设计演示视频系统功能实现代码实现 推荐项目项目开发总结为什么选择我 源码获取博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者......
  • SpringMVC详解(全网最全)
    起源1.三层架构:一个Servlet只能处理一个请求,耦合度高,复用性差,整页刷新用户体验差2.MVC模式:部分解耦但后端仍负责View层,高并发有限3.前后端分离:异步调用,复用性强,支持复杂交互,用户体验性强概念SpringMVC是Spring框架中的一个模块,用于构建Web的MVC架构,提供了......