当前位置: 首页 > article >正文

Redis、Memcached应用场景对比

环境

Redis官方网站: Redis - The Real-time Data Platform

Redis社区版本下载地址:Install Redis | Docs

Memcached官方网站:memcached - a distributed memory object caching system 

Memcached下载地址:memcached - a distributed memory object caching system 

 

Redis与Memcached应用场景对比

一、核心特性对比

对比维度RedisMemcached
数据结构支持支持字符串、哈希、列表、集合、有序集合等复杂数据结构,适合多样化数据操作‌仅支持简单键值对存储,适用于单一数据模型场景‌
持久化能力支持RDB快照和AOF日志持久化,数据可恢复‌无持久化机制,宕机后数据丢失‌
内存管理通过VM机制突破物理内存限制,支持大容量数据存储‌使用固定内存分配(slab机制),适合中小规模数据缓存‌
性能表现单核处理,小数据(<100KB)性能更优;支持复杂操作但高并发写入效率略低‌多线程架构,大数据(>100KB)处理性能更高,适合纯缓存场景‌
扩展性支持主从复制、集群模式,适合高可用场景‌依赖第三方工具(如magent)实现分布式,扩展性较弱‌

二、典型应用场景对比

  1. Redis适用场景

    • 会话存储(Session Cache)‌:通过持久化能力保障会话数据安全,支持高可靠性业务‌
    • 实时排行榜/计数器‌:利用有序集合(Sorted Set)实现动态排序,适用于电商、社交等场景‌
    • 消息队列‌:通过List、Pub/Sub等特性支持异步任务处理和事件驱动架构‌
    • 复杂业务逻辑‌:结合Lua脚本和事务机制,满足数据一致性要求高的场景(如秒杀库存扣减)‌
  2. Memcached适用场景

    • 高频读取缓存‌:如静态页面缓存、数据库查询结果缓存,减轻数据库压力‌
    • 临时数据存储‌:用户会话临时信息、非关键性数据(如页面片段缓存),无需持久化保障‌
    • 大规模数据缓存‌:单Value值≤1MB时,多线程架构可高效处理高并发请求‌

三、选型建议

  • 选择Redis的条件‌:

    • 需要复杂数据结构或持久化能力‌
    • 业务涉及实时数据处理或强一致性要求‌
    • 系统需支持高可用集群和横向扩展‌
  • 选择Memcached的条件‌:

    • 仅需简单键值缓存且数据量较小‌
    • 高并发大体积数据(>100KB)处理需求优先‌
    • 轻量级部署,无需额外运维复杂度‌

综合建议‌:若业务场景以高性能缓存为主且无复杂数据处理需求,优先选择Memcached;若需支持多样化数据操作、持久化及高可用,Redis是更优选择‌

附件一:Redis组件POM依赖

Redis

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>3.4.4</version>
</dependency>

或者

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.2.0</version>
</dependency>

附件二:Memcache组件POM依赖

memcache

<dependency><groupId>net.spy</groupId><artifactId>spymemcached</artifactId><version>2.12.3</version>
</dependency>

附件三:Redis基本操作

基础命令

1.ping(心跳检查)

ping    //输入ping 命令,看到PONG响应,说明客户端与Redis的连接正常。

2.get/set(读写键值)

set name xiaoHong    //set key value 会将指定 key-value写入到DB。
get name    //get key 则会读取指定key的value值。

3.select(切换数据库)

select 1    //select db 索引来切换 DB。redis默认有 16 个数据库。默认使用的是 0 号 DB。

4.dbsize(查看key数量)

dbsize  //命令可以查看当前数据库中 key 的数量。

5.flushdb(删除当前库中所有数据)

flushdb    //删除当前库中所有数据,不影响其他DB。

6.flushall(删除所有DB中的数据)

flushall    //清除redis所有DB中的数据

二、Key 操作命令

1.keys(正则匹配键名)

keys *  //匹配所有的key
keys a* //匹配以a开头的key//KEYS pattern 查找所有符合正则 pattern 的 key
//KEYS 速度非常快,但在一个大的数据库中使用它可能会阻塞当前服务器的服务。生产环境中一般不使用该命令,使用scan命令代替。

2.exists(检查key是否存在)

exists key     //若 key 存在,返回 1 ,否则返回 0 。

3.del(删除指定一个或多个key)

del key1 key2 key3    //返回被删除 key 的数量,不存在的 key 会被忽略。

4.rename(修改key名)

rename key newKey    //将key改名为newkey。//当 key 和 newkey 相同,或 key 不存在时,会返回一个错误。
//当 newkey 已经存在时,RENAME 将覆盖旧值。

