使用SpringCache加Redis做缓存

目录
  • Redis + SpringCache

    1. 添加依赖

    <!-- redis --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- spring2.X集成redis所需common-pool2--><dependency>    <groupId>org.apache.commons</groupId>    <artifactId>commons-pool2</artifactId>    <version>2.6.0</version></dependency>

    2. 使用配置类注入相关组件

    @Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport {    @Bean    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {        RedisTemplate<String, Object> template = new RedisTemplate<>();        RedisSerializer<String> redisSerializer = new StringRedisSerializer();        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);        ObjectMapper om = new ObjectMapper();        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        jackson2JsonRedisSerializer.setObjectMapper(om);        template.setConnectionFactory(factory);        //key序列化方式        template.setKeySerializer(redisSerializer);        //value序列化        template.setValueSerializer(jackson2JsonRedisSerializer);        //value hashmap序列化        template.setHashValueSerializer(jackson2JsonRedisSerializer);        return template;    }    @Bean    public CacheManager cacheManager(RedisConnectionFactory factory) {        RedisSerializer<String> redisSerializer = new StringRedisSerializer();        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);        //解决查询缓存转换异常的问题        ObjectMapper om = new ObjectMapper();        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        jackson2JsonRedisSerializer.setObjectMapper(om);        // 配置序列化(解决乱码的问题),过期时间600秒        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()                .entryTtl(Duration.ofSeconds(600))                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))                .disableCachingNullValues();        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)                .cacheDefaults(config)                .build();        return cacheManager;    }}

    3. 使用以下注解

    • @Cacheable:根据方法对返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回,如果缓存不存在,则执行方法,并把返回结果存入缓存,一般用在查询方法上
    • @CachePut:每次都会执行方法,并将结果存入缓存,其他方法可以直接读取,一般用在新增方法上
    • @CacheEvict:会清除指定的缓存,一般用在更新或删除方法上

    注解1和2的属性

    注解属性 作用
    value 必填,缓存名,指定命名空间
    cacheNames 和value类似
    key 可选,可以用spEL自定义key

    注解3多出两个

    注解属性 作用
    allEntries 如果指定为true,方法调用将清空所有缓存
    beforeInvocation 是否在方法执前清空,默认为false

    4. 配置

    spring.redis.host=127.0.0.1spring.redis.port=6379spring.redis.database= 0spring.redis.timeout=1800000

    5. 存储格式

    value + "::" + key 的格式

    例如:

    @Cacheable(value = "space", key = "'key'")

    缓存的键就是:

    space::key

    6. 注意点

    key中如果是字符串需要加单引号,如果是spEL则不需要

    Redis做缓存和SpringCache缓存

    • 1. 添加依赖
      <!-- redis --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- spring2.X集成redis所需common-pool2--><dependency>    <groupId>org.apache.commons</groupId>    <artifactId>commons-pool2</artifactId>    <version>2.6.0</version></dependency>

      2. 使用配置类注入相关组件

      @Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport {    @Bean    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {        RedisTemplate<String, Object> template = new RedisTemplate<>();        RedisSerializer<String> redisSerializer = new StringRedisSerializer();        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);        ObjectMapper om = new ObjectMapper();        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        jackson2JsonRedisSerializer.setObjectMapper(om);        template.setConnectionFactory(factory);        //key序列化方式        template.setKeySerializer(redisSerializer);        //value序列化        template.setValueSerializer(jackson2JsonRedisSerializer);        //value hashmap序列化        template.setHashValueSerializer(jackson2JsonRedisSerializer);        return template;    }    @Bean    public CacheManager cacheManager(RedisConnectionFactory factory) {        RedisSerializer<String> redisSerializer = new StringRedisSerializer();        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);        //解决查询缓存转换异常的问题        ObjectMapper om = new ObjectMapper();        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        jackson2JsonRedisSerializer.setObjectMapper(om);        // 配置序列化(解决乱码的问题),过期时间600秒        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()                .entryTtl(Duration.ofSeconds(600))                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))                .disableCachingNullValues();        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)                .cacheDefaults(config)                .build();        return cacheManager;    }}

      3. 使用以下注解

      • @Cacheable:根据方法对返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回,如果缓存不存在,则执行方法,并把返回结果存入缓存,一般用在查询方法上
      • @CachePut:每次都会执行方法,并将结果存入缓存,其他方法可以直接读取,一般用在新增方法上
      • @CacheEvict:会清除指定的缓存,一般用在更新或删除方法上

      注解1和2的属性

      注解属性 作用
      value 必填,缓存名,指定命名空间
      cacheNames 和value类似
      key 可选,可以用spEL自定义key

      注解3多出两个

      注解属性 作用
      allEntries 如果指定为true,方法调用将清空所有缓存
      beforeInvocation 是否在方法执前清空,默认为false

      4. 配置

      spring.redis.host=127.0.0.1spring.redis.port=6379spring.redis.database= 0spring.redis.timeout=1800000

      5. 存储格式

      value + "::" + key 的格式

      例如:

      @Cacheable(value = "space", key = "'key'")

      缓存的键就是:

      space::key

      6. 注意点

      key中如果是字符串需要加单引号,如果是spEL则不需要

      Redis做缓存和SpringCache缓存

      记录一下Redis做缓存和SpringCache缓存的区别

      1.Redis做缓存的话,相当于是一个第三方缓存,所以项目重启之后缓存数据还是存在的

      2.SpringCache作缓存的话是建立在JVM上的,所以项目启动之后缓存是自动消失的。

      业务:在邮件验证码、短信验证码情况下需要设置过期时间。

      如何使用:用Redis和SpringCache两种使用方法。

      过期时间:如果需要设置过期时间的话,需要使用到redis。如果不需要设置过期时间,则Redis和SpringCache都可以。

      SpringCache 使用方法

Redis + SpringCache

1. 添加依赖

<!-- redis --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- spring2.X集成redis所需common-pool2--><dependency>    <groupId>org.apache.commons</groupId>    <artifactId>commons-pool2</artifactId>    <version>2.6.0</version></dependency>

2. 使用配置类注入相关组件

@Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport {    @Bean    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {        RedisTemplate<String, Object> template = new RedisTemplate<>();        RedisSerializer<String> redisSerializer = new StringRedisSerializer();        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);        ObjectMapper om = new ObjectMapper();        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        jackson2JsonRedisSerializer.setObjectMapper(om);        template.setConnectionFactory(factory);        //key序列化方式        template.setKeySerializer(redisSerializer);        //value序列化        template.setValueSerializer(jackson2JsonRedisSerializer);        //value hashmap序列化        template.setHashValueSerializer(jackson2JsonRedisSerializer);        return template;    }    @Bean    public CacheManager cacheManager(RedisConnectionFactory factory) {        RedisSerializer<String> redisSerializer = new StringRedisSerializer();        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);        //解决查询缓存转换异常的问题        ObjectMapper om = new ObjectMapper();        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        jackson2JsonRedisSerializer.setObjectMapper(om);        // 配置序列化(解决乱码的问题),过期时间600秒        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()                .entryTtl(Duration.ofSeconds(600))                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))                .disableCachingNullValues();        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)                .cacheDefaults(config)                .build();        return cacheManager;    }}

3. 使用以下注解

  • @Cacheable:根据方法对返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回,如果缓存不存在,则执行方法,并把返回结果存入缓存,一般用在查询方法上
  • @CachePut:每次都会执行方法,并将结果存入缓存,其他方法可以直接读取,一般用在新增方法上
  • @CacheEvict:会清除指定的缓存,一般用在更新或删除方法上

注解1和2的属性

注解属性 作用
value 必填,缓存名,指定命名空间
cacheNames 和value类似
key 可选,可以用spEL自定义key

注解3多出两个

注解属性 作用
allEntries 如果指定为true,方法调用将清空所有缓存
beforeInvocation 是否在方法执前清空,默认为false

4. 配置

spring.redis.host=127.0.0.1spring.redis.port=6379spring.redis.database= 0spring.redis.timeout=1800000

5. 存储格式

value + "::" + key 的格式

例如:

@Cacheable(value = "space", key = "'key'")

缓存的键就是:

space::key

6. 注意点

key中如果是字符串需要加单引号,如果是spEL则不需要

Redis做缓存和SpringCache缓存

记录一下Redis做缓存和SpringCache缓存的区别

1.Redis做缓存的话,相当于是一个第三方缓存,所以项目重启之后缓存数据还是存在的

2.SpringCache作缓存的话是建立在JVM上的,所以项目启动之后缓存是自动消失的。

业务:在邮件验证码、短信验证码情况下需要设置过期时间。

如何使用:用Redis和SpringCache两种使用方法。

过期时间:如果需要设置过期时间的话,需要使用到redis。如果不需要设置过期时间,则Redis和SpringCache都可以。

SpringCache 使用方法

1.在启动类使用@EnableCaching

@SpringBootApplication@EnableCaching //启动SpringCache缓存public class GatheringApplication {}

2.是需要添加缓存的时候使用@Cacheable

//存入缓存@Cacheable(value = "gathering",key = "#id")public Gathering findById(String id){}3.在需要删除缓存的时候使用@CacheEvict//删除@CacheEvict(value = "gathering",key = "#gathering.id")public void update(Gathering gathering){}

下面是SpringDataRedis的部分使用方法:

/**   * 参数1:key 参数2:value 参数3:时间 参数4:时间单位   */redisTemplate.opsForValue().set(REDIS_ARTICLE_KEY+"_"+id,article,10, TimeUnit.SECONDS); stringRedisTemplate.opsForValue().set("test", "100",60*10,TimeUnit.SECONDS);//向redis里存入数据和设置缓存时间 stringRedisTemplate.opsForValue().get("test")//根据key获取缓存中的valstringRedisTemplate.boundValueOps("test").increment(-1);//val做-1操作stringRedisTemplate.boundValueOps("test").increment(1);//val +1stringRedisTemplate.getExpire("test")//根据key获取过期时间stringRedisTemplate.getExpire("test",TimeUnit.SECONDS)//根据key获取过期时间并换算成指定单位stringRedisTemplate.delete("test");//根据key删除缓存stringRedisTemplate.hasKey("546545");//检查key是否存在,返回boolean值stringRedisTemplate.expire("red_123",1000 , TimeUnit.MILLISECONDS);//设置过期时间stringRedisTemplate.opsForSet().add("red_123", "1","2","3");//向指定key中存放set集合stringRedisTemplate.opsForSet().isMember("red_123", "1")//根据key查看集合中是否存在指定数据stringRedisTemplate.opsForSet().members("red_123");//根据key获取set集合

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot+SpringCache实现两级缓存(Redis+Caffeine)

    1. 缓存.两级缓存 1.1 内容说明 Spring cache:主要包含spring cache定义的接口方法说明和注解中的属性说明 springboot+spring cache:rediscache实现中的缺陷 caffeine简介 spring boot+spring cache实现两级缓存 使用缓存时的流程图 1.2 Sping Cache spring cache是spring-context包中提供的基于注解方式使用的缓存组件,定义了一些标准接口,通过实现这些接口,就可以通过在方法

  • 浅谈SpringCache与redis集成实现缓存解决方案

    缓存可以说是加速服务响应速度的一种非常有效并且简单的方式.在缓存领域,有很多知名的框架,如EhCache .Guava.HazelCast等.Redis作为key-value型数据库,由于他的这一特性,Redis也成为一种流行的数据缓存工具. 在传统方式下对于缓存的处理代码是非常臃肿的. 例如:我们要把一个查询函数加入缓存功能,大致需要三步. 一.在函数执行前,我们需要先检查缓存中是否存在数据,如果存在则返回缓存数据 二.如果不存在,就需要在数据库的数据查询出来. 三.最后把数据存放在缓存中,当

  • SpringCache 分布式缓存的实现方法(规避redis解锁的问题)

    简介 spring 从3.1 开始定义 org.springframework.cache.Cache org.springframework.cache.CacheManager 来统一不同的缓存技术 并支持使用JCache(JSR-107)注解简化我们的开发 基础概念 实战使用 整合SpringCache简化缓存开发 常用注解 常用注解 说明 @CacheEvict 触发将数据从缓存删除的操作 (失效模式) @CachePut 不影响方法执行更新缓存 @Caching 组合以上多个操作 @C

  • Java SpringCache+Redis缓存数据详解

    目录 前言 一.什么是SpringCache 二.项目集成Spring Cache + Redis 1.配置方式 三.使用Spring Cache 四.SpringCache原理与不足 1.读模式 2.写模式:(缓存与数据库一致) 五.总结 前言 这几天学习谷粒商城又再次的回顾了一次SpringCache,之前在学习谷粒学院的时候其实已经学习了一次了!!! 这里就对自己学过来的内容进行一次的总结和归纳!!! 一.什么是SpringCache Spring Cache 是一个非常优秀的缓存组件.自

  • 使用SpringCache加Redis做缓存

    目录 Redis + SpringCache 1. 添加依赖 <!-- redis --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- spring2.X集成redis所需common-pool2-->

  • 在项目中使用redis做缓存的一些思路

    目录 在项目中redis做缓存的一些思路 首先,缓存的对象有三种 本人走过的一些弯路 为什么没用Redis做缓存 使用Table作本地缓存 使用Redis作缓存 让我们来思考一下下面几个问题 那么使用本地缓存的问题是什么呢? 什么时候使用Redis? 在项目中redis做缓存的一些思路 首先,缓存的对象有三种 1.数据库中单条的的数据(以表名跟id作为key永久保存到redis),在有更新的地方都要更新缓存(不适用于需要经常更新的数据): 2.对于一些不分页,不需要实时(需要多表查询)的列表,我

  • Spring Boot中使用Redis做缓存的方法实例

    前言 本文主要给大家介绍的是关于Spring Boot中使用Redis做缓存的相关内容,这里有两种方式: 使用注解方式(但是小爷不喜欢) 直接<Spring Boot 使用 Redis>中的redisTemplate 下面来看看详细的介绍: 1.创建UserService public interface UserService { public User findById(int id); public User create(User user); public User update(U

  • Spring Boot基础学习之Mybatis操作中使用Redis做缓存详解

    前言 这篇博客学习下Mybatis操作中使用Redis做缓存.这里其实主要学习几个注解:@CachePut.@Cacheable.@CacheEvict.@CacheConfig. 下面话不多说了,来一起看看详细的介绍吧 一.基础知识 @Cacheable @Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 参数 解释 example value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如: @Cacheable(value="myc

  • Python的Flask框架使用Redis做数据缓存的配置方法

    Redis是一款依据BSD开源协议发行的高性能Key-Value存储系统.会把数据读入内存中提高存取效率.Redis性能极高能支持超过100K+每秒的读写频率,还支持通知key过期等等特性,所以及其适合做缓存. 下载安装 根据redis中文网使用wget下载压缩包 $ wget http://download.redis.io/releases/redis-3.0.5.tar.gz $ tar xzf redis-3.0.5.tar.gz $ cd redis-3.0.5 $ make 二进制文

  • SpringBoot+Mybatis项目使用Redis做Mybatis的二级缓存的方法

    介绍 使用mybatis时可以使用二级缓存提高查询速度,进而改善用户体验. 使用redis做mybatis的二级缓存可是内存可控<如将单独的服务器部署出来用于二级缓存>,管理方便. 1.在pom.xml文件中引入redis依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifac

  • Redis做预定库存缓存功能设计使用

    目录 最近在自己的工作中,把其中一个PHP项目的缓存从以前的APC缓存逐渐切换到Redis中,并且根据Redis所支持的数据结构做了库存维护功能.缓存是在业务层做的,准确讲应该是在MVC模型中Model的ORM里面.主要逻辑就是先查缓存,查不到的话再查数据库.不过这些不是本文的主要内容,下面我把库存管理功能的缓存设计思路分享一下,希望能带给大家一些收获,有不足之处或者有更好方案的,也希望各位多多指教. 一.业务背景 为了略去我们公司项目背景,我决定把这次的问题类比成一个考卷上的问题.至于业务细节

  • 使用spring-cache一行代码解决缓存击穿问题

    目录 引言 正文 目前缺陷 真正方案 缓存穿透 缓存击穿 缓存雪崩 文末 引言 今天,重新回顾一下缓存击穿这个问题! 之所以写这个文章呢,因为目前网上流传的文章落地性太差(什么布隆过滤器啊,布谷过滤器啊,嗯,你们懂的),其实这类方案并不适合在项目中直接落地. 那么,我们在项目中落地代码的时候,其实只需要一个注解就能解决这些问题,并不需要搞的那么复杂. 本文有一个前提,读者必须是java栈,且是用Springboot构建自己的项目,如果是go技术栈或者python技术栈的,可能介绍的思路仅供大家参

随机推荐