zoukankan      html  css  js  c++  java
  • springboot使用memcache缓存

    Memcached简介

      Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

      Memcached 的守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。但是它并不提供冗余(例如,复制其hashmap条目);当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失。  

    存储方式

      为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

    Memcached 安装

      我是在windows下安装使用的。

      32位请下载这里: 链接: https://pan.baidu.com/s/1qPxMDPEtsCFBWaG3bsVT6Q 密码: hrih

      下载之后解压就行。

      64位先下载32位,进行解压,接着下载这里:链接: https://pan.baidu.com/s/1X3MeLgB5QObksm35LKZ-eg 密码: xbn4  

      解压之后,把里面的三个文件复制到32位的里面,覆盖即可。

      我解压之后放在E盘:

      使用管理员权限运行以下命令

      E:memcachememcached.exe -d install

    启动关闭卸载memcache

      启动: E:memcachememcached.exe -d start

      关闭: E:memcachememcached.exe -d stop

      卸载: E:memcachememcached.exe -d uninstall

    在spring boot中使用memcache作为缓存

      1.pom.xml依赖

      

            <!--memcache-->
            <dependency>
                <groupId>commons-pool</groupId>
                <artifactId>commons-pool</artifactId>
                <version>1.5.6</version>
            </dependency>
            <dependency>
                <groupId>com.whalin</groupId>
                <artifactId>Memcached-Java-Client</artifactId>
                <version>3.0.2</version>
            </dependency>

      2.application.properties

      

    memcache.servers=127.0.0.1:11211
    memcache.failover=true
    memcache.initConn=10
    memcache.minConn=20
    memcache.maxConn=1000
    memcache.maintSleep=50
    memcache.nagle=false
    memcache.socketTO=3000
    memcache.aliveCheck=true

      3.MemcacheConfiguration

    @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.nagle}")
        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();
        }
    
    }

      4.MemcacheController

      

    @Controller
    public class MemcacheController {
    
        @Autowired
        private MemCachedClient memCachedClient;
    
        /**
         * memcache缓存
         */
        @RequestMapping("/memcache")
        @ResponseBody
        public String memcache() throws InterruptedException{
            // 放入缓存
            boolean flag = memCachedClient.set("mem", "name");
            // 取出缓存
            Object value = memCachedClient.get("mem");
            System.out.println(value);
            // 3s后过期
            memCachedClient.set("num", "666", new Date(3000));
            /*memCachedClient.set("num", "666", new Date(System.currentTimeMillis()+3000));与上面的区别是当设置了这个时间点
            之后,它会以服务端的时间为准,也就是说如果本地客户端的时间跟服务端的时间有差值,这个值就会出现问题。
            例:如果本地时间是20:00:00,服务端时间为20:00:10,那么实际上会是40秒之后这个缓存key失效*/
            Object key = memCachedClient.get("num");
            System.out.println(key);
            //多线程睡眠3s
            Thread.sleep(3000);
            key  = memCachedClient.get("num");
            System.out.println(value);
            System.out.println(key );
            return "success";
        }
    }

      5.控制台输出:

      name 

      666

      name

      null

      总结:memcache通过set方法把值存入都memcache缓存中;通过get方法把值取出来;通过设置过期时间,使其失效。

    * Memcache:不支持持久化、只支持key-value键值、多线程 、集群分布式
    * Redis:支持持久化、丰富的数据类型、单线程 、集群分布式
    * Ehcache:直接在jvm虚拟机中缓存,速度快,效率高,单个应用或者对缓存访问要求很高的应用,用ehcache。核心程序仅仅依赖slf4j。

  • 相关阅读:
    Apache Beam入门及Java SDK开发初体验
    fetch的请求
    Spring Cache 带你飞(一)
    存储技术发展过程
    Redis 高阶数据类型重温
    Redis 基础数据类型重温
    [源码解析] PyTorch 分布式(1)------历史和概述
    [源码解析] PyTorch 如何实现后向传播 (4)---- 具体算法
    [源码解析] Pytorch 如何实现后向传播 (3)---- 引擎动态逻辑
    [源码解析] Pytorch 如何实现后向传播 (2)---- 引擎静态结构
  • 原文地址:https://www.cnblogs.com/heqiyoujing/p/9621751.html
Copyright © 2011-2022 走看看