5.move(移动key数据库DB)

MOVE key db    //将当前数据库的 key 移动到指定数据库 db 当中。//如果当前数据库和目标数据库有相同名字的 key,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。
//移动成功返回 1 ,失败则返回 0 。

6.type(获取key储存的值类型)

type key    //返回 key 所储存的值的类型//有六种 none (key 不存在)、string (字符串)、list (列表)、set (集合)、zset (有序集)、hash (哈希表)

7.expire/pexpire(设置key有效期)

expire key seconds    //为 key 设置过期时间。当 key 过期时(生存时间为 0),它会被自动删除。//expire 的时间单位为秒,pexpire 的时间单位为毫秒。
//过期时间设置成功返回 1,key 不存在时返回 0 。rename 操作不会改变 key的过期时间。

8.ttl/pttl(获取key剩余生存时间)

ttl key    //time to live,返回给定 key 的剩余生存时间。// key 不存在时,返回 -2 。
// key 存在但没有设置时间时,返回 -1 。
// 返回 key 剩余生存时间。ttl 返回的时间单位为秒,pttl 返回的时间单位为毫秒。

9.persist(去除key的生存时间)

persist key    //当生存时间移除成功返回 1;若 key 不存在或 key 没有设置生存时间,则返回 0。

10.randomkey(随机返回一个 key)

randomkey    //当数据库不为空时,随机返回一个 key(不删除)。当数据库为空时,返回 nil。

11.scan(遍历数据库键)

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]    //SCAN 命令是一个基于游标 cursor 的迭代器//cursor:本次迭代开始的游标。
//pattern:本次迭代要匹配的 key 的模式。
//count:本次迭代要从数据集里返回多少元素,默认值为 10 。
//type:本次迭代要返回的value 的类型,默认为所有类型。//SCAN 命令被调用之后,会返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标,第二个元素则是一个数组, 数组中包含了所有被迭代的元素。
//用户在下次迭代时使用这个新游标作为 SCAN 命令的游标参数,以此来延续之前的迭代过程。
//当 SCAN 命令的游标参数被设置为 0 时,服务器将开始一次新的迭代。如果新游标返回 0表示迭代已结束。
//当数据量很大时,count 的数量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。
//由于 scan 命令每次执行都只会返回少量元素,所以该命令可以用于生产环境,而不会出现像 KEYS 命令带来的服务器阻塞问题。hscan key cursor [MATCH pattern] [COUNT count]    //遍历当前 db 中指定 Hash 表的所有 field-value 对
sscan key cursor [MATCH pattern] [COUNT count]    //遍历当前 db 中指定 set 集合的所有元素
zscan  key cursor [MATCH pattern] [COUNT count]    //遍历当前 db 中指定有序集合的所有元素(数值与元素值)

附件四:Memcache基本操作

存储数据

Memcached提供了多种命令用于存储数据项,包括 set、add 和 replace。以下是这些命令的详细介绍:

set 命令

set 命令用于在缓存中存储一个数据项。如果键已经存在,则覆盖其现有值。

set <key> <flags> <exptime> <bytes> [noreply]\r\n
<value>\r\n


参数说明:

<key>:数据项的键。
<flags>:用户自定义的标志位,通常为0。
<exptime>:过期时间,单位为秒。
<bytes>:数据项的字节数。
[noreply]:可选参数,表示不需要服务器返回响应。
示例代码:

import memcache# 连接Memcached服务器
mc = memcache.Client(['127.0.0.1:11211'])# 存储数据
mc.set('key1', 'value1', time=60)
print("Set key1 to value1")


add 命令

add 命令用于在缓存中添加一个新的数据项。如果键已经存在,则不做任何操作。

add <key> <flags> <exptime> <bytes> [noreply]\r\n
<value>\r\n

示例代码:

# 添加数据
mc.add('key2', 'value2', time=60)
print("Added key2 with value2")

replace 命令

replace 命令用于替换缓存中已有的一个数据项。如果键不存在,则不做任何操作。

replace <key> <flags> <exptime> <bytes> [noreply]\r\n
<value>\r\n


示例代码:

# 替换数据
mc.replace('key1', 'new_value1', time=60)
print("Replaced key1 with new_value1")

 

检索数据

Memcached提供了 get 和 gets 命令用于检索数据项。

get 命令

get 命令用于检索一个或多个数据项的值。

get <key>*\r\n

示例代码:

# 检索数据
value = mc.get('key1')
print("Retrieved key1:", value)
3.2.2 gets 命令
gets 命令与 get 类似,但返回的数据项还包括一个唯一的标识符(cas token),用于数据更新时的乐观锁定。gets <key>*\r\n
示例代码:# 检索数据及其唯一标识符
result = mc.gets('key1')
print("Retrieved key1 with CAS token:", result)

