文章目录

  • 1.依赖和配置:
  • 2.操作数据库(查询缓存):
    • service:
    • controller:
    • mapper
  • 3.结果:

1.依赖和配置:

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

RedisConfig:

package com.english.english_vision.config;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.data.redis.cache.RedisCacheManager;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;import java.lang.reflect.Method;
import java.time.Duration;@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {private Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer =new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper objectMapper = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.configure(MapperFeature.USE_ANNOTATIONS, false);objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);// 此项必须配置,否则会报java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXXobjectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);return jackson2JsonRedisSerializer;}@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<>();// 配置连接工厂template.setConnectionFactory(factory);//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和publicom.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常//om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);jacksonSeial.setObjectMapper(om);// 值采用json序列化template.setValueSerializer(jacksonSeial);//使用StringRedisSerializer来序列化和反序列化redis的key值template.setKeySerializer(new StringRedisSerializer());// 设置hash key 和value序列化模式template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(jacksonSeial);template.afterPropertiesSet();return template;}@Beanpublic RedisCacheManager 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);jackson2JsonRedisSerializer.setObjectMapper(om);//配置序列化(解决乱码的问题)RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofDays(30)).serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)).disableCachingNullValues();RedisCacheManager cacheManager = RedisCacheManager.builder(factory).cacheDefaults(config).build();return cacheManager;}@Beanpublic HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {return redisTemplate.opsForHash();}/*** 对redis字符串类型数据操作** @param redisTemplate* @return*/@Beanpublic ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);redisTemplate.setKeySerializer(jackson2JsonRedisSerializer);redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer);redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate.opsForValue();}/*** 对链表类型的数据操作** @param redisTemplate* @return*/@Beanpublic ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {return redisTemplate.opsForList();}/*** 对无序集合类型的数据操作** @param redisTemplate* @return*/@Beanpublic SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {return redisTemplate.opsForSet();}/*** 对有序集合类型的数据操作** @param redisTemplate* @return*/@Beanpublic ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {return redisTemplate.opsForZSet();}@Bean("myGenerator")public KeyGenerator keyGenerator(){return new KeyGenerator() {@Overridepublic Object generate(Object target, Method method, Object... objects) {StringBuilder sb = new StringBuilder();sb.append(target.getClass().getName());sb.append(method.getName());for(Object obj:objects)sb.append(obj.toString());return sb.toString();}};}
}

2.操作数据库(查询缓存):

service:

public interface ISongService extends IService<Song> {List<Song> listbyName(String name);}@Service
public class SongServiceImpl extends ServiceImpl<SongMapper, Song> implements ISongService {@Autowiredprivate RedisService redisService;@Autowiredprivate SongMapper songMapper;@Autowiredprivate RedisTemplate redisTemplate;@Overridepublic List<Song> listbyName(String name) {List<Song> songs = null;String key = "songlist:"+name ;ValueOperations<String, List<Song>> operations = redisTemplate.opsForValue();//判断redis中是否有键为key的缓存boolean hasKey = redisTemplate.hasKey(key);if(hasKey) {songs = operations.get(key);return songs;}else {songs = songMapper.listbyName(name);
operations.set(key,songs,3, TimeUnit.HOURS);}System.out.println("mapper查询");return songMapper.listbyName(name);}}

