Memcached

行稳致远方發表於2024-05-26

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);
        }
    }
    

相關文章