关注我的微信公众号:后端技术漫谈

不定期推送关于后端开发、爬虫、算法题、数据结构方面的原创技术文章,以及生活中的逸闻趣事。

我目前是一名后端开发工程师。主要关注后端开发,数据安全,网络爬虫,物联网,边缘计算等方向。

原创博客主要内容

  • Java知识点复习全手册
  • Leetcode算法题解析
  • 剑指offer算法题解析
  • SpringCloud菜鸟入门实战系列
  • SpringBoot菜鸟入门实战系列
  • Python爬虫相关技术文章
  • 后端开发相关技术文章

前言

本文实现了SpringCache + Redis的集中式缓存,方便大家对学习了解缓存的使用。

本文实现:

  • SpringCache + Redis的组合
  • 通过配置文件实现了自定义key过期时间;key命名方式;value序列化方式

实现本文代码的前提:

  • 已有一个可以运行的Springboot项目,实现了简单的CRUD功能

步骤

在Spring Boot中通过@EnableCaching注解自动化配置合适的缓存管理器(CacheManager),Spring Boot根据下面的顺序去侦测缓存提供者:

GenericJCache (JSR-107)EhCache 2.xHazelcastInfinispanRedisGuavaSimple

我们所需要做的就是实现一个将缓存数据放在Redis的缓存机制。

  • 添加pom.xml依赖
  org.springframework.boot spring-boot-starter-cache org.springframework.boot spring-boot-starter-data-redis 

注意:- spring-boot-starter-data-redis和spring-boot-starter-redis的区别:https://blog.csdn.net/weixin_38521381/article/details/79397292

可以看出两个包并没有区别,但是当springBoot的版本为1.4.7 以上的时候,spring-boot-starter-redis 就空了。要想引入redis就只能选择有data的。

  • application.properties中加入redis连接设置(其它详细设置请查看参考网页)
# Redisspring.redis.host=localhostspring.redis.port=6379spring.redis.pool.max-idle=8spring.redis.pool.min-idle=0spring.redis.pool.max-active=8spring.redis.pool.max-wait=-1spring.redis.database=0spring.redis.password=xxx
  • 新增KeyGeneratorCacheConfig.java(或者名为CacheConfig)文件

该文件完成三项设置:key过期时间;key命名方式;value序列化方式:JSON便于查看

package com.pricemonitor.pm_backend;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;import java.lang.reflect.Method;@Configurationpublic class KeyGeneratorCacheConfig extends CachingConfigurerSupport { private final RedisTemplate redisTemplate; @Autowired public KeyGeneratorCacheConfig(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } @Override public CacheManager cacheManager() { // 设置key的序列化方式为String redisTemplate.setKeySerializer(new StringRedisSerializer()); // 设置value的序列化方式为JSON GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer); RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); // 设置默认过期时间为600秒 cacheManager.setDefaultExpiration(600); return cacheManager; } /** * key值为className+methodName+参数值列表 * @return */ @Override public KeyGenerator keyGenerator() { return new KeyGenerator() { @Override public Object generate(Object o, Method method, Object... args) { StringBuilder sb = new StringBuilder(); sb.append(o.getClass().getName()).append("#"); sb.append(method.getName()).append("("); for (Object obj : args) { if(obj != null) { // 在可选参数未给出时时,会出现null,此时需要跳过 sb.append(obj.toString()).append(","); } } sb.append(")"); return sb.toString(); } }; }}
  • 在serviceImpl中加入@CacheConfig并且给给每个方法加入缓存(详细注解使用请查看参考网页)
@Service@CacheConfig(cacheNames = "constant")public class ConstantServiceImpl implements ConstantService { @Autowired private ConstantMapper constantMapper; @Cacheable @Override public List alertMessage() { ConstantExample constantExample = new ConstantExample(); ConstantExample.Criteria criteria = constantExample.createCriteria(); criteria.andTypeEqualTo("alert"); return constantMapper.selectByExample(constantExample); } @Cacheable @Override public List noteMessage() { ConstantExample constantExample = new ConstantExample(); ConstantExample.Criteria criteria = constantExample.createCriteria(); criteria.andTypeEqualTo("note"); return constantMapper.selectByExample(constantExample); } @Cacheable @Override public List banner() { ConstantExample constantExample = new ConstantExample(); ConstantExample.Criteria criteria = constantExample.createCriteria(); criteria.andTypeEqualTo("banner"); return constantMapper.selectByExample(constantExample); }}

效果图

image

注意事项

  • 若直接修改数据库的表,并没有提供接口修改的字段,缓存就没法更新。所以这种字段加缓存需要尤其注意缓存的有效性,最好让其及时过期。或者给其实现增删改接口。
  • 大坑:在可选参数未给出时时,会出现null,此时在生成Key名的时候需要跳过。已在代码中修改
for (Object obj : args) { if(obj != null) { // 在可选参数未给出时时,会出现null,此时需要跳过 sb.append(obj.toString()).append(","); }}

参考

缓存入门:http://blog.didispace.com/springbootcache1/

Redis集中式缓存:http://blog.didispace.com/springbootcache2/

代码实现:(经典好用,有小bug):https://zhuanlan.zhihu.com/p/30540686

代码实现(可参考):https://www.jianshu.com/p/6ba2d2dbf36e

springboot redis 刷新时间_「SpringBoot实战」SpringCache + Redis实现数据缓存相关推荐

  1. 数据备份_「Cassandra实战」Cassandra数据备份

    尽管Cassandra号称可以做到宕机时间为零,但为了谨慎起见,还是需要对数据进行备份. Cassandra提供了几种备份的方法 将数据导出成为json格式 利用copy将数据导出为csv格式 直接复 ...

  2. react安装_「React实战」三分钟搭建React开发环境

    其实16年的时候就已经接触到React,那个时候也只是入门,时隔多年,工作上一直都没有接触到相关的业务,不知不觉,前端的天也开始渐变,看到 了很多招聘要求上都是要求会React,三大框架怎么也得熟悉使 ...

  3. json数据解析_「Flutter实战」22.JSON解析和复杂数据模型转换

    22.JSON解析和复杂数据模型转换技巧 json转Model类 创建model文件夹,在里面新建category.dart类 主要根据这个json来分析我们要做成类的样子 json数据 class ...

  4. 获取人口_「微科普」14亿人口数据是如何得到的?

    中国经济交出了2019年终答卷 GDP总量近百万亿元 人均GDP突破1万美元-- 小伙伴们在关心经济发展的同时 也非常关注人口数据 14亿人口的话题 嗖的一下就上了热搜 大家想不想知道 14亿人口的数 ...

  5. pb 导出文件 日期格式_「案例分享」ERP系统导出数据注意事项

    古哥辅导的企业大多都上了ERP,但有些共同点就是ERP没有用好,或者没有发挥ERP的最强大功能,这里分享其中一类问题,就是从系统中导出的数据格式太多,占用空间太大,运行速度太慢等等的问题:如何解决呢? ...

  6. 猿创征文 | 微服务 Spring Boot 整合Redis 实战开发解决高并发数据缓存

    文章目录 一.什么是 缓存? ⛅为什么用缓存? ⚡如何使用缓存 二.实现一个商家缓存 ⌛环境搭建 ♨️核心源码 ✅测试接口 三.采用 微服务 Spring Boot 注解开启缓存 ✂️@CacheEn ...

  7. 「群体遗传学实战」第三课: 如何对SNP位点进行过滤

    往期教程 「群体遗传学实战」第一课: 对SNP位点进行注释 「群体遗传学实战」第二课: 画出和文章几乎一样的PCA图 SNP过滤有两种情况,一种是仅根据位点质量信息(测序深度,回帖质量等)对SNP进行 ...

  8. @scheduled注解配置时间_「玩转SpringBoot」用好条件相关注解,开启自动配置之门...

    封面图自动配置隐含两层含义,要搞清楚 上帝让程序员的发量减少,是为了让他变得更聪明,如果有一天聪明到了极点,那就是绝顶聪明. 据说在大脑高速运转下,这样更有利于散热,不至于核心温度过高而产生告警. 聪 ...

  9. python docker自动化_「docker实战篇」python的docker爬虫技术-移动自动化控制工具appium工具(17)...

    原创文章,欢迎转载.转载请注明:转载自 IT人故事会,谢谢! 原文链接地址: 「docker实战篇」python的docker爬虫技术-移动自动化控制工具appium工具(17) Appium是一个开 ...

最新文章

  1. pyspark-mongo-input-output
  2. linux/hpux 添加用户
  3. Day11多态部分-6 【1.4 多态的应用以及注意事项】
  4. .net Core 生产环境 KestrelServer + Shell 实践
  5. 服务的协作:服务间的消息传递——《微服务设计》读书笔记
  6. 【LeetCode笔记】470. 用Rand7()实现Rand10()(Java、概率)
  7. php面向对象魔术方法,PHP面向对象中的魔术方法
  8. Apache 服务器配置详解
  9. 分布式、中间件、消息队列的工作模式
  10. mysql8.0.16安装_mysql8.0.16安装(补) September 24,2019
  11. spring boot文件的上传与下载
  12. 【推】如果看了这篇文章你还不懂傅里叶变换,那就过来掐死我吧
  13. 关于IOS证书过期的问题
  14. 确定sw1开关信号输入端口_MEMS光学器件— MEMS OXC(光交叉互连开关)
  15. XM 玻璃钢一体化泵站特点及使用寿命
  16. c语言 派生,继承和派生
  17. 数据简报:上证综合指数历史走势图(1991年以来)
  18. moveit双臂机器人程序
  19. 卷积神经网络(conv2d参数含义、卷积层、池化层)
  20. 详解keras中的Mask机制

热门文章

  1. 传央行闭门会议将出台两项举措 等同降准150基点
  2. 【web】Good ad ~
  3. 关于CRM插件调试方面事
  4. 转载:【Data Management】PhotoLocations源程序
  5. 关于SOA的四个基本观点 from MS
  6. 计算机网络相关的知识,计算机网络知识整理
  7. java怎么设置不同事件_activiti 全局流程监听ActivitiEventListener,实现监听不同类型事件,不需要在acitivit中配置任务监听,非常方便...
  8. linux的目录proc pid,Linux /proc第一篇----/proc/pid记录了什么
  9. 操作无法完成_注意!城里人开始羡慕农村户口啦!4种情况却无法完成分户操作!...
  10. tomcat ajp协议安全限制绕过漏洞_国家信息安全漏洞共享平台发布Apache Tomcat漏洞安全公告...