Memcached

1.Memcache

  1. 官网,http://memcached.org/。
  2. 安装和商用命令。
    1. 下载memcache包,包含libgcc_s_sjlj-1.dll、memcached.exe、pthreadGC2.dll。
    2. 管理员身份按照。memcached.exe -d install。
    3. 启动。memcached.exe -d start。
    4. 停止。memcached.exe -d stop。
  3. docket创建memcache容器。
docker run --name memcache -d -p 11211:11211 -e MEMCACHED_USERNAME=root -e MEMCACHED_PASSWORD=123456 -e MEMCACHED_MAX_MEMORY=64m memcached

2.Memcache和Redis的区别

  1. Memcache,只支持k/v数据结构,可以设置过期时间,Memcache一般只用来做缓存。Redis支持的数据结构更加的丰富,如支持string、hash、list、set、zset,Redis除了进行缓存之外,还可以做分布式锁、订阅/发布、积分榜。

  2. Memcache不支持持久化,Redis支持持久化。

  3. Memcache直接将数据保存在物理内存中,Redis有自己的VM机制。

  4. Redis使用的单线程IO复用网络模型, 而Memcached多线程非阻塞IO复用模型。

  5. Value值大小不同:Redis最大可以达到512MB;Memcached只有1MB。

  6. Memcache不能将数据迁移到其他的Memcache中;Redis主从直接可以进行数据同步。

  7. 在一些老的项目中会使用到Memcache,通过如果项目中需要缓存文件、图片数据可以使用Memcache。

3.Java中操作memcache

  1. Java有三种方式可以用来操作memcache,分别为Memcached-java-client、Spymemcached和XMemcached。主要使用XMemcached操作。
  2. 引入依赖。
<dependency>
    <groupId>com.googlecode.xmemcached</groupId>
    <artifactId>xmemcached</artifactId>
    <version>2.4.8</version>
</dependency>
  1. 代码操作。
public static void test() throws Exception {
    // 服务地址和端口
    String services = "127.0.0.1:11211";

    // 创建客户端连接
    MemcachedClient memcachedClient = new XMemcachedClientBuilder(services)
        .build();

    // get
    Object o = memcachedClient.get("k1");
    System.out.println(o); // null

    //  set
    boolean set = memcachedClient.set("k1", 0, "v1");
    System.out.println(set); // true

    o = memcachedClient.get("k1");
    System.out.println(o); // v1
}
  1. 整合Springboot并使用线程池维护memcache连接。

    1. 引入依赖。
    <dependency>
        <groupId>com.googlecode.xmemcached</groupId>
        <artifactId>xmemcached</artifactId>
        <version>2.4.8</version>
    </dependency>
    
    1. application.yaml中配置ip和端口信息。
    memcached:
      # memcached服务器集群(格式为host:port,多个服务器之间用空格隔开)
      server: 127.0.0.1:11211
      # 调用的超时时间
      opTimeout: 3000
      # 连接池大小
      poolSize: 10
      # 是否开启失败模式
      failureMode: false
    
    1. 添加XMemcachedConfig配置类。
    @Configuration
    public class XMemcachedConfig {
    	
    	@Value("${memcached.server:127.0.0.1:11211}")
    	private String server;
    	
    	@Value("${memcached.opTimeout:3000}")
    	private Integer opTimeout;
    	
    	@Value("${memcached.poolSize:10}")
    	private Integer poolSize;
    	
    	@Value("${memcached.failureMode:true}")
    	private boolean failureMode;
    	
    	@Bean(name = "memcachedClient")
    	public MemcachedClient getBuilder() throws IOException {
    		MemcachedClientBuilder memcachedClientBuilder = new XMemcachedClientBuilder(server);
    		// 采用一致性哈希算法
    		memcachedClientBuilder.setSessionLocator(new KetamaMemcachedSessionLocator());
    		// 操作的超时时间
    		memcachedClientBuilder.setOpTimeout(opTimeout);
    		// 采用二进制传输协议(默认为文本协议)
    		memcachedClientBuilder.setCommandFactory(new BinaryCommandFactory());
    		// 设置连接池的大小
    		memcachedClientBuilder.setConnectionPoolSize(poolSize);
    		// 是否开起失败模式
    		memcachedClientBuilder.setFailureMode(failureMode);
    		return memcachedClientBuilder.build();
    	}
    }
    
    1. 使用。
    @Service
    public class UserService {
        
        @Resource
        private MemcachedClient memcachedClient;
        
        public void getUserById(Long id) throws InterruptedException, TimeoutException, MemcachedException {
            // get(key)会抛出很多的异常,在项目中可以在封装一层,将异常处理掉。
            Object o = memcachedClient.get("user:" + id);
            System.out.println(o);
        }
    }
    
posted @ 2024-05-26 11:50  行稳致远方  阅读(43)  评论(0)    收藏  举报