更新数据

Memcached提供了 cas 命令用于数据项的条件更新,利用唯一标识符进行乐观锁定。

cas 命令

cas 命令用于更新一个数据项,但前提是数据项的唯一标识符未改变。

cas <key> <flags> <exptime> <bytes> <cas token> [noreply]\r\n
<value>\r\n

示例代码:

# 条件更新数据
cas_token = result[1]
mc.cas('key1', 'updated_value1', cas_token, time=60)
print("Conditionally updated key1 with updated_value1")

删除数据

Memcached提供了 delete 命令用于删除数据项。

delete 命令

delete 命令用于删除一个数据项。

delete <key> [noreply]\r\n

示例代码:

# 删除数据mc.delete('key1')
print("Deleted key1")

计数器操作

Memcached提供了 incr 和 decr 命令用于操作数据项的计数器值。

incr 命令

incr 命令用于增加数据项的计数器值。

incr <key> <value> [noreply]\r\n

示例代码:

# 增加计数器
mc.set('counter', 10)
mc.incr('counter', 5)
counter_value = mc.get('counter')
print("Counter value after increment:", counter_value)

decr 命令

decr 命令用于减少数据项的计数器值。

decr <key> <value> [noreply]\r\n

示例代码:

# 减少计数器
mc.decr('counter', 3)
counter_value = mc.get('counter')
print("Counter value after decrement:", counter_value)

相关文章:

Redis、Memcached应用场景对比

环境 Redis官方网站&#xff1a; Redis - The Real-time Data Platform Redis社区版本下载地址&#xff1a;Install Redis | Docs Memcached官方网站&#xff1a;memcached - a distributed memory object caching system Memcached下载地址&#xff1a;memcached - a dis…...

【单片机通信技术应用——学习笔记三】液晶屏显示技术,取模软件的应用

一、液晶显示技术简介 1.RGB信号线 RGB是一种色彩模式&#xff0c;是工业界的一种颜色标准&#xff0c;是通过红&#xff08;R&#xff09;、绿&#xff08;G&#xff09;、蓝&#xff08;B&#xff09;三个颜色通道的变化&#xff0c;以及它们相互之间的叠加来得到各式各样的…...

MySQL颠覆版系列————MySQL新特性(开启数据库的新纪元)上篇

文章目录 前言一、窗口函数&#xff08;Window Functions&#xff09;1.1 窗口函数概念1.2 常见的窗口函数 二、公用表表达式&#xff08;Common Table Expressions, CTEs&#xff09;2.1 公用表表达式的概念2.2 常见的公用表表达式 三、JSON增强3.1 JSON增强的概念3.2 常见的J…...

MySQL 调优:查询慢除了索引还能因为什么?

文章目录 情况一&#xff1a;连接数过小情况二&#xff1a;Buffer Pool 太小 MySQL 查询慢除了索引还能因为什么&#xff1f;MySQL 查询慢&#xff0c;我们一般也会想到是因为索引&#xff0c;但除了索引还有哪些原因会导致数据库查询变慢呢&#xff1f; 以下以 MySQL 中一条 S…...

Java实习生面试题(2025.3.23 be)

一、v-if与v-show的区别 v-show 和 v-if 都是 Vue 中的条件渲染指令&#xff0c;它们的主要区别在于渲染策略&#xff1a;v-if 会根据条件决定是否编译元素&#xff0c;而 v-show 则始终编译元素&#xff0c;只是通过改变 CSS 的 display 属性来控制显示与隐藏。 二、mybatis-…...

如何在百度搜索上删除与自己名字相关的资料

个人信息的网络足迹如同一张无形的网&#xff0c;将我们与世界的每一个角落紧密相连。然而&#xff0c;当某些与自己名字相关的资料不再希望被公众轻易检索到时&#xff0c;如何在百度搜索中有效“隐身”&#xff0c;成为了一个亟待解决的问题。面对复杂多变的网络环境&#xf…...

【C语言】C语言使用随机数srand,rand

C语言使用随机数srand,rand 可直接编译使用&#xff1a; #include <stdio.h> #include <time.h> #include <stdlib.h> #include <unistd.h>/* c语言提供的跟随机数有关的函数:int rand(void);返回值:产生的随机数void srand(unsiqned int seed);参数…...

为容器指定固定IP地址

