【开发篇】十一、SpringBoot缓存底层实现技术的切换为Ehcache、Redis、Memcached

news2024/11/17 7:24:39

文章目录

  • 0、补充:数据淘汰策略
  • 1、切换为Ehcache
  • 2、切换为Redis
  • 3、切换为memcached--安装与启停
  • 4、切换为memcached--整合

SpringBoot提供了缓存的统一整合接口,方便缓存技术的开发与管理:

  • Generic
  • JCache
  • Ehcache
  • Hazelcast
  • Infinispan
  • Couchbase
  • Redis
  • Caffeine
  • Simple(默认)
  • memcached

0、补充:数据淘汰策略

当遇到某些场景,如到达缓存最大内存时还有数据往进来写,此时就会按照配置的数据淘汰策略删数据,常用的淘汰策略有:

  • volatile-lru:挑选最近最少使用的数据淘汰
  • volatile-lfu:挑选最近使用次数最少的数据淘汰
  • volatile-ttl:挑选将要过期的数据淘汰
  • volatile-random:任意选择数据淘汰

简单说,LRU就是最近没怎么用到的数据,LFU就是使用最少的数据:

在这里插入图片描述
如上图,9s内,age这个key的数据最近一次使用是第5s的时候,其他数据则在第7、8、9秒时访问过,按LRU就淘汰它。但按LFU,最少使用的是gender这个key的数据,只用1次,LFU下淘汰它。

1、切换为Ehcache

首先引入Ehcache依赖:

<dependency>   
	<groupId>net.sf.ehcache</groupId>    
	<artifactId>ehcache</artifactId>
</dependency>

版本不用管,spring-boot-parent中依赖管理有这个依赖,用boot调好的版本就好:

在这里插入图片描述
再将缓存类型设置为ehcache:

spring:  
  cache:    
    type: ehcache    
    ehcache:      
      config: classpath:ehcache.xml

在这里插入图片描述

类路径resources下提供ehcache配置文件ehcache.xml:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">
             
    <!--默认缓存策略 -->    
    <!-- external:是否永久存在,设置为true则不会被清除,此时与timeout冲突,通常设置为false-->
    <!-- diskPersistent:是否启用磁盘持久化-->   
    <!-- maxElementsInMemory:最大缓存数量-->    
    <!-- overflowToDisk:超过最大缓存数量是否持久化到磁盘-->    
    <!-- timeToIdleSeconds:最大不活动间隔,设置过长缓存容易溢出,设置过短无效果-->    
    <!-- timeToLiveSeconds:最大存活时间-->    
    <!-- memoryStoreEvictionPolicy:缓存清除策略-->    
    <defaultCache           
    	eternal="false"            
    	diskPersistent="false"            
    	maxElementsInMemory="1000"           
    	overflowToDisk="false"           
    	timeToIdleSeconds="60"           
    	timeToLiveSeconds="60"           
    	memoryStoreEvictionPolicy="LRU" />
</ehcache>
<!-- 不同开头的key,往往策略不同,比如过期时间不同,那在这里加不同的缓存区域就行--> 

为了适配之前代码里@Cacheable的value属性:

//不写value那就是defaultCache
@CachePut(value = "telCode",key = "#tel")
...

可在默认存储区外再加一块区域的定义:

在这里插入图片描述

重启服务,测试下上篇的验证码的生成与校验接口都正常,这就完成了底层缓存技术的切换,从默认的Simple切换为Ehcache。SpringBoot提供了一套标准的Cache解决方案接口,换底层的技术实现并不用去改动原先的代码实现,这就是设计优雅的地方!

2、切换为Redis

加入Redis坐标(缓存供应商实现):

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

修改配置,这里除了redis.host,过期时间等配置也写在了配置文件里,其实应该用配置类,不同的key设置不同的过期时间:

spring:  
  redis:    
    host: localhost    
    port: 6379  
  cache:    
    type: redis    
    redis:
      use-key-prefix: true      # 是否使用前缀名(肯定要用,不用前缀,很容易重复,导致bug)
      key-prefix: sms_          # 追加自定义前缀名,除了代码里的前缀key,再统一加一个      
      time-to-live: 10s         # 有效时长     
      cache-null-values: false  # 是否允许存储空值

到此,切换完成,调用下之前生成验证码的接口:

在这里插入图片描述

3、切换为memcached–安装与启停

memcached的安装:https://www.runoob.com/memcached/window-install-memcached.html ,解压后进入memcached目录:

在这里插入图片描述

打开cmd窗口执行以下指令:

# 安装
memcached.exe -d install

可能报错安装失败:

在这里插入图片描述
搜索cmd,右键以管理员身份运行,重新打开cmd执行以上安装指令即可。

在这里插入图片描述
启动:

memcached.exe -d start

停止:

memcached.exe -d stop

4、切换为memcached–整合

关于memcached客户端选择:

  • Memcached Client for Java:最早期客户端,稳定可靠,用户群广
  • SpyMemcached:效率更高
  • Xmemcached:并发处理更好

这里选择Xmemcached,SpringBoot未提供对memcached的整合,需要使用硬编码方式实现客户端初始化管理。首先导入Xmemcache坐标(缓存供应商实现):

<!--注意,从parent的dependencyManager中找不到xmemcached,
	即SpringBoot不维护它的版本,因此version必须自己加-->
<dependency>    
	<groupId>com.googlecode.xmemcached</groupId>
	<artifactId>xmemcached</artifactId>    
	<version>2.4.7</version>
</dependency>

既然不受Spring管控,那在配置类中自己@Bean来创建一个客户端操作对象:

@Configuration
public class XMemcachedConfig {      
	@Bean    
	public MemcachedClient getMemcachedClinet() throws IOException {        
		MemcachedClientBuilder builder = new XMemcachedClientBuilder("localhost:11211");        
		MemcachedClient memcachedClient = builder.build();        
		return memcachedClient;   
	}
}

改造验证码的获取与校验方法:set存get取

@Service
public class SMSCodeServiceMemcacheImpl implements SMSCodeService {    

	@Autowired   
	private MemcachedClient memcachedClient;
	    
	@Override    
	public String sendCodeToSMS(String tele) {        
		String code = CodeUtils.generator(tele);       //将数据加入memcache        
		try {            
			memcachedClient.set(tele,0,code);		// key,timeout,value        
		} catch (Exception e) {            
			e.printStackTrace();        
		}       
		return code;    
	}
}

@Override    
public boolean checkCode(String tel,String code) {        
	String value = null;        
	try {           
		value = memcachedClient.get(tel) + "";      //Object转String,别toString,会空指针
	} catch (Exception e) {            
		e.printStackTrace();       
	}         
	return code.equals(value);    
}

有点low,虽然Spring容器不管控我,自然也不会读我写application.yaml中的配置,但我可以自己写,然后自己读取yaml,然后给代码中用,这样配置统一管理,优雅且合理(当然你也可以定义个变量,然后@Value从yaml中取,看配置的数量多不多吧)。首先在yaml中写配置文件:

memcached:    
  # memcached服务器地址    
  servers: localhost:11211    
  # 连接池的数量    
  poolSize: 10    
  # 设置默认操作超时    
  opTimeout: 3000

定义对应的接参实体类,加载yaml配置:

@Component
@ConfigurationProperties(prefix = "memcached")
@Data
public class XMemcachedProperties {    

	private String servers;    
	
	private Integer poolSize;    
	
	private Long opTimeout;
	
}

此时,上面创建客户端操作Bean的代码可以优化为:

@Configuration
public class XMemcachedConfig {      

	@Resource
	private XMemcachedProperties xMemcachedProperties;
	
	@Bean    
	public MemcachedClient getMemcachedClinet() throws IOException {   
	     
		MemcachedClientBuilder builder = new XMemcachedClientBuilder(xMemcachedProperties.getServers());  

  		builder.setConnectionPoolSize(xMemcachedProperties.getPoolSize());
		     
		MemcachedClient memcachedClient = builder.build();        
		
		return memcachedClient;  
		 
	}
}

切换完成,调用下之前的接口,验证码缓存的读写都正常。总结就是:

  • 客户端操作Bean的初始化
  • get、set读写

这地方要关注的重点是自己操作客户端对象,干Spring没干的事,以及yaml配置自己管理自己读取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1047452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《视觉 SLAM 十四讲》V2 ——第3讲

关于本笔记的说明&#xff1a; 最好跟着 原书 整理个人笔记&#xff0c;他人笔记仅适合参考部分内容。 ———————— B站链接 高翔博客链接 百度网盘链接&#xff1a;https://pan.baidu.com/s/1VsrueNrdqmzTvh-IlFBr9Q 提取码&#xff1a;vfhe github源码链接V2 《视觉…

OpenCV读取图像时按照BGR的顺序HWC排列,PyTorch按照RGB的顺序CHW排列

OpenCV读取RGB图像 在OpenCV中&#xff0c;读取的图片默认是HWC格式&#xff0c;即按照高度、宽度和通道数的顺序排列图像尺寸的格式。我们看最后一个维度是C&#xff0c;因此最小颗粒度是C。 例如&#xff0c;一张形状为2562563的RGB图像&#xff0c;在OpenCV中读取后的格式…

阿里云服务器方升架构、自研硬件、AliFlash技术创新

阿里云服务器技术创新&#xff1a;服务器方升架构及自研硬件、自研存储硬件AliFlash和阿里云异构计算加速平台&#xff0c;阿里云百科分享阿里云服务器有哪些技术创新&#xff1a; 目录 服务器技术创新 服务器方升架构及自研硬件 自研存储硬件AliFlash 阿里云异构计算加速…

进入k8s下mysql docker容器,设置慢查询开关

服务器账号信息&#xff1a;wps/kingsoft 进入mysql容器&#xff1a; kc exec -ti -n kube-public mysql-0 -- bash 访问数据库&#xff1a; mysql -h10.13.83.171 -uhuangweiheng -phuangweiheng_password; 数据库超管&#xff1a;root/wpsepmysql sudo service mysql r…

QQ农场怀旧版搭建(附带搭建完成示例)

QQ农场搭建 示例均在宝塔面板搭建搭建完成网站,欢迎━(&#xff40;∀)ノ亻!大家种种菜 http://farm.dreamlove.top/如果不出意外应该会一直续费下去,毕竟linux服务器便宜很多~ 所需依赖 mysql 5.5 php 5.4 nginx 1.22下载农场文件并安装好了依赖 下载地址1:https://cloudr…

Cloudera Manager-6.2.0安装文档

环境准备 安装包地址 链接&#xff1a;https://pan.baidu.com/s/1QrLsXynmopqoZhDkoIAihg 提取码&#xff1a;kaoi 虚拟机建议配置 至少3台节点&#xff0c;server节点安装cloudera server服务和mysql服务 server节点 ​ 内存&#xff1a;3GB以上 ​ 存储&#xff1a;4…

react 网页/app复制分享链接到剪切板,分享到国外各大社交平台,通过WhatsApp方式分享以及SMS短信方式分享链接内容

1.需求 最近在做一个国际网站app,需要把app中某个页面的图文链接分享到国外各大社交平台上(facebook,whatapp,telegram,twitter等),以及通过WhatApp聊天方式分享&#xff0c;和SMS短信方式分享链接内容&#xff0c;该怎么做呢&#xff1f;图示如下: 分享到国外各大社交平台&am…

详解Avast Driver Updater:电脑驱动更新工具的利器还是多余的软件?

亲爱的读者朋友们&#xff0c;你是不是经常为电脑的驱动问题而烦恼&#xff1f;如果是的话&#xff0c;你可能会对这款软件——Avast Driver Updater 电脑驱动更新工具感兴趣。但在你决定尝试之前&#xff0c;不妨先和我一起深入探讨一下它的优点、缺点以及它适用的使用场景。 …

移动机器人建模两轮驱动与四轮驱动

本文章仅记录小编再学习过程中的知识总结&#xff0c;若有不对之处请批评指正&#xff0c;互相学习&#xff0c;共同进步。 一、两轮驱动运动学模型 示例最后得出&#xff0c;该机器人会沿全局参考系的Y轴以速度1的旋转的同时&#xff0c;以速度3瞬时的移动。 二、四轮驱动运动…

Ps:抓手工具

抓手工具 Hand Tool常用于在文档窗口中平移图像&#xff0c;方便观察大尺寸图像&#xff08;或者被放大的图像&#xff09;的局部细节&#xff0c;是操作 Ps 最常用的辅助工具之一。 快捷键&#xff1a;H ◆ ◆ ◆ 常用操作方法与技巧 1、快捷键 H 是一个弹簧键。即&#xff…

【Linux】 df命令使用

df命令 df 命令&#xff0c;用于显示 Linux 系统中各文件系统的硬盘使用情况&#xff0c;包括文件系统所在硬盘分区的总容量、已使用的容量、剩余容量等 执行命令结果 各列信息的含义分别是&#xff1a; Filesystem&#xff1a;表示该文件系统位于哪个分区&#xff0c;因此该…

算法与数据结构-AC自动机

文章目录 什么是多模式串匹配算法基于单模式串和 Trie 树实现的敏感词过滤经典的多模式串匹配算法&#xff1a;AC 自动机 什么是多模式串匹配算法 单模式串匹配算法&#xff0c;是在一个模式串和一个主串之间进行匹配&#xff0c;也就是说&#xff0c;在一个主串中查找一个模式…

精准纠错音错节奏 钢琴老师都在推荐小叶子智能陪练

如今市面上帮助孩子练琴的软件越来越多&#xff0c;有线上陪练的&#xff0c;还有AI陪练。产品琳琅满目&#xff0c;家长也挑花了眼。如何挑选一款真正能帮助孩子练琴的App呢&#xff1f;作为从业十余年的钢琴老师&#xff0c;可以分享三点建议给大家。 看品牌实力是否过硬 现…

二维平面扭曲的python实现及思路

二维平面扭曲的python实现及思路 缘起原理实现代码 缘起 工作需要&#xff0c;需要一个尝试改变设备布点的方法&#xff0c;在csdn闲逛时&#xff0c;偶然间发现这样的一篇文章 二维扭曲&#xff0c;参考这位博主的文章&#xff0c;我对其内容进行复现和进一步挖掘。若有侵权或…

基于STM32+OneNet设计的GPS定位器(ESP8266)

一、 设计说明 随着移动互联网和物联网技术的快速发展,越来越多的智能设备被广泛应用于各个领域。其中,GPS定位器是一种常见的智能设备,可以用于车辆、家庭、宠物等物品的实时定位。在实际使用中,GPS定位器需要具有实时上传位置数据、低功耗、精度高等特点。 当前提出了一…

Ctfshow web入门 代码审计篇 web301-web310 详细题解 全

CTFshow 代码审计 web301 下载的附件的目录结构如下&#xff1a; 开题后界面&#xff0c;看见输入框&#xff0c;感觉是sql。 大概浏览一遍源码&#xff0c;我们可以发现在checklogin.php文件中有无过滤的SQL语句&#xff0c;SQL注入没得跑了。 这题SQL注入有三种做法。 方法一…

java进阶-Netty

Netty 在此非常感谢尚硅谷学院以及韩顺平老师在B站公开课 Netty视频教程 Netty demo代码文件 I/O 说NIO之前先说一下BIO&#xff08;Blocking IO&#xff09;,如何理解这个Blocking呢&#xff1f;客户端监听&#xff08;Listen&#xff09;时&#xff0c;Accept是阻塞的&…

游戏模板:MFPS 2.0: Multiplayer FPS

MFPS 2.0: Multiplayer FPS Most complete multiplayer first-person shooter kit. 可编程渲染管线&#xff08;SRP&#xff09;兼容性 Unity可编程渲染管线&#xff08;SRP&#xff09;是让您能够通过C#脚本控制渲染的一个功能。SRP是支撑通用渲染管线&#xff08;URP&#…

紫光同创FPGA图像视频采集系统,基于OV7725实现,提供工程源码和技术支持

目录 1、前言免责声明 2、设计思路框架视频源选择OV7725摄像头配置及采集动态彩条HDMA图像缓存输入输出视频HDMA缓冲FIFOHDMA控制模块HDMI输出 3、PDS工程详解4、上板调试验证并演示准备工作静态演示动态演示 5、福利&#xff1a;工程源码获取 紫光同创FPGA图像视频采集系统&am…

全球性区块链服务网络(BSN)机制体系、关键技术和应用项目科技成果鉴定会在北京举行

原标题&#xff1a;《全球性区块链服务网络&#xff08;BSN&#xff09;机制体系、关键技术和应用项目科技成果鉴定会在北京举行》 2023年9月17日&#xff0c;“全球性区块链服务网络&#xff08;BSN&#xff09;机制体系、关键技术和应用”科技成果鉴定会在北京举行。鉴定委员…