controller:

    @ApiOperation(value="查询歌曲")@RequestMapping(value = "/query", method = RequestMethod.POST)public ResponseResult querySong(@ApiParam(name="name",value="歌名",required=true)@RequestParam("name")String name){//  List<Song> songs = songService.listbyName(new LambdaQueryWrapper<Song>().eq(Song::getName,name));List<Song> songs = songService.listbyName(name);if(songs == null) return ResponseResult.error(ResponseEnum.DIARY_NOT_EXIST);List<SongVo> songVos = songs.stream().map(e->{SongVo songVo = new SongVo();BeanUtils.copyBeanProp(songVo,e);return songVo;}).collect(Collectors.toList());int numbers = songVos.size();PageResult pageResult = new PageResult<>(songVos,numbers);return ResponseResult.success(pageResult);}

mapper

    <select id="listbyName" resultType="com.english.english_vision.pojo.Song">select * from t_song where name like "%"#{name}"%"</select>

3.结果:



多次发起请求只打印了一次sql,可以说明后面几次是从缓存中取出的
查看redis数据库:

springboot整合redis操作缓存(将查询到的数据放在缓存中)相关推荐

  1. springboot整合redis做缓存

    之前的项目中,用到过redis,主要是使用redis做缓存,redis在web开发中使用的场景很多,其中缓存是其中一个很重要的使用场景,之所以用作缓存,得益于redis的读写数据,尤其是在读取数据的时 ...

  2. RedisTemplate操作redis五大类型用法详解(springboot整合redis版本)

    1.案例说明 springboot整合redis之后,提供了操作redis的简便方式 通过通用对象redisTemplate方式操作String,Hash,List,Set SortSet五大数据类型 ...

  3. Springboot整合redis实现缓存及其缓存运行原理浅析

    声明:小白,学习阶段,主要目的是为了记录学习过程,本文仅供参考,如有不足的地方欢迎指出讨论交流 本文基于Springboot2.1.3版本开发: 准备阶段 首先是pom.xml文件所需的依赖: < ...

  4. SpringBoot整合Redis缓存

    SpringBoot整合Redis缓存 一.缓存概念知识 1.是什么缓存 2.缓存的优缺点 3.为什么使用缓存 二.Redis概念知识 1.Redis简介 2.为什么用Redis作为缓存 3.Redi ...

  5. 8分钟带你学会SpringBoot整合Redis来实现缓存技术

    1.概述 随着互联网技术的发展,对技术要求也越来越高,所以在当期情况下项目的开发中对数据访问的效率也有了很高的要求,所以在项目开发中缓存技术使用的也越来越多,因为它可以极大的提高系统的访问速度,关于缓 ...

  6. SpringBoot整合Redis+Redis缓存应用+Redis实现Session共享+...

    一.SpringBoot整合Redis 1.导入依赖 <!--存在Redis依赖--> <dependency><groupId>org.springframewo ...

  7. 不要再找了,Java操作Redis、Spring整合Redis及SpringBoot整合Redis这里都有

    文章开始之前先抛出一个问题:Jedis.Lettuce.Redisson以及RedisTemplate几者之间有什么区别,又有什么联系? 如果你心中已经很清晰的有了答案,那么本文你可以很轻松的阅读过去 ...

  8. Springboot整合redis(lettuce)

    springboot 整合redis(lettuce) 首先确保电脑上装了redis.最好能用redisDesktop查看一下数据情况 redis是一款非常流行的Nosql数据库.redis的功能非常 ...

  9. 【Java进阶】SpringBoot整合Redis

    SpringBoot整合Redis SpringBoot 操作数据:spring-data jpa jdbc mongodb redis SpringData 也是和 SpringBoot 齐名的项目 ...

最新文章

  1. 在线生成 CSS3 的工具
  2. 科大星云诗社动态20210215
  3. 解析并符号 读取dll_风电场用风功率采集测风塔数据报文格式解析浅谈
  4. QDU-Training-01
  5. 这是我拼命做科研的原因,2018年最感人的一个真实故事
  6. Docker与虚拟机技术
  7. 如何将servlet中的变量在jsp页面中显示---jsp中的jstl表达式(C标签)
  8. Linux进程控制与进程优先级
  9. 6.Linux 运行级别
  10. 现代通信原理4.3:白噪声
  11. 520动态爱心-代码
  12. 中学生信息技术计算机软件教案,初中信息技术教学计划
  13. 怎么往云服务器里传输文件,怎么把文件传输到云服务器
  14. 数据清洗中的缺失值处理
  15. java IO流之一 IO流介绍
  16. 关于网络文学发展形势的三点判断
  17. FPT Software携手三井物产提升日本网络安全水平
  18. 阿里云 SDK 动态IP域名解析
  19. Matlab中向图中添加文本
  20. zookeeper连接,报caught end of stream exception EndOfStreamException: Unable to read additional data fro

热门文章

  1. php openssl des ecb,PHP7 OpenSSL DES-EDE-CBC加解密
  2. php+中午截取,PHP_php字符串截取中文截取2,单字节截取模式,//中文截取2,单字节截取模式 - phpStudy...
  3. php 运行环境 去mysql,php、MySql运行环境
  4. 前端实习生笔试_2016春网易前端暑期实习生笔试面经(二面已挂)
  5. 压力测试网站_一行命令就能网站压力测试和网站故障排除
  6. python复制多个文件_python 之 复制多个模板文件
  7. 查询jsp servelet mysql_JSP + Servlet + JDBC + Mysql 实现增删改查 课程管理系统(示例代码)...
  8. flink 运行一段时间 内存溢出_Flink之运行时环境
  9. NLP神器—Gensim
  10. AAAI 2022 | 可解释和鲁棒的联合文本分类及证据提取