文章目录 为容器指定固定IP地址可以通过以下步骤实现&#xff0c;适用于Docker环境&#xff1a;**方法一&#xff1a;使用Docker自定义桥接网络****方法二&#xff1a;Docker Compose配置****关键注意事项** 为容器指定固定IP地址可以通过以下步骤实现&#xff0c;适用于Docker…...

kube-score K8S Yaml静态代码分析工具详解

kube-score 是一款专注于 Kubernetes 配置文件的静态代码分析工具&#xff0c;旨在通过自动化检查帮助用户识别资源配置中的潜在问题&#xff0c;并遵循最佳实践以提升集群的安全性、稳定性和性能。以下是其核心功能、使用方法和应用场景的详细解析&#xff1a; 一、核心功能与…...

Spring Boot 整合 Elasticsearch 实践:从入门到上手

引言 Elasticsearch 是一个开源的分布式搜索引擎&#xff0c;广泛用于日志分析、搜索引擎、数据分析等场景。本文将带你通过一步步的教程&#xff0c;在 Spring Boot 项目中整合 Elasticsearch&#xff0c;轻松实现数据存储与查询。 1. 创建 Spring Boot 项目 首先&#xff…...

使用外部事件检测接入 CDH 大数据管理平台告警

CDH 大数据管理平台 CDH&#xff08;Cloudera Distribution Hadoop&#xff09;是一个企业级的大数据平台&#xff0c;由 Cloudera 公司提供&#xff0c;它包含了 Apache Hadoop 生态系统中的多种开源组件&#xff0c;并对其进行了优化和集成&#xff0c;以支持大规模数据存储…...

RabbitMQ八股文

RabbitMQ RabbitMQ 核心概念与组件1. RabbitMQ 核心组件及其作用1.1 生产者&#xff08;Producer&#xff09;1.2 交换机&#xff08;Exchange&#xff09;1.3 队列&#xff08;Queue&#xff09;1.4 绑定&#xff08;Binding&#xff09;1.5 消费者&#xff08;Consumer&#…...

MongoDB(五) - Studio 3T 下载与安装教程

文章目录 前言一、Studio 3T 简介二、下载及安装1. 下载2. 安装 三、使用Studio 3T连接MongoDB 前言 本文旨在全面且深入地为你介绍 Studio 3T。从其丰富的功能特性、跨平台使用的便捷性&#xff0c;到详细的下载安装步骤&#xff0c;以及关键的连接 MongoDB 操作&#xff0c;…...

2025高频面试算法总结篇【链表堆栈队列】

文章目录 直接刷题链接直达反转链表环形链表判断一个序列是否为合理的出栈顺序最长有效括号旋转链表复杂链表的复制约瑟夫环问题滑动窗口最大值 直接刷题链接直达 反转链表 206. 反转链表 环形链表 141. 环形链表142. 环形链表 II 判断一个序列是否为合理的出栈顺序 946.…...

Java主流开发框架之请求响应常用注释

1.RestController 标记一个类为 REST 控制器&#xff0c;处理 HTTP 请求并直接返回数据&#xff08;如 JSON/XML&#xff09;&#xff0c;而不是视图&#xff08;如 HTML&#xff09;&#xff0c;一般是放在类的上边 RestController public class UserController {GetMapping…...

汽车制造MES

一、整体生产工序 整车的车间主要分为4个部分&#xff1a;冲压、焊装、涂装、总装、整车入库 系统架构 二、车间概括 1.冲压车间 2.焊装车间 3.涂装车间 4.总装车间 1.整车装配的部件都要可追溯、数据实时性要求高、涉及分装与总装的协调、物流配送的协调、质量批处理的协调、…...

LeetCode 2643.一最多的行:模拟(更新答案)

【LetMeFly】2643.一最多的行&#xff1a;模拟(更新答案) 力扣题目链接&#xff1a;https://leetcode.cn/problems/row-with-maximum-ones/ 给你一个大小为 m x n 的二进制矩阵 mat &#xff0c;请你找出包含最多 1 的行的下标&#xff08;从 0 开始&#xff09;以及这一行中…...

固定翼无人机姿态和自稳模式

固定翼无人机的‌姿态模式&#xff08;Attitude/Angle Mode&#xff09;‌和‌自稳模式&#xff08;Stabilize Mode&#xff09;‌是两种常见的飞行控制模式&#xff0c;它们在飞控系统介入程度、操作逻辑及适用场景上有显著区别。以下是两者的详细对比及使用指南&#xff1a; …...

K8S中若要挂载其他命名空间中的 Secret

在Kubernetes&#xff08;k8s&#xff09;里&#xff0c;若要挂载其他命名空间中的Secret&#xff0c;你可以通过创建一个 Secret 的 ServiceAccount 和 RoleBinding 来实现对其他命名空间 Secret 的访问&#xff0c;接着在 Pod 中挂载这个 Secret。下面是详细的步骤和示例代码…...

关于Unity的CanvasRenderer报错

MissingReferenceException: The object of type ‘CanvasRenderer’ has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object. UnityEngine.UI.GraphicRaycaster.Raycast (UnityEng…...

LangChain组件Tools/Toolkits详解(5)——返回产出artifact

LangChain组件Tools/Toolkits详解(5)——返回产出artifact 本篇摘要14. LangChain组件Tools/Toolkits详解14.5 返回产出artifact14.5.1 定义工具14.5.2 使用ToolCall调用工具14.5.3 与模型一起使用14.5.4 从子例化BaseTool返回参考文献本章目录如下: 《LangChain组件Tools/T…...

信奥赛CSP-J复赛集训(模拟算法专题)(26):P5412 [YNOI2019] 排队

信奥赛CSP-J复赛集训(模拟算法专题)(26):P5412 [YNOI2019] 排队 题目描述 小明所在的班级要举办一场课外活动,在活动开始之前老师告诉小明:“需要把男女生分成两队,并且每一队都要按照身高从矮到高进行排序”。但是由于小明的马虎,没有把老师的安排转达给同学,导致全…...

基于开源模型的微调训练及瘦身打造随身扫描仪方案__用AI把手机变成文字识别小能手

基于开源模型的微调训练及瘦身打造随身扫描仪方案__用AI把手机变成文字识别小能手 一、准备工作&#xff1a;组装你的"数码工具箱" 1. 安装基础工具&#xff08;Python环境&#xff09; 操作步骤&#xff1a; 访问Python官网下载安装包安装时务必勾选Add Python to…...

在 Offset Explorer 中配置多节点 Kafka 集群的详细指南

一、是否需要配置 Zookeeper&#xff1f; Kafka 集群的 Zookeeper 依赖性与版本及运行模式相关&#xff1a; Kafka 版本是否需要 Zookeeper说明0.11.x 及更早版本✅ 必须配置Kafka 完全依赖 Zookeeper 管理元数据2.8 及以下版本✅ 必须配置Kafka 依赖外置或内置的 Zookeeper …...

STM32基础教程——定时器

前言 TIM定时器&#xff08;Timer&#xff09;:STM32的TIM定时器是一种功能强大的外设模块&#xff0c;通过时基单元&#xff08;包含预分频器、计数器和自动重载寄存器&#xff09;实现精准定时和计数功能。其核心原理是&#xff1a;内部时钟&#xff08;CK_INT&#xff09;或…...

深入分析和讲解虚拟化技术原理

随着云计算和大数据技术的飞速发展&#xff0c;虚拟化技术应运而生&#xff0c;成为数据中心和IT基础设施的重要组成部分。本文将深入分析虚拟化的基本原理、主要类型以及在实际应用中的意义。 一、虚拟化技术的定义 虚拟化技术是通过软件将物理硬件资源抽象成虚拟资源的技术&…...

HarmonyOS Next~鸿蒙图形开发技术解析:AREngine与ArkGraphics 2D的核心能力与应用实践

HarmonyOS Next&#xff5e;鸿蒙图形开发技术解析&#xff1a;AREngine与ArkGraphics 2D的核心能力与应用实践 鸿蒙操作系统&#xff08;HarmonyOS&#xff09;在图形开发领域持续创新&#xff0c;其核心图形类Kit——**AREngine&#xff08;增强现实引擎服务&#xff09;与Ar…...

Can通信流程

下面给出一个更详细的 CAN 发送报文的程序流程说明&#xff0c;结合 HAL 库的使用及代码示例&#xff0c;帮助你了解每一步的具体操作和内部原理。 一、系统与外设初始化 1.1 HAL 库初始化 在 main() 函数开头&#xff0c;首先调用 HAL 库初始化函数&#xff1a; HAL_Init()…...

小白闯AI:Llama模型Lora中文微调实战

文章目录 0、缘起一、如何对大模型进行微调二、模型微调实战0、准备环境1、准备数据2、模型微调第一步、获取基础的预训练模型第二步:预处理数据集第三步:进行模型微调第四步:将微调后的模型保存到本地4、模型验证5、Ollama集成部署6、结果测试三、使用总结AI是什么?他应该…...

rip 协议详细介绍

以下是关于 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09; 的详细介绍&#xff0c;涵盖其工作原理、版本演进、配置方法、优缺点及实际应用场景。 1. RIP 协议概述 类型&#xff1a;动态路由协议&#xff0c;基于距离矢量算法&#xff08…...