墨风如雪博客

  • 源码小店
  • 导航站
  • 登录
  • java
  • 资源分享
让AI使用变得如此简单
  1. 首页
  2. java
  3. 正文

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

2023年 5月 5日 162点热度 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日

墨风如雪

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

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

文章评论

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

墨风如雪

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

最新 热点 随机
最新 热点 随机
Sora触手可及!微软必应AI视频生成器,全民创作时代来临? 阿里WebAgent开源:引领自主搜索新纪元 重磅炸弹!字节跳动开源BAGEL:70亿参数,统一多模态理解与生成,AI“全能王”诞生记! 小米MiMo-VL:7B参数,怎么就成了多模态界的“越级打怪王”? 炸裂!DeepSeek 8B 量化版降临:告别显存焦虑,你的 3080 Ti 也能玩转顶级大模型了! 美团炸场AI圈:点外卖点出个软件?用「对话式编程」重塑生产力!
炸裂!微软这门免费AI Agent新手课,GitHub近2万星,简直是宝藏!ComfyUI“打通任督二脉”:直接调用Veo2、GPT-4o等65大模型!一键串联你的AI工作流AI圈炸锅了!Mistral Medium 3:性能 SOTA,成本打骨折,企业玩家的新宠?字节终于开源“扣子”同款引擎了!FlowGram:AI 时代的可视化工作流利器告别“微信黑箱”!Chatlog:让你的聊天记录也能拥有“AI大脑”!字节跳动 Seed-Coder-8B:不靠人工洗数据,这80亿参数的小模型如何写出顶尖代码?
设计模式:组合设计模式 Mybatis源码解析篇(执行器) nginx配置反向代理教程 java IOC框架Google Guice的(超详细总结) 颠覆传统!QVQ-Max:开启AI‘视觉思考’新纪元 探索AI编程的边界:GPT、Gemini、DeepSeek三巨头过招,谁能更胜一筹?
标签聚合
AI 教程 deepseek 动态规划 设计模式 算法 spring java

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

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策