墨风如雪博客

  • 源码小店
  • 传家宝VPS
让AI使用变得如此简单
  1. 首页
  2. java
  3. 正文

java 分布式缓存框架Memcached的(超详细总结)

2023年 5月 5日 225点热度 0人点赞 0条评论

Memcached是什么?

Memcached是一种高性能、分布式内存对象缓存系统。它是由Brad Fitzpatrick在2003年创建的,最初用于LiveJournal网站的缓存,现在已经成为了一种流行的缓存解决方案。

Memcached将数据存储在内存中,以加快读取速度。它适用于需要频繁读取和写入数据的应用程序,如Web应用程序、社交媒体网站等。Memcached使用了一个简单的键值存储模型,其中每个键都对应一个值。键和值都是任意的二进制数据,可以是字符串、图片、序列化对象等。

Memcached具有以下特点:

  1. 高性能:Memcached将数据存储在内存中,读取速度非常快,可以大幅提升应用程序的性能。

  2. 可扩展性:Memcached是分布式的,可以通过增加更多的节点来扩展缓存容量和性能。

  3. 简单易用:Memcached的API非常简单,只需要使用get和set等几个命令就可以实现数据的读取和写入。

  4. 支持多种语言:Memcached支持多种编程语言,如C、C++、Java、Python、PHP等。

  5. 可靠性:Memcached支持数据备份和数据恢复,确保数据不会丢失。

Memcached的工作原理如下:

  1. 客户端向Memcached发送一个请求,请求包括一个键值和对应的操作(如get或set)。

  2. 如果Memcached中已经存在该键值,则返回对应的值;否则,返回空值。

  3. 如果客户端请求的是set操作,则将键值对存储到Memcached中。

  4. 如果Memcached的缓存空间已满,则会根据一定的策略(如LRU)删除一些键值对,以腾出空间。

Memcached是一种高性能、分布式内存对象缓存系统,可以提高Web应用程序的性能和可扩展性。对于需要频繁读取和写入数据的应用程序,使用Memcached可以大幅提升应用程序的性能。

Memcached能干什么?

Memcached是一款由Brad Fitzpatrick写的开源高速缓存系统,以缓存数据库访问结果数据和对象为主要应用。通常情况下,Memcached被用来解决高并发、读写频繁、复杂计算的问题,以提升网站或系统的性能。

具体来说,Memcached通常用来做以下事情:

  1. 常用于加速动态Web应用程序,比如加速在线社交网络的数据存储和检索,以及对一些共享的Web应用数据的缓存存储。在读取数据时,可以通过先在缓存中查找相应的值,从而减少对数据库的直接访问,提高响应速度。

  2. 可以用来做分布式会话管理,用于存储用户身份验证信息和用户防伪标识令牌等,避免服务器之间的数据共享和状态管理的混乱。

  3. 可以用来缓存静态文件,比如保存CSS、JavaScript、图片等,使得用户首次访问页面后,以后的访问都可以直接请求缓存,从而大幅减少请求延时。

  4. 可以用来存储用户请求过程中生成的临时数据,比如验证码和搜索结果等,供下一步的操作使用。

使用Memcached可以解决以下问题:

  1. 数据库性能瓶颈:常规的数据库会面临高并发、读写频繁的问题,因此性能会出现瓶颈。通过缓存常用的数据并尽量减少访问数据库,可以有效解决该问题。

  2. 网络延时问题:在高并发场景下,服务器的处理能力有限,导致响应时间过长。通过缓存数据,可以有效减少网络请求次数。

  3. 计算密集型操作:如在Web应用程序中,排序、过滤等计算会影响响应时间。通过缓存复杂计算的结果可以大幅提高响应速度。

总而言之,Memcached的主要优势是可以存储和快速检索键值对,并且使用内存,这使得应用程序可以显着减少交互式数据库的请求数量,从而提高性能和可伸缩性。Memcached也可以在多个服务器之间进行分布式运行,这样可以使用内存缓存来提高性能和伸缩性,同时提高服务的可靠性。

Memcached的数据模型

在Memcached中,所有的数据都是以键值对的形式存储的。每个键都对应着一个值,可以是任意的二进制数据,如字符串、图片、序列化对象等。Memcached使用一个简单的键值存储模型,其中每个键都对应一个值。键和值都是任意的二进制数据,可以是字符串、图片、序列化对象等。

下面是Memcached支持的基本操作和其作用:

  1. SET:设置键值对,将一个键值对存储到Memcached中。

  2. GET:获取键值对,从Memcached中获取一个键对应的值。

  3. DELETE:删除键值对,从Memcached中删除一个键和对应的值。

  4. ADD:添加键值对,只有当键不存在时才添加。

  5. REPLACE:替换键值对,只有当键存在时才替换。

  6. INCREMENT/DECREMENT:增加或减少键对应的值,可以用于实现计数器等功能。

Memcached的优点是高性能和可扩展性,缺点是不能进行复杂的查询操作,不支持事务和持久化存储。因此,Memcached适用于一些需要高速读写的场景,如缓存、会话管理等。如果需要进行复杂的查询操作和事务管理,可以选择其他数据库,如MySQL、PostgreSQL等。

Memcached的安装教程

Win安装Memcached的步骤:

  1. 下载Windows版Memcached,推荐使用最新版Memcached 1.4.5。

  2. 解压下载的Memcached压缩包,将解压后的文件放到指定的目录下,如C:\Memcached。

  3. 打开命令行工具,进入到解压后的目录下,执行以下命令:

memcached.exe -d install

此命令将Memcached服务作为一个Windows服务安装在系统中。

  1. 启动Memcached服务,执行以下命令:
net start memcached

此命令启动Memcached服务。

Linux安装Memcached的步骤:

  1. 打开命令行工具,执行以下命令安装Memcached:
sudo apt-get install memcached

此命令将安装Memcached在Linux系统中,并自动启动Memcached服务。

  1. 检查Memcached服务是否正在运行,执行以下命令:
ps -e | grep memcached

此命令将列出正在运行的Memcached进程。

  1. 如果需要配置Memcached启动参数,比如设置监听IP和端口等,可以通过编辑/etc/memcached.conf文件进行配置。

  2. 如果需要重启Memcached服务,执行以下命令:

sudo service memcached restart

此命令将重启Memcached服务。

注意:以上命令都需要使用管理员权限执行。

SpringBoot整合Memcached

Spring Boot整合Memcached步骤如下:

  1. 在pom.xml文件中添加对Spymemcached客户端的依赖:
<dependency>
    <groupId>net.spy</groupId>
    <artifactId>spymemcached</artifactId>
    <version>2.12.0</version>
</dependency>
  1. 创建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();
    }

}
  1. 在控制器中使用缓存注解:
@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) {
        // 查询数据库
        // 返回查询结果
    }

}
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: java Memcached springboot 缓存
最后更新:2023年 5月 5日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
腾讯混元MT-7B:打破参数迷思,重塑机器翻译版图 瑞士AI宣言:Apertus如何定义开放大模型 月之暗面Kimi K2-0905:代码与创意的新篇章? 谷歌“蕉”傲登场!AI生图告别“走钟”时代 2025,AI世界模型新篇章:腾讯混元Voyager展望 单GPU秒产一分钟!MAI-Voice-1,微软语音AI的“核爆”时刻?
别再卷万亿参数了,这个4B模型正把AI工作站塞进你的手机全球最佳开放模型!OpenAI开源GPT-OSS,AI界迎来巨变!声音即影像:昆仑万维SkyReels-A3如何叩响内容创作的革命前夜9B参数硬撼72B,GLM-4.1V凭什么搅动AI江湖?2B参数掀翻巨头牌桌:昆仑万维UniPic 2.0的“四两拨千斤”天工V2发布:AI终于撕掉了“纯文本”的标签
java 微服务框架技术Apache ServiceComb 设计模式:原型设计模式 递归函数详解 java 消息队列框架RabbitMQ的(超详细总结) 推荐项目 sql之父 让你轻松完成sql相关操作 每日一道算法题:Pow(x,y)
标签聚合
deepseek 教程 java AI spring 大模型 算法 设计模式

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang