SpringBoot(十四):SpringBoot整合Memcached

CVAT实战:从零搭建高效数据标注流水线 本文详细介绍了如何使用CVAT搭建高效的数据标注流水线,从环境部署到团队协作,再到数据流转和质量把控,全面覆盖了数据标注的各个环节。CVAT作为一款开源的数据标注工具,支持多人协作和丰富的标注类型,特别适合遥感图像等复杂场景的标注需求。通过实战案例和技巧分享,帮助读者快速掌握CVAT的核心功能,提升标注效率。 阅读详情
一、环境准备
  • memcached 1.4.5
  • SpringBoot 1.5.10.RELEASE
  • java_memcached-release_2.6.6.jar

memcached 1.4.5 windows 下载地址:http://www.runoob.com/memcached/window-install-memcached.html

danga memcached java client 下载地址:https://github.com/gwhalin/Memcached-Java-Client/downloads

pom依赖:

        <dependency>
            <groupId>commons-pool</groupId>
            <artifactId>commons-pool</artifactId>
            <version>1.5.6</version>
        </dependency>

        <dependency>
            <groupId>com.danga</groupId>
            <artifactId>java_memcached-release</artifactId>
            <version>2.6.6</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/java_memcached-release_2.6.6.jar</systemPath>
        </dependency>
二、项目结构

这里写图片描述

三、代码详情

application.yml

## Memcache 配置 ##
memcache:
  servers: 127.0.0.1:11211
  failover: true
  initConn: 100
  minConn: 20
  maxConn: 1000
  maintSleep: 50
  nagel: false
  socketTO: 3000
  aliveCheck: true

MemcacheConfiguration.java

package cn.saytime.config;

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author zh
 * @ClassName cn.saytime.config.config.MemcacheConfiguration
 * @Description Memcache配置
 */
@Configuration
public class MemcacheConfiguration {

    @Value("${memcache.servers}")
    private String[] servers;
    @Value("${memcache.failover}")
    private boolean failover;
    @Value("${memcache.initConn}")
    private int initConn;
    @Value("${memcache.minConn}")
    private int minConn;
    @Value("${memcache.maxConn}")
    private int maxConn;
    @Value("${memcache.maintSleep}")
    private int maintSleep;
    @Value("${memcache.nagel}")
    private boolean nagel;
    @Value("${memcache.socketTO}")
    private int socketTO;
    @Value("${memcache.aliveCheck}")
    private boolean aliveCheck;

    @Bean
    public SockIOPool sockIOPool () {
        SockIOPool pool = SockIOPool.getInstance();
        pool.setServers(servers);
        pool.setFailover(failover);
        pool.setInitConn(initConn);
        pool.setMinConn(minConn);
        pool.setMaxConn(maxConn);
        pool.setMaintSleep(maintSleep);
        pool.setNagle(nagel);
        pool.setSocketTO(socketTO);
        pool.setAliveCheck(aliveCheck);
        pool.initialize();
        return pool;
    }

    @Bean
    public MemCachedClient memCachedClient(){
        return new MemCachedClient();
    }

}

测试类 SpringbootMemcacheApplicationTests.java

package cn.saytime;

import com.danga.MemCached.MemCachedClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.Date;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootMemcacheApplicationTests {

    @Autowired
    private MemCachedClient memCachedClient;

    @Test
    public void contextLoads() throws InterruptedException {
        // 放入缓存
        boolean flag = memCachedClient.set("a", 1);

        // 取出缓存
        Object a = memCachedClient.get("a");
        System.out.println(a);


        // 3s后过期
        memCachedClient.set("b", "2", new Date(3000));
        Object b = memCachedClient.get("b");
        System.out.println(b);

        Thread.sleep(3000);
        b = memCachedClient.get("b");
        System.out.println(b);

    }

}

先运行memcached,然后执行test,输出结果为:

1
2
null

测试memcached存取以及失效时间成功。

四、部分操作方法
  1. set与add在key不存在时效果一致,add在key存在时不会成功。
  2. set与replace在key存在时效果一致,replace在key不存在不会成功。
五、注意点

使用danga memcached设置失效时间有两种方式:

  1. 第一种
memCachedClient.set("xx", "xx", new Date(3000));
  1. 第二种
memCachedClient.set("xx", "xx", new Date(System.currentTimeMillis() + 3 * 1000));

对比两种形式,第一种是指定key在3s后过期,第二种是指定key在xxxx-xx-xx xx:xx:xx 时间点失效,如果服务器时间跟客户端时间不一致,就会跟想要的结果不一样,比如客户端现在时间点为2018-01-01 00:00:00,服务端时间为2018-01-01 00:00:10,服务端时间快10s,那么如果客户端使用第二种方式设置30s后失效,也就是2018-01-01 00:00:30失效,实际上客户端想要的是30s后失效,而服务端20s就将key失效了。

从上可以发现,最好是使用第一种形式,但是第一种形式在某些时间也会存在问题,比如如果设定的时间小于1s,会发现key会永久保存,不会在指定时间失效,原因可以通过源码得到。

我们使用的MemCachedClient,在configuration里面是直接new的,也就是

new MemCachedClient();

查看MemCachedClient的set带时间方法,可以看到:

    public boolean set(String var1, Object var2, Date var3) {
        return this.client.set(var1, var2, var3);
    }

而这个client是在构造方法实例化的,也就是

    public MemCachedClient() {
        this((String)null, true, false);
    }

    public MemCachedClient(String var1, boolean var2, boolean var3) {
        this.BLAND_DATA_SIZE = "       ".getBytes();
        if(var3) {
            this.client = new BinaryClient(var1);
        } else {
            this.client = (MemCachedClient)(var2?new AscIIClient(var1):new AscIIUDPClient(var1));
        }

    }

可以看到实际上执行类是AscIIClient,接下来我们查看AscIIClient的带失效时间的set方法

    public boolean set(String var1, Object var2, Date var3) {
        return this.set("set", var1, var2, var3, (Integer)null, Long.valueOf(0L), this.primitiveAsString);
    }

    private boolean set(String var1, String var2, Object var3, Date var4, Integer var5, Long var6, boolean var7) {

        // xxx

        // 这里的var4就是传入的失效时间
        String var10 = var1 + " " + var2 + " " + var9 + " " + var4.getTime() / 1000L + " ";

        // xxx
    }

可以看到这里有执行

var4.getTime() / 1000L

也就是在var.getTime()小于1的时候,得到的结果是0,而0表示永久有效。

我们来测试一下,在代码中加入以下代码

        memCachedClient.set("c", "3", new Date(500));
        Object c = memCachedClient.get("c");
        System.out.println(c);

        Thread.sleep(1000);
        c = memCachedClient.get("c");
        System.out.println(c);

设置时间为0.5s,然后立马取出结果,然后等待1s之后,再次取出结果.

通过上面的说明,结果可想而知。

3
3

说明当时间小于1s的时候,使用第一种方式会造成指定时间不生效,key永久存在,这种时间如果客户端服务端时间没有误差的时候,使用第二种形式。

关于memcached最大设置30天有效的情形暂时没有测试。

多仓智能订单路由与动态优化方案设计 现在有很多商家会有多个仓库,并分布在不同的城市中,当用户下单后会根据商品库存及订单信息将订单分配到对应的仓库进行发货,如就近原则,本期基于多仓库设计一套订单路由方案,包含核心逻辑、规则优先级和实施方案,适用于多仓协同的订单自动分配场景 阅读详情

相关推荐

电磁场仿真软件:Sonnet_(12).Sonnet与其他软件的集成

Sonnet作为电磁场仿真领域的强大工具,不仅能够独立完成复杂的仿真任务,还可以通过与其他软件的集成,实现更高效的工作流程和更广泛的功能扩展。通过与CAD、EDA、数据处理软件、MATLAB、Python以及云计算平台的集成,Sonnet用户可以更好地利用现有设计资源,进行参数优化和结果分析,从而提升设计和仿真效率。希望本节的内容能够帮助你更好地理解和应用Sonnet的集成功能。

kkchenjj的博客 1392

SpringBoot篇》18.SpringBoot整合Memcached缓存超详细教程

整合之前先大致了解一下Memcached,是一个​免费开源的、高性能的、具有分布式内存对象的缓存系统,它通过减轻数据库负载加速动态Web应用;(可以比作一个大内存条,要比访问数据库快得多)读取配置文件中memcached节点信息}

陈老老老板的博客 1万+

关于React Native Android找不到node的错误

最近,按照官方文档初始化了一个React Native项目,但是在Android端运行的时候,报了如下的一个错误。 org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:recordFilesBeforeBundleCommandDebug'. Caused by: org.gradle.process.internal.ExecException: A problem occurred starting p

xiangzhihong8的专栏 4224

springBoot 集成 memcached

springBoot 集成 memcached 缓存,简介和安装

快乐的小三菊的博客 2196

SpringBoot整合Memcached

SpringBoot整合Memcached

yuechuzhixing的博客 550

MemcachedspringBoot 集成 memcached 两万字长文带你认识memcached

memcached原理及安装,springboot集成memcached

Hanson的博客 1742

Spring Boot 集成 Memcached:从基础到高级优化的实战指南

Memcached 最初由 LiveJournal 为解决高并发场景下的数据库压力问题而开发。它通过将数据存储在内存中,极大地提高了数据的读取速度,同时支持分布式架构,能够通过多台服务器组成集群,从而扩展存储容量和提升可用性。高性能:数据存储在内存中,读取速度极快,通常能达到毫秒级甚至更低的延迟。分布式:支持多节点部署,可水平扩展,适用于大规模分布式系统。简单易用:提供了简洁的 API 接口,支持多种编程语言,包括 Java、Python、PHP 等。灵活的数据存储。

715

java web 之springboot教程(十四)----整合Memcached

Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。 Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。 Memcached是一种基于内存的key-value存储,用...

Eric 3074

十四springboot整合WebSocket

springboot整合WebSocket

weixin_56995925的博客 3万+

Memcached整合SpringBoot

一、Memcached相关配置项 二、整合过程 1、新建SpringBoot项目并引入Memcached依赖 <!-- 引入XMemcached --> <dependency> <groupId>com.googlecode.xmemcached</groupId> <artifactId>xmemca...

走马川行雪的博客 728

SpringBoot 整合 memcached

SpringBoot 整合 memcached导入Apache POI Maven jar包yaml文件配置memcached配置编写工具类 导入Apache POI Maven jar包 <!-- Springboot 整合 memcached --> <dependency> <groupId>com.googlecode.xmemcached&l...

Jian 242

SpringBoot整合Memcached缓存

memcached目前提供有三种客户端技术,分别是Memcached Client for Java、SpyMemcached和Xmemcached,其中性能指标各方面最好的客户端是Xmemcached,本次整合就使用这个作为客户端实现技术了。由于memcached未被springboot收录为缓存解决方案,因此使用memcached需要通过手工硬编码的方式来使用,于是前面的套路都不适用了,需要自己写了。上述代码中对于服务器的配置使用硬编码写死到了代码中,将此数据提取出来,做成独立的配置属性。

ITBOY_ITBOX博客 257

springboot快速整合Memcached缓存技术

memcached是一套分布式的快取系统,与redis相似,当初是Danga Interactive为了LiveJournal所发展的,但被许多软件(如MediaWiki)所使用。这是一套开放源代码软件,以BSD license授权协议发布。它通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用速度,提高扩展性。Memcached的API使用32位元的循环冗杂校验计算键值后,将资料分散在不同机器上。当表格慢了以后,接下来新增的资料会以LRU机制替换掉。

一个菜鸡的博客 423

Memcached的安装教程,和SpringBoot简单整合Memcached

我们首先可以在官网上下载Memcached的安装包 https://www.memcached.org/downloads 你可以在官网进行下载 注意:在我们安装Memcached的时候首先要以管理员的身份去运行cmd命令

code-king的博客 378

【一】springboot整合swagger

springboot整合swagger

weixin_56995925的博客 2万+

Springboot整合Memcached

一、首先我们使用Centos架设memcached服务器,我们使用Docker来架设Memcached服务 1. 拉取镜像 docker pull memcached:1.5.16 2. 启动容器 docker run --name memcached -p 11211:11211 -d memcached:1.5.16 memcached -m 128 好了,使用docker架设m...

宝华的小岛 425

SpringBoot集成Memcached

SpringBoot集成Memcached

YIYIYI 1235

SpringBoot如何整合RabbitMQ

好久没有写博客了,终日忙于生计,真是人过30不如狗啊,但写点什么好呢?想想当年自己入门时候那痛苦的经历,还是写点优质实用的入门文章吧,既满足了自己好为人师的本性,也能给后辈提供一些帮助。今天咱们就来聊聊springboot整合rabbitmq的那些事吧。SpringBoot的风头之盛不多说了,我是在2016年首次接触springboot的,当时自己要写个APP,后台采用了springboot。当时还真是个新鲜事物,没想到以后几年的发展犹如黄河泛滥,一发不可收拾…rabbitmq官网https。...

ShuSheng007的程序人生 1万+

[SpringBoot系列]SpringBoot如何整合SSMP

基于SpringBoot实现SSMP整合 整合JUnit 整合MyBatis 整合MyBatis-Plus 整合Druid

十八岁讨厌编程的博客 2501

【十二】springboot整合WebService

springboot整合WebService

weixin_56995925的博客 1万+

51单片机读取MPU6050角度(采用互补滤波_串口显示角度值)

51单片机读取MPU6050角度,串口显示角度值。STC89C52单片机,x和y轴数据是采用互补滤波融合加速度计和陀螺仪数据,T0设定采样周期; z轴只采用陀螺仪数据,有一定的温飘。串口波特率19200,输出角度值,而非MPU6050的原始值。

EPLAN 2025虚拟机文件baiduyun

内容概要:本文提供了一个关于EPLAN Electric 2025(64位)软件的网盘下载链接,适合人群:从事电气工程、自动化设计及相关技术领域的工程师和技术人员,以及有EPLAN软件使用需求的学习者或研究人员;熟悉虚拟机环境操作者更佳; 使用场景及目标:①用于安装和运行EPLAN Electric P8 2025版本进行电气图纸绘制、项目设计与工程管理;②结合虚拟机环境实现软件的隔离运行,避免系统冲突,提升兼容性和安全性;③帮助无法通过官方渠道获取安装资源的用户完成软件部署; 阅读建议:下载后建议校验文件完整性,确认版本信息与系统要求,在虚拟机中安装时注意配置足够的硬件资源,并做好系统快照以防异常。同时尊重知识产权,建议在试用后购买正版授权。

上一篇: SpringCloud(六):服务网关(Zuul)
下一篇: SpringBoot(十五):SpringBoot整合Redis
saytime
博客等级 码龄12年 897粉丝 69原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值