Memcached介绍与使用
Memcached是什么?
Memcached是一个免费开源的、高性能的、分布式内存对象缓存系统。
Memcached是一个基于内存的键值对储存系统,用于储存小型的任意数据(字符串、对象),比如数据库查询、API调用以及页面渲染的结果。
它由什么组成的?
- 客户端软件,给出可用的Memcached服务器列表
- 一个基于客户端的哈希算法,用于基于“键”选择合适的服务器
- 服务端软件,在一个内部的哈希表中储存键值对数据
- 最近最少使用算法(LRU),决定何时丢弃旧数据(当内存不足)
各类储存方案对比
Memcached工作流程
- 客户端向Memcached服务器发送请求,如果缓存中有需要的数据,直接返回。
- 如果没有需要的数据,那么就查询数据库,在给客户端返回数据的同时,把该数据存到Memcached中。
- 一旦数据发生变化(数据的修改和删除),就要实时更新缓存内的数据。
Memcached与Redis比较
Memcached命令
Spring Boot 集成 Memcached
安装Memcached
Linux:
- 安装libevent库
sudo apt-get install libevent ibevent-dev (Ubuntu/Debian)
yum install libevent libevent-devel (Redhat/Fedora/Centos)
- 安装Memcached
sudo apt-get install memcached (Ubuntu/Debian)
yum install memcached (Redhat/Fedora/Centos)
portmaster databases/memcached (FreeBSD)
Windows:
Memcached在1.4.5版本之前可以作为一个服务安装,但在之后就取消了这个功能。所以安装方法分两块。
1.4.5之前版本安装
使用管理员运行以下命令:
f:\memcached.exe -d install (路径视你的存放路径而定)
打开和关闭Memcached服务:
f:\memcached.exe -d start (路径视你的存放路径而定)
f:\memcached.exe -d stop (路径视你的存放路径而定)
如要修改配置,打开regedit.exe,找到"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached"进行修改。
1.4.5之后版本安装
通过创建计划任务来进行设置Memcached的windows启动时自执行:
管理员身份执行:
schtasks /create /sc onstart /tn memcached /tr “c:\memcached.exe”
删除计划任务:
schtasks /delete /tn memcached
注意:一定要先把Memcached服务成功打开,下面的程序才能跑通。
导包
Memcached没有为Spring Boot开发集成包,所以需要自行引入。
这里使用Spymemcached。
github : https://github.com/couchbase/spymemcached
Maven:
https://mvnrepository.com/artifact/net.spy/spymemcached
<dependency>
<groupId>net.spy</groupId>
<artifactId>spymemcached</artifactId>
<version>2.12.3</version>
</dependency>
程序中使用
创建一个Runner继承CommandLineRunner,并在其中初始化Memcached服务,这样就可以在Spring容器成功启动之后,第一时间创建可用的Memcached服务。
package com.lbl.spymemcacheddemo;
import net.spy.memcached.MemcachedClient;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.net.InetSocketAddress;
@Component
public class MyRunner implements CommandLineRunner {
private MemcachedClient memcachedClient = null;
@Override
public void run(String... args) throws Exception {
try {
memcachedClient = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
} catch (Exception e) {
e.printStackTrace();
}
}
public MemcachedClient getMemcachedClient() {
return memcachedClient;
}
}
创建测试:
package com.lbl.spymemcacheddemo;
import net.spy.memcached.MemcachedClient;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import static org.junit.jupiter.api.Assertions.*;
@RunWith(SpringRunner.class)
@SpringBootTest
class MyRunnerTest {
@Resource
private MyRunner myRunner;
@Test
public void Test() {
MemcachedClient client = myRunner.getMemcachedClient();
client.set("test",100,"123456");
System.out.println("test is "+client.get("testkey").toString());
}
}
其它遇到的坑
@RunWith注解爆红
检查pom.xml文件,发现这一个:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
改为这样:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
其它方法: