spring boot redis 缓存_redis本地缓存

spring boot redis 缓存_redis本地缓存SpringBoot集成Redis缓存查询操作是应用中最常见的操作,如果每次查询都从MySQL中查询则会影响效率,通常需要引入缓存来实现查询性能的优化。缓存可以选择本地缓存,远程缓存或本地缓存结合远程缓存。本地缓存可以使用Guava或Caffeine提供的解决方案,而远程缓存则可以选择Redis这样的内存数据库。本文记录一下SpringBoot集成Redis做缓存的相关配置。1引入依赖引入相应Starter。<dependency><gr

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

SpringBoot 集成 Redis 缓存

查询操作是应用中最常见的操作,如果每次查询都从 MySQL 中查询则会影响效率,通常需要引入缓存来实现查询性能的优化。缓存可以选择本地缓存,远程缓存或本地缓存结合远程缓存。本地缓存可以使用 Guava 或 Caffeine 提供的解决方案,而远程缓存则可以选择 Redis 这样的内存数据库。本文记录一下 SpringBoot 集成 Redis 做缓存的相关配置。

1 引入依赖

引入相应 Starter。

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

2 缓存配置

SpringBoot 中缓存由 CacheManager 管理,实现自己的 CacheManager 即可。

@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) { 
   
    RedisSerializer<String> redisSerializer = new StringRedisSerializer();
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    //解决查询缓存转换异常的问题,为Jackson配置ObjectMapper
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.activateDefaultTyping(
            LaissezFaireSubTypeValidator.instance,
            ObjectMapper.DefaultTyping.NON_FINAL,
            JsonTypeInfo.As.WRAPPER_ARRAY);
    om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    jackson2JsonRedisSerializer.setObjectMapper(om);


    // 配置序列化(解决乱码的问题)
    RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
            .disableCachingNullValues();
	
    Set<String> cacheNames = new HashSet<>();
    cacheNames.add("FlashActivity");
    cacheNames.add("FlashItem");

    Map<String, RedisCacheConfiguration> configMap = new ConcurrentHashMap<>();
    configMap.put("FlashActivity", config.entryTtl(Duration.ofMinutes(60)));
    configMap.put("FlashItem", config.entryTtl(Duration.ofSeconds(3)));

    return RedisCacheManager.builder(factory)
            .cacheDefaults(config)
            .initialCacheNames(cacheNames)
            .withInitialCacheConfigurations(configMap)
            .build();
}

2.1 配置 ObjectMapper

ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 必要配置,否则反序列化得到的是LinkedHashMap对象
om.activateDefaultTyping(
        LaissezFaireSubTypeValidator.instance,
        ObjectMapper.DefaultTyping.NON_FINAL,
        JsonTypeInfo.As.WRAPPER_ARRAY);
// 出现未知字段不报错
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

2.2 配置 CacheConfig

// 配置序列化(解决乱码的问题)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
        .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
        .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
        .disableCachingNullValues();

2.3 不同 Cache 设置不同 TTL

Set<String> cacheNames = new HashSet<>();
cacheNames.add("FlashActivity");
cacheNames.add("FlashItem");

Map<String, RedisCacheConfiguration> configMap = new ConcurrentHashMap<>();
configMap.put("FlashActivity", config.entryTtl(Duration.ofMinutes(60)));
configMap.put("FlashItem", config.entryTtl(Duration.ofSeconds(3)));

3 注解使用

// 类上指定缓存到哪些 Cache
@CacheConfig(cacheNames = "FlashItem")
@CacheEvict(key = "'FlashItemCache'.concat(#itemId)")
// sync指定为true,缓存失效只会有一个线程取请求数据库,其他线程使用请求回的数据
@Cacheable(key = "'ActivityFlashItemCache'.concat(#activityId)", sync = true)

4 RedisTemplate 配置

使用 RedisTemplate 可以实现手动缓存或其他对 Redis 操作,但之前只是配置缓存相关配置,直接使用RedisTemplate 时不会生效,需要单独配置。

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { 
   

    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory);


    ObjectMapper objectMapper = new ObjectMapper();

    objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
    StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
    // key-value结构序列化数据结构
    redisTemplate.setKeySerializer(stringRedisSerializer);
    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
    // hash数据结构序列化方式,必须这样否则存hash 就是基于jdk序列化的
    redisTemplate.setHashKeySerializer(stringRedisSerializer);
    redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
    redisTemplate.afterPropertiesSet();
    return redisTemplate;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/192673.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 集群分为几种,用的软件分别是什么?[通俗易懂]

    集群分为几种,用的软件分别是什么?[通俗易懂]集群分为几种,用的软件分别是什么?补充:涉及的组件1.1、apache跨平台的网页服务器,主要使用它做静态资源服务器,也可以做代理服务器转发请求1.2、ngnix高性能的HTTP和反向代理服务器,ngnix处理能力相当于apache的10倍。1.3、lvsLinux虚拟服务器,可以实现LINUX平台下的简单负载均衡1.4、HAProxy提供高可用性、负载均衡以及基于TCP和HT…

    2022年10月10日
    2
  • MSVCR110.dll缺失问题

    MSVCR110.dll缺失问题电脑出现无法启动此程序 因为计算机中丢失 MSVCR110 dll 尝试重新安装该程序以解决此问题 是此程序的成功运行需要 msvcr110 dll 文件来支持 1 下载 msvcr110 dll 文件 2 将 msvcr110 dll 文件直接拷贝到 c Windows System32 文件夹目录下 例如图

    2025年10月2日
    1
  • 不用go-(xxoo)agent的也有可能是程序员

    不用go-(xxoo)agent的也有可能是程序员记得是去年某个时候,在一个群里问大家是怎么翻(什么)墙的,发现很多人是用go-(xxoo)agent的,而我当时完全没听说过go-agent,因为我已经N多年不翻(什么)墙了,于是,有人就说:“连go-(xxoo)agent都没用过你还是程序员吗?”说实话,我也不希望我是程序员啊!可我真的没用过go-(xxoo)agent啊!想起我一位前同事,工作很多年了,却从来没用过linux!(也不知道他

    2022年7月17日
    21
  • Werkzeug_werkzeug怎么读

    Werkzeug_werkzeug怎么读欢迎来到Werkzeug教程,我们将会实现一个类似TinyURL的网站来储存URLS。我们将会使用的库有模板引擎Jinja2,数据层支持redis,当然还有WSGI协议层Werkzeug。你可以使用pip来安装依赖库:pipinstallJinja2redis同时确定你的本地开启一个redis服务,如果你是OSX系统,你可以使用brew…

    2022年10月7日
    2
  • win10开机“正在准备自动修复”,且无法修复你的电脑「建议收藏」

    win10开机“正在准备自动修复”,且无法修复你的电脑「建议收藏」昨天一顿操作,先是快速启动,后来又觉得快速启动没用又关掉了,第二天过来,发现电脑开不起来了,进到里面怎么自动修复不得行,网上大多数的答案是重装,经过半天努力摸索,终于修好了,原理就不想深究了。准备:一个U盘,并且制作PE系统。1、电脑的系统启动设置在U盘启动,进入PE系统2、打开分区工具DiskGenius点硬盘点重建主引导记录MBR(一般在开始菜单都有)3、再返…

    2022年4月20日
    108
  • 22.IMU和里程计融合

    22.IMU和里程计融合1.概述实际使用中会出现轮子打滑和累计误差的情况,这里单单使用编码器得到里程计会出现一定的偏差,虽然激光雷达会纠正,但一个准确的里程对这个系统还是较为重要2.IMU数据获取IMU即为惯性测量单元,一般包含了三个单轴的加速度计和三个单轴的陀螺仪,简单理解通过加速度二次积分就可以得到位移信息、通过角速度积分就可以得到三个角度,实时要比这个复杂许多2.1PIBOTIMU…

    2022年6月29日
    148

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号