1.Memcache
- 官網,http://memcached.org/。
- 安裝和商用命令。
- 下載memcache包,包含libgcc_s_sjlj-1.dll、memcached.exe、pthreadGC2.dll。
- 管理員身份按照。memcached.exe -d install。
- 啟動。memcached.exe -d start。
- 停止。memcached.exe -d stop。
- 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的區別
-
Memcache,只支援k/v資料結構,可以設定過期時間,Memcache一般只用來做快取。Redis支援的資料結構更加的豐富,如支援string、hash、list、set、zset,Redis除了進行快取之外,還可以做分散式鎖、訂閱/釋出、積分榜。
-
Memcache不支援持久化,Redis支援持久化。
-
Memcache直接將資料儲存在實體記憶體中,Redis有自己的VM機制。
-
Redis使用的單執行緒IO複用網路模型, 而Memcached多執行緒非阻塞IO複用模型。
-
Value值大小不同:Redis最大可以達到512MB;Memcached只有1MB。
-
Memcache不能將資料遷移到其他的Memcache中;Redis主從直接可以進行資料同步。
-
在一些老的專案中會使用到Memcache,透過如果專案中需要快取檔案、圖片資料可以使用Memcache。
3.Java中操作memcache
- Java有三種方式可以用來操作memcache,分別為Memcached-java-client、Spymemcached和XMemcached。主要使用XMemcached操作。
- 引入依賴。
<dependency>
<groupId>com.googlecode.xmemcached</groupId>
<artifactId>xmemcached</artifactId>
<version>2.4.8</version>
</dependency>
- 程式碼操作。
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
}
-
整合Springboot並使用執行緒池維護memcache連線。
- 引入依賴。
<dependency> <groupId>com.googlecode.xmemcached</groupId> <artifactId>xmemcached</artifactId> <version>2.4.8</version> </dependency>
- application.yaml中配置ip和埠資訊。
memcached: # memcached伺服器叢集(格式為host:port,多個伺服器之間用空格隔開) server: 127.0.0.1:11211 # 呼叫的超時時間 opTimeout: 3000 # 連線池大小 poolSize: 10 # 是否開啟失敗模式 failureMode: false
- 新增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(); } }
- 使用。
@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); } }