ToB企服应用市场:ToB评测及商务社交产业平台

标题: springboot+redis+缓存 [打印本页]

作者: 大连全瓷种植牙齿制作中心    时间: 2024-9-24 21:51
标题: springboot+redis+缓存
整合

添加依赖
  1. <dependency>
  2.       <groupId>org.springframework.boot</groupId>
  3.       <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>
复制代码
连接redis,设置yml文件
主机
端口号
数据库是哪一个
暗码

设置类
  1. package com.aaa.config;
  2. import com.fasterxml.jackson.annotation.JsonAutoDetect;
  3. import com.fasterxml.jackson.annotation.PropertyAccessor;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import org.springframework.cache.CacheManager;
  6. import org.springframework.cache.annotation.CachingConfigurerSupport;
  7. import org.springframework.cache.annotation.EnableCaching;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import org.springframework.data.redis.cache.RedisCacheConfiguration;
  11. import org.springframework.data.redis.cache.RedisCacheManager;
  12. import org.springframework.data.redis.connection.RedisConnectionFactory;
  13. import org.springframework.data.redis.core.RedisTemplate;
  14. import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
  15. import org.springframework.data.redis.serializer.RedisSerializationContext;
  16. import org.springframework.data.redis.serializer.RedisSerializer;
  17. import org.springframework.data.redis.serializer.StringRedisSerializer;
  18. import java.time.Duration;
  19. @Configuration
  20. public class RedisTemplateConfig  {
  21.     // 工具   redisTemplate
  22.     @Bean
  23.     public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
  24.         // 创建一个redisTemplate
  25.         RedisTemplate<String, Object> template = new RedisTemplate<>();
  26.         // redis 序列化
  27.         RedisSerializer<String> redisSerializer = new StringRedisSerializer();
  28.         // 序列化的对象
  29.         Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  30.         ObjectMapper om = new ObjectMapper();
  31.         // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
  32.         om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  33.         // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会抛出异常
  34.         om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  35.         jackson2JsonRedisSerializer.setObjectMapper(om);
  36.         template.setConnectionFactory(factory);
  37.         //key序列化方式
  38.         template.setKeySerializer(redisSerializer);
  39.         //value序列化
  40.         template.setValueSerializer(jackson2JsonRedisSerializer);
  41.         //value hashmap序列化
  42.         template.setHashValueSerializer(jackson2JsonRedisSerializer);
  43.         return template;
  44.     }
  45. }
复制代码
调用类方法举行操作redis
  1. package com.aaa;
  2. import junit.framework.TestCase;
  3. import junit.framework.TestSuite;
  4. import org.junit.jupiter.api.Test;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import org.springframework.data.redis.core.RedisTemplate;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. import java.util.concurrent.TimeUnit;
  11. @SpringBootTest
  12. public class AppTest {
  13.     @Autowired
  14.     private RedisTemplate redisTemplate;
  15.     @Test
  16.     public void testString(){
  17.         // 添加一个数据
  18.         redisTemplate.opsForValue().set("test","test1");
  19.     }
  20. }
复制代码
缓存

我们预备springboot+mybatis来使用缓存
流程

当我们实行增删改查的时候会大量的访问数据库,为了减缓数据库的压力或其他题目,我们使用缓存来解决,如果缓存中没有我们需要的数据时,我们将会访问数据库,但是如果缓存中有我们需要的数据,我们就不用再访问数据库了,而是直接拿到缓存即可
缓存穿透:

业务体系要查询的数据根本就不存在!当业务体系发起查询时,按照上述流程,起首会前去缓存中查询,由于缓存中不存在,然后再前去数据库中查询。由于该数据压根就不存在,因此数据库也返回空。这就是缓存穿透。
  综上所述:业务体系访问压根就不存在的数据,就称为缓存穿透。
危害

  如果存在海量哀求查询压根就不存在的数据,那么这些海量哀求都会落到数据库中,数据库压力剧增,大概会导致体系瓦解(你要知道,目前业务体系中最脆弱的就是 IO,轻微来点压力它就会瓦解,以是我们要想种种办法保护它)。
解决

把所有大概访问的值全部放到布隆过滤器内里 如果布隆过滤器中没有你要查询的值就直接返回null
缓存击穿:

访问的这个热点数据恰好过期了,将会产生大量的哀求访问数据库,给数据库带来巨大的压力
解决:
加锁
缓存雪崩:

缓存给数据库抵抗了大量的查询哀求,但是一旦缓存宕机了,那么原本被缓存抵抗的海量查询哀求就会像疯狗一样涌向数据库。此时数据库如果抵抗不了这巨大的压力,它就会瓦解。

设置类:

  1. package com.aaa.config;
  2. import com.fasterxml.jackson.annotation.JsonAutoDetect;
  3. import com.fasterxml.jackson.annotation.PropertyAccessor;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import org.springframework.cache.CacheManager;
  6. import org.springframework.cache.annotation.CachingConfigurerSupport;
  7. import org.springframework.cache.annotation.EnableCaching;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import org.springframework.data.redis.cache.RedisCacheConfiguration;
  11. import org.springframework.data.redis.cache.RedisCacheManager;
  12. import org.springframework.data.redis.connection.RedisConnectionFactory;
  13. import org.springframework.data.redis.core.RedisTemplate;
  14. import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
  15. import org.springframework.data.redis.serializer.RedisSerializationContext;
  16. import org.springframework.data.redis.serializer.RedisSerializer;
  17. import org.springframework.data.redis.serializer.StringRedisSerializer;
  18. import java.time.Duration;
  19. @Configuration
  20. // 开启缓存
  21. @EnableCaching
  22. public class RedisTemplateConfig  {
  23.     // 工具   redisTemplate
  24.     @Bean
  25.     public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
  26.         // 创建一个redisTemplate
  27.         RedisTemplate<String, Object> template = new RedisTemplate<>();
  28.         // redis 序列化
  29.         RedisSerializer<String> redisSerializer = new StringRedisSerializer();
  30.         // 序列化的对象
  31.         Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  32.         ObjectMapper om = new ObjectMapper();
  33.         // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
  34.         om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  35.         // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会抛出异常
  36.         om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  37.         jackson2JsonRedisSerializer.setObjectMapper(om);
  38.         template.setConnectionFactory(factory);
  39.         //key序列化方式
  40.         template.setKeySerializer(redisSerializer);
  41.         //value序列化
  42.         template.setValueSerializer(jackson2JsonRedisSerializer);
  43.         //value hashmap序列化
  44.         template.setHashValueSerializer(jackson2JsonRedisSerializer);
  45.         return template;
  46.     }
  47.     // 注入缓存的bean
  48.     @Bean
  49.     public CacheManager cacheManager(RedisConnectionFactory factory) {
  50.         RedisSerializer<String> redisSerializer = new StringRedisSerializer();
  51.         Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  52. //解决查询缓存转换异常的问题
  53.         ObjectMapper om = new ObjectMapper();
  54.         om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  55.         om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  56.         jackson2JsonRedisSerializer.setObjectMapper(om);
  57. // 配置序列化(解决乱码的问题),过期时间600秒
  58.         RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
  59.                 .entryTtl(Duration.ofSeconds(600)) //
  60.                 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
  61.                 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
  62.                 .disableCachingNullValues();
  63.         RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
  64.                 .cacheDefaults(config)
  65.                 .build();
  66.         return cacheManager;
  67.     }
  68. }
复制代码
开启缓存

  1. @EnableCaching
复制代码
我们的设置类上面必须要加上这个注解不加 就没有办法使用缓存
缓存一样寻常是加在service层
@Cacheable

对应的value值或者是cachename的值必须要写

查询


用我们的工具就可以看到


如果redis里没有这个数据,它会先访问数据库,然后把我们访问的这个数据添加到缓存里,下次查询的时候由于我们缓存里已经有了我们需要的数据,以是就不会再去访问数据库了,而是直接访问缓存

@CachePut

不管数据内里有没有   都会加到缓存中

添加或修改


我们可以本身去设置缓存的key名


@CacheEvict

删除

清除缓存
@CacheEvict是用来标注在需要清除缓存元素的方法或类上的

allEntries = true:代表清除value对应的值下面的所有的缓存,false:只清楚对应key的缓存

如果不写allEntries:也只会清楚对应key的缓存




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4