Memcached是什么?
Memcached是一种高性能、分布式内存对象缓存系统。它是由Brad Fitzpatrick在2003年创建的,最初用于LiveJournal网站的缓存,现在已经成为了一种流行的缓存解决方案。
Memcached将数据存储在内存中,以加快读取速度。它适用于需要频繁读取和写入数据的应用程序,如Web应用程序、社交媒体网站等。Memcached使用了一个简单的键值存储模型,其中每个键都对应一个值。键和值都是任意的二进制数据,可以是字符串、图片、序列化对象等。
Memcached具有以下特点:
-
高性能:Memcached将数据存储在内存中,读取速度非常快,可以大幅提升应用程序的性能。
-
可扩展性:Memcached是分布式的,可以通过增加更多的节点来扩展缓存容量和性能。
-
简单易用:Memcached的API非常简单,只需要使用get和set等几个命令就可以实现数据的读取和写入。
-
支持多种语言:Memcached支持多种编程语言,如C、C++、Java、Python、PHP等。
-
可靠性:Memcached支持数据备份和数据恢复,确保数据不会丢失。
Memcached的工作原理如下:
-
客户端向Memcached发送一个请求,请求包括一个键值和对应的操作(如get或set)。
-
如果Memcached中已经存在该键值,则返回对应的值;否则,返回空值。
-
如果客户端请求的是set操作,则将键值对存储到Memcached中。
-
如果Memcached的缓存空间已满,则会根据一定的策略(如LRU)删除一些键值对,以腾出空间。
Memcached是一种高性能、分布式内存对象缓存系统,可以提高Web应用程序的性能和可扩展性。对于需要频繁读取和写入数据的应用程序,使用Memcached可以大幅提升应用程序的性能。
Memcached能干什么?
Memcached是一款由Brad Fitzpatrick写的开源高速缓存系统,以缓存数据库访问结果数据和对象为主要应用。通常情况下,Memcached被用来解决高并发、读写频繁、复杂计算的问题,以提升网站或系统的性能。
具体来说,Memcached通常用来做以下事情:
-
常用于加速动态Web应用程序,比如加速在线社交网络的数据存储和检索,以及对一些共享的Web应用数据的缓存存储。在读取数据时,可以通过先在缓存中查找相应的值,从而减少对数据库的直接访问,提高响应速度。
-
可以用来做分布式会话管理,用于存储用户身份验证信息和用户防伪标识令牌等,避免服务器之间的数据共享和状态管理的混乱。
-
可以用来缓存静态文件,比如保存CSS、JavaScript、图片等,使得用户首次访问页面后,以后的访问都可以直接请求缓存,从而大幅减少请求延时。
-
可以用来存储用户请求过程中生成的临时数据,比如验证码和搜索结果等,供下一步的操作使用。
使用Memcached可以解决以下问题:
-
数据库性能瓶颈:常规的数据库会面临高并发、读写频繁的问题,因此性能会出现瓶颈。通过缓存常用的数据并尽量减少访问数据库,可以有效解决该问题。
-
网络延时问题:在高并发场景下,服务器的处理能力有限,导致响应时间过长。通过缓存数据,可以有效减少网络请求次数。
-
计算密集型操作:如在Web应用程序中,排序、过滤等计算会影响响应时间。通过缓存复杂计算的结果可以大幅提高响应速度。
总而言之,Memcached的主要优势是可以存储和快速检索键值对,并且使用内存,这使得应用程序可以显着减少交互式数据库的请求数量,从而提高性能和可伸缩性。Memcached也可以在多个服务器之间进行分布式运行,这样可以使用内存缓存来提高性能和伸缩性,同时提高服务的可靠性。
Memcached的数据模型
在Memcached中,所有的数据都是以键值对的形式存储的。每个键都对应着一个值,可以是任意的二进制数据,如字符串、图片、序列化对象等。Memcached使用一个简单的键值存储模型,其中每个键都对应一个值。键和值都是任意的二进制数据,可以是字符串、图片、序列化对象等。
下面是Memcached支持的基本操作和其作用:
-
SET:设置键值对,将一个键值对存储到Memcached中。
-
GET:获取键值对,从Memcached中获取一个键对应的值。
-
DELETE:删除键值对,从Memcached中删除一个键和对应的值。
-
ADD:添加键值对,只有当键不存在时才添加。
-
REPLACE:替换键值对,只有当键存在时才替换。
-
INCREMENT/DECREMENT:增加或减少键对应的值,可以用于实现计数器等功能。
Memcached的优点是高性能和可扩展性,缺点是不能进行复杂的查询操作,不支持事务和持久化存储。因此,Memcached适用于一些需要高速读写的场景,如缓存、会话管理等。如果需要进行复杂的查询操作和事务管理,可以选择其他数据库,如MySQL、PostgreSQL等。
Memcached的安装教程
Win安装Memcached的步骤:
-
下载Windows版Memcached,推荐使用最新版Memcached 1.4.5。
-
解压下载的Memcached压缩包,将解压后的文件放到指定的目录下,如C:\Memcached。
-
打开命令行工具,进入到解压后的目录下,执行以下命令:
memcached.exe -d install
此命令将Memcached服务作为一个Windows服务安装在系统中。
- 启动Memcached服务,执行以下命令:
net start memcached
此命令启动Memcached服务。
Linux安装Memcached的步骤:
- 打开命令行工具,执行以下命令安装Memcached:
sudo apt-get install memcached
此命令将安装Memcached在Linux系统中,并自动启动Memcached服务。
- 检查Memcached服务是否正在运行,执行以下命令:
ps -e | grep memcached
此命令将列出正在运行的Memcached进程。
-
如果需要配置Memcached启动参数,比如设置监听IP和端口等,可以通过编辑/etc/memcached.conf文件进行配置。
-
如果需要重启Memcached服务,执行以下命令:
sudo service memcached restart
此命令将重启Memcached服务。
注意:以上命令都需要使用管理员权限执行。
SpringBoot整合Memcached
Spring Boot整合Memcached步骤如下:
- 在pom.xml文件中添加对Spymemcached客户端的依赖:
<dependency>
<groupId>net.spy</groupId>
<artifactId>spymemcached</artifactId>
<version>2.12.0</version>
</dependency>
- 创建Memcached配置类,添加@EnableCaching注解启用缓存:
@Configuration
@EnableCaching
public class MemcachedConfig extends CachingConfigurerSupport {
@Bean
public MemcachedClientFactoryBean memcachedClient() {
MemcachedClientFactoryBean memcachedClientFactoryBean = new MemcachedClientFactoryBean();
memcachedClientFactoryBean.setServers("localhost:11211");
return memcachedClientFactoryBean;
}
@Override
@Bean
public CacheManager cacheManager() {
MemcachedCacheManager cacheManager = new MemcachedCacheManager(memcachedClient().getObject());
cacheManager.setExpiration(3600);
return cacheManager;
}
@Override
@Bean
public KeyGenerator keyGenerator() {
return new SimpleKeyGenerator();
}
}
- 在控制器中使用缓存注解:
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@Cacheable(value = "users", keyGenerator = "simpleKeyGenerator")
@GetMapping("/{name}")
public User getUser(@PathVariable String name) {
return userService.getUserByName(name);
}
// 其他接口省略
}
以上代码中,使用了@Cacheable注解,当第一次请求指定名称的用户时,会将查询的结果缓存起来,接下来再次请求同样的用户,就会从缓存中读取数据,而不是再经过数据库查询操作。
完整代码如下:
pom.xml:
<dependencies>
<!-- Spring Boot Web Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spymemcached Client -->
<dependency>
<groupId>net.spy</groupId>
<artifactId>spymemcached</artifactId>
<version>2.12.0</version>
</dependency>
</dependencies>
MemcachedConfig.java:
@Configuration
@EnableCaching
public class MemcachedConfig extends CachingConfigurerSupport {
@Bean
public MemcachedClientFactoryBean memcachedClient() {
MemcachedClientFactoryBean memcachedClientFactoryBean = new MemcachedClientFactoryBean();
memcachedClientFactoryBean.setServers("localhost:11211");
return memcachedClientFactoryBean;
}
@Override
@Bean
public CacheManager cacheManager() {
MemcachedCacheManager cacheManager = new MemcachedCacheManager(memcachedClient().getObject());
cacheManager.setExpiration(3600);
return cacheManager;
}
@Override
@Bean
public KeyGenerator keyGenerator() {
return new SimpleKeyGenerator();
}
}
UserController.java:
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@Cacheable(value = "users", keyGenerator = "simpleKeyGenerator")
@GetMapping("/{name}")
public User getUser(@PathVariable String name) {
return userService.getUserByName(name);
}
// 其他接口省略
}
UserService.java:
@Service
public class UserService {
public User getUserByName(String name) {
// 查询数据库
// 返回查询结果
}
}
文章评论