陈老老老板
说明:工作了,学习一些新的技术栈和工作中遇到的问题,边学习边总结,各位一起加油。需要注意的地方都标红了,还有资源的分享. 一起加油。
本文是介绍Memcached与SpringBoot整合
一、Memcached介绍
(1)简介
整合之前先大致了解一下Memcached,是一个免费开源的、高性能的、具有分布式内存对象的缓存系统,它通过减轻数据库负载加速动态Web应用;(可以比作一个大内存条,要比访问数据库快得多)
(2)特点
1.简单key/value存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可。存储项由“键、过期时间、可选的标志及数据”四个部分组成;
2.功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并负责数据项的超时过期;
3.各服务器间彼此无视:不在服务器间进行数据同步;
4.O(1)的执行效率;
5.清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事先预订的时长清理超期数据;但事实上,memcached不会删除任何已缓存数据,只是在其过期之后不再为客户所见;而且,memcached也不会真正按期限清理缓存,而仅是当get命令到达时检查其时长。
(3)与Redis对比
对比参数RedisMemcached支持的数据存储类型String、list、set、zset、hash文本型、二进制型查询操作1.批量操作
2.支持事务
3.每个类型CRUD不同CRUD和少量其他命令网络模型单线程IO复用模型多线程非阻塞IO模型附加功能1.发布/订阅模式
2.主从分区
3.序列号支持
4.脚本支持多线程服务支持持久化支持RDB、AOF不支持事件库AeEventLibEvent
二、安装
(1)下载
windows版安装包下载地址:https://www.runoob.com/memcached/window-install-memcached.html
也可以在官网看更多关于Memcached的细节知识。
注:点击链接是无法下载的,复制链接,粘贴到搜索栏就能下载了
(2)解压
下载的安装包是解压缩就能使用的zip文件,解压缩完毕后会得到如下文件(可以说是超级轻量了)。
(3)执行exe
执行安装服务的命令即可,如下:
memcached.exe -d install
可执行文件只有一个memcached.exe,使用该文件可以将memcached作为系统服务启动,执行此文件时会出现报错信息,如下:
注:此处出现问题的原因是注册系统服务时需要使用管理员权限,当前账号权限不足导致安装服务失败,切换管理员账号权限启动命令行
服务安装完毕后可以使用命令启动和停止服务,如下:
memcached.exe -d start # 启动服务
memcached.exe -d stop # 停止服务
也可以在任务管理器中进行服务状态的切换
注:点击任务管理器边框,直接输入mem就可以搜索到。
三、Memcached整合SpringBoot
说明:SpringBoot并没有收录memcached为缓存解决方案,因此使用memcached需要通过手工硬编码的方式来使用。
memcached目前提供有三种客户端技术
Memcached Client for Java、
SpyMemcached、
Xmemcached,
其中性能指标各方面最好的客户端是Xmemcached,本次整合就使用Xmemcached。
(1)导入xmemcached的坐标
<dependency><groupId>com.googlecode.xmemcached</groupId><artifactId>xmemcached</artifactId><version>2.4.7</version></dependency>
(2)配置memcached,制作memcached的配置类
说明:memcached默认对外服务端口11211。
packagecom.test;importnet.rubyeye.xmemcached.MemcachedClient;importnet.rubyeye.xmemcached.MemcachedClientBuilder;importnet.rubyeye.xmemcached.XMemcachedClientBuilder;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjava.io.IOException;@ConfigurationpublicclassXMemcachedConfig{@BeanpublicMemcachedClientgetMemcachedClient()throwsIOException{MemcachedClientBuilder memcachedClientBuilder =newXMemcachedClientBuilder("localhost:11211");MemcachedClient memcachedClient = memcachedClientBuilder.build();return memcachedClient;}}
(3)使用xmemcached客户端操作缓存,注入MemcachedClient对象
code实体类
packagecom.test;importlombok.Data;@DatapublicclassSMSCode{privateString tele;privateString code;}
code工具类
@ComponentpublicclassCodeUtils{privateString[] patch ={"000000","00000","0000","000","00","0",""};publicStringgenerator(String tele){int hash = tele.hashCode();int encryption =20206666;long result = hash ^ encryption;long nowTime =System.currentTimeMillis();
result = result ^ nowTime;long code = result %1000000;
code = code <0?-code : code;String codeStr = code +"";int len = codeStr.length();return patch[len]+ codeStr;}@Cacheable(value ="smsCode",key="#tele")publicStringget(String tele){returnnull;}}
code接口
packagecom.test;publicinterfaceSMSCodeService{}
code实现类
@ServicepublicclassSMSCodeServiceImplimplementsSMSCodeService{@AutowiredprivateCodeUtils codeUtils;@AutowiredprivateMemcachedClient memcachedClient;publicStringsendCodeToSMS(String tele){String code = codeUtils.generator(tele);try{
memcachedClient.set(tele,10,code);}catch(Exception e){
e.printStackTrace();}return code;}publicbooleancheckCode(SMSCode smsCode){String code =null;try{
code = memcachedClient.get(smsCode.getTele()).toString();}catch(Exception e){
e.printStackTrace();}return smsCode.getCode().equals(code);}}
说明:设置值到缓存中使用set操作,取值使用get操作,其实更符合我们开发者的习惯。
(4)定义配置属性
a.定义配置类,加载必要的配置属性
读取配置文件中memcached节点信息
@Component@ConfigurationProperties(prefix ="memcached")@DatapublicclassXMemcachedProperties{privateString servers;privateint poolSize;privatelong opTimeout;}
b.定义memcached节点信息
memcached:servers: localhost:11211poolSize:10opTimeout:3000
c.在memcached配置类中加载信息
@ConfigurationpublicclassXMemcachedConfig{@AutowiredprivateXMemcachedProperties props;@BeanpublicMemcachedClientgetMemcachedClient()throwsIOException{MemcachedClientBuilder memcachedClientBuilder =newXMemcachedClientBuilder(props.getServers());
memcachedClientBuilder.setConnectionPoolSize(props.getPoolSize());
memcachedClientBuilder.setOpTimeout(props.getOpTimeout());MemcachedClient memcachedClient = memcachedClientBuilder.build();return memcachedClient;}}
**总结:缓存是为了减少对数据库的压力,之后会有各种缓存整合的博客。希望对您有帮助,感谢阅读
结束语:裸体一旦成为艺术,便是最圣洁的。道德一旦沦为虚伪,便是最下流的。
勇敢去做你认为正确的事,不要被世俗的流言蜚语所困扰。**
版权归原作者 陈老老老板 所有, 如有侵权,请联系我们删除。