Redis性能优化实战:从配置调优到代码实现的全面指南

文章引言

在现代互联网架构中,Redis早已成为高性能内存数据库的代名词。从缓存热点数据到实现分布式锁,从消息队列到排行榜计算,它的身影无处不在。然而,随着业务规模的增长和并发量的激增,Redis的性能瓶颈也逐渐显现:延迟从毫秒级飙升到秒级,内存占用失控,甚至宕机事故频发。这些问题不仅影响用户体验,更可能直接导致业务损失。性能优化因此成为每个Redis使用者必须面对的课题。

这篇文章面向有1-2年Redis开发经验的开发者。你可能已经熟悉基本的SETGET操作,也能搭建简单的缓存服务,但面对高并发场景下的延迟抖动或内存溢出时,却感到无从下手。我希望通过这篇指南,带你从配置调优到代码实现,全面掌握Redis性能优化的实战技巧。文章基于我10年开发经验,结合多个真实项目案例,既有系统化的理论剖析,也有可直接上手的代码示例。

为什么选择这三个优化维度------配置、数据结构和代码?因为它们就像Redis性能的"三驾马车",缺一不可。配置是基础,就像给跑车调校引擎;数据结构是核心,好比选择合适的赛道;代码实现则是油门,决定最终的加速效果。接下来,我们将从性能优化的核心要点出发,一步步拆解这些维度,带你从理论走向实践。

一、Redis性能优化的核心要点

1.1 性能优化的必要性

Redis以单线程和高性能著称,但这并不意味着它天生无懈可击。在高并发场景下,未经优化的Redis可能成为系统的"短板"。比如,我曾在某电商秒杀项目中遇到过这样的问题:活动开始时,QPS达到10万,Redis延迟却从平时的10ms飙升到500ms,导致大量请求超时。原因在于内存淘汰策略不当,触发了频繁的键清理操作。类似的故事在许多团队中上演------性能优化不再是锦上添花,而是业务增长的刚需。

1.2 优化的三大维度

要让Redis跑得更快、更稳,我们需要从三个层面入手:

  • 配置调优:调整Redis的运行参数和环境,就像给机器换上更合适的"燃料"。
  • 数据结构选择:用对命令和数据结构,避免"拿着锤子找钉子"的尴尬。
  • 代码实现:优化客户端调用方式,把网络和计算资源榨干每一分潜力。

这三者相辅相成,缺一不可。配置打好基础,数据结构提升效率,代码实现则是落地的关键。

1.3 衡量性能的指标

优化之前,我们得先知道"快不快""好不好"。以下三个指标是评判Redis性能的"标尺":

指标 含义 优化目标
QPS 每秒查询率,衡量吞吐能力 越高越好
延迟 请求从发出到返回的时间 越低越好
内存使用率 Redis占用的内存占比 合理控制,避免溢出

示意图:性能优化的核心关注点

css 复制代码
[配置调优] ----> [数据结构选择] ----> [代码实现]
    |                 |                  |
    v                 v                  v
[QPS提升]      [延迟降低]         [内存优化]

从这些指标出发,我们可以更有针对性地优化Redis。接下来,我们先从配置调优入手,看看如何给Redis的"引擎"加点马力。

二、配置调优:从部署到运行时的优化

配置调优是Redis性能优化的第一步。Redis的默认配置就像一辆未调校的跑车,虽然能跑,但远未达到最佳状态。这一节,我们将深入剖析redis.conf中的核心参数,探讨持久化策略的取舍,并分享一些系统级的优化技巧。

2.1 Redis.conf核心参数解析

2.1.1 maxmemory:内存上限与淘汰策略

maxmemory决定了Redis能用多少内存。一旦达到上限,Redis会根据淘汰策略清理数据。常见的策略有volatile-lru(对设置了过期时间的键使用LRU淘汰)和allkeys-lru(对所有键使用LRU淘汰)。

实战示例 :在一台1GB内存的服务器上运行Redis,业务需要缓存大量临时数据。我们设置maxmemory 800mb,并选择allkeys-lru,确保内存不会溢出,同时优先淘汰不常用的键。结果,内存使用率稳定在85%左右,性能未受明显影响。

对比分析

策略 优点 缺点 适用场景
volatile-lru 只淘汰 🙂过期键,保护持久数据 未设置过期时间的键累积 数据分级明确的场景
allkeys-lru 全局优化,内存利用率高 可能误删重要数据 缓存为主的场景

2.1.2 maxclients:最大客户端连接数

默认值是10000,但实际环境中,这个值可能不够。曾在一个项目中,Redis报错"Too many open files",原因是连接数超过系统限制(ulimit -n默认1024)。

解决方案

  1. 修改redis.confmaxclients 5000
  2. 调整系统参数:ulimit -n 65535
  3. 重启生效后,高并发下连接拒绝问题消失。

2.1.3 timeout:超时设置

timeout控制客户端空闲多久后断开连接。默认是0(永不断开),但这可能导致"僵尸连接"累积。建议设置为300(5分钟),既能释放资源,又不影响正常业务。

2.2 持久化策略选择

Redis提供RDB和AOF两种持久化方式,二者在性能和数据安全性上各有千秋。

RDB vs AOF对比

方式 性能影响 数据安全性 适用场景
RDB 快照生成时阻塞较少 可能丢失最近数据 高性能优先
AOF 写操作有磁盘I/O开销 数据丢失少 数据安全优先

实战案例 :在一个高写入的日志系统中,我们关闭AOF,仅启用RDB(save 900 1),每15分钟生成一次快照。吞吐量提升20%,而丢失的数据通过业务补偿机制恢复。

2.3 网络与系统优化

2.3.1 TCP backlog与somaxconn

高并发下,Redis可能因连接队列不足拒绝请求。调整tcp-backlogredis.conf中)和系统参数somaxconn可解决问题。
命令sysctl -w net.core.somaxconn=65535

2.3.2 禁用THP(透明大页)

Linux默认启用的THP可能导致内存分配延迟。
命令

bash 复制代码
echo never > /sys/kernel/mm/transparent_hugepage/enabled

优化后,延迟抖动减少30%。

过渡段:配置调优让Redis的"硬件"跑得更顺畅,但光有好车还不够,接下来我们看看如何选择合适的"赛道"------数据结构和命令。

三、数据结构与命令:选择正确的工具

配置调优打好了Redis性能的基础,但要想真正跑出"加速度",还得用对数据结构和命令。Redis提供了丰富的数据类型和操作指令,它们就像工具箱里的各种工具,每种都有自己的"擅长领域"。这一章,我们将分析常用数据结构的性能特性,探讨高效命令的使用技巧,并分享一些踩坑经验,帮助你避免"拿着锤子找钉子"的尴尬。

3.1 常用数据结构的性能分析

Redis的五大基本数据结构------String、Hash、List、Set和ZSet------各有优劣,选择时需要结合业务场景权衡内存占用和执行效率。

3.1.1 String:简单键值对的高效使用

String是最基础的数据结构,适合存储简单的键值对,比如用户ID和昵称的映射。它的操作复杂度通常是O(1),非常高效。

实战场景 :缓存用户信息时,SET user:123 "Alice"的内存占用仅为键值本身大小,查询延迟稳定在1ms以下。

3.1.2 Hash:小对象存储的内存优化

Hash适合存储结构化数据,比如一个用户的多个属性。相比用多个String键(如user:123:nameuser:123:age),Hash能显著节省内存。

对比分析

方式 内存占用 查询性能 适用场景
多String 每个键有额外开销 O(1) 数据量少
Hash (hset) 单键存储多字段 O(1) 小对象聚合

示例:用Hash存储用户信息:

bash 复制代码
HSET user:123 name "Alice" age "25"

内存占用减少约40%,尤其在字段较多时效果更明显。

3.1.3 List:队列场景的优化

List常用于消息队列或任务列表,LPUSHRPOP操作复杂度为O(1)。但当列表过长时,遍历或插入中间元素会变慢(O(n))。

优化建议 :控制List长度,避免超过5000条,可通过分片存储(如list:20250406:part1)。

3.1.4 Set vs ZSet:去重与排序的权衡

Set用于无序去重集合,ZSet则是有序集合。
对比分析

类型 内存占用 操作复杂度 适用场景
Set 较低 O(1) 添加/查询 单纯去重
ZSet 较高 O(log n) 排序+去重(如排行榜)

实战案例:社交平台的"关注列表"用Set,排行榜用ZSet,避免混用导致性能下降。

示意图:数据结构选择流程

rust 复制代码
[业务需求] --> [需要排序?] --> Yes --> [ZSet]
                           --> No  --> [需要去重?] --> Yes --> [Set]
                                                --> No  --> [List/Hash/String]

3.2 高效命令的使用

命令是Redis的"操作手册",用得好能大幅提升性能,用不好则可能埋下隐患。

3.2.1 Pipeline:批量操作减少RTT

网络往返时间(RTT)是Redis性能的隐形杀手。Pipeline允许将多个命令打包发送,减少网络开销。

示例代码(Java Jedis)

java 复制代码
Jedis jedis = new Jedis("localhost", 6379);
Pipeline pipeline = jedis.pipelined();
for (int i = 0; i < 1000; i++) {
    pipeline.set("key:" + i, "value:" + i); // 批量设置1000个键值对
}
pipeline.sync(); // 执行并等待结果
jedis.close();

效果:单次RTT从10ms降至一次批量操作的12ms,吞吐量提升近50倍。

3.2.2 mget/mset:多键操作的利器

MGETMSET允许一次获取或设置多个键,避免逐个操作的开销。
示例

bash 复制代码
MSET key1 value1 key2 value2
MGET key1 key2

相比单次GET,延迟降低约30%。

3.3 踩坑经验

3.3.1 滥用keys命令的灾难

KEYS命令会扫描整个键空间,复杂度O(n),在大规模数据下会导致Redis阻塞。
真实案例 :某项目用KEYS *遍历所有键,10万键时延迟飙升至5秒,业务几乎停摆。

替代方案:用SCAN
SCAN提供增量式迭代,复杂度更可控。
示例代码(Python redis-py)

python 复制代码
import redis

r = redis.Redis(host='localhost', port=6379)
cursor = 0
while True:
    cursor, keys = r.scan(cursor=cursor, match='user:*', count=100)
    for key in keys:
        print(key.decode('utf-8'))
    if cursor == 0:  # 遍历完成
        break

优化结果:延迟稳定在20ms以内,避免阻塞。

注意事项 :设置合理的count值(建议100-1000),避免一次返回过多数据。

过渡段:数据结构和命令的选择就像给Redis装上了合适的"轮胎"和"方向盘",但要真正跑起来,还得看代码实现这一环。接下来,我们将深入客户端调用和业务逻辑的优化。

四、代码实现:从客户端到业务逻辑的优化

配置调优和数据结构选择为Redis铺好了跑道,但最终的"加速度"还要靠代码实现来踩下油门。这一章,我们将从客户端连接管理入手,探讨序列化效率、分布式锁实现,以及热点数据的处理策略。每个部分都会结合实战经验,提供可复用的代码示例和踩坑教训,让你的Redis调用更高效、更稳定。

4.1 客户端连接管理

Redis客户端的连接方式直接影响性能。连接池配置不当可能导致资源浪费或请求排队,影响QPS和延迟。

4.1.1 连接池配置:Jedis的优化参数

Jedis是Java常用的Redis客户端,合理的连接池配置能显著提升性能。
示例代码

java 复制代码
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(200);    // 最大连接数
config.setMaxIdle(50);      // 最大空闲连接数
config.setMinIdle(10);      // 最小空闲连接数,确保低负载时快速响应
config.setMaxWaitMillis(3000); // 获取连接的最大等待时间

JedisPool pool = new JedisPool(config, "localhost", 6379);

参数解析

参数 建议值 作用
maxTotal 100-500 控制并发能力,依业务规模调整
maxIdle 20-100 保持活跃连接,避免频繁创建
maxWaitMillis 1000-5000 避免长时间阻塞

4.1.2 长连接 vs 短连接

  • 长连接 :适合高频操作,减少建立连接的开销,但需注意超时设置(timeout)。
  • 短连接 :适合低频访问,避免空闲连接占用资源。
    实战建议:业务QPS高于1000时优先用长连接,否则按需选择。

4.2 序列化与反序列化

Redis存储的是字节数组,客户端需要将对象序列化后存入,反序列化后读取。序列化效率直接影响网络传输和计算开销。

4.2.1 JSON vs Protobuf对比

实战案例:在一个用户数据缓存场景中,我们对比了JSON和Protobuf:

方式 序列化时间 数据大小 网络传输时间
JSON 2ms 120B 0.5ms
Protobuf 1.5ms 60B 0.3ms

结果 :Protobuf减少50%的网络传输量,适合高吞吐场景。
代码示例(Protobuf)

java 复制代码
// 定义Proto文件
message User {
  string name = 1;
  int32 age = 2;
}

// Java使用
User user = User.newBuilder().setName("Alice").setAge(25).build();
byte[] bytes = user.toByteArray();
jedis.set("user:123".getBytes(), bytes);

4.3 分布式锁的高效实现

分布式锁是Redis的常见应用,尤其在秒杀、库存扣减等场景中至关重要。

4.3.1 Redisson锁 vs 手写SETNX

  • 手写锁:简单但易出错。
java 复制代码
public boolean lock(Jedis jedis, String key, String value, int expire) {
    String result = jedis.set(key, value, "NX", "EX", expire); // NX:仅在键不存在时设置
    return "OK".equals(result);
}

问题:未释放锁可能导致死锁。

  • Redisson锁 :封装完善,支持自动续期。
    示例代码
java 复制代码
import org.redisson.Redisson;
import org.redisson.api.RLock;

Redisson redisson = Redisson.create(config);
RLock lock = redisson.getLock("lock:order:123");
lock.lock(10, TimeUnit.SECONDS); // 锁定10秒
try {
    // 业务逻辑:扣库存
    jedis.decr("stock:123");
} finally {
    lock.unlock(); // 确保释放锁
}

踩坑经验:早期手写锁未考虑异常退出,锁未释放导致库存无法扣减。切换Redisson后,问题解决,QPS提升20%。

4.4 热点数据处理

热点数据的高频访问容易压垮Redis,结合本地缓存是个好办法。

4.4.1 Guava Cache + Redis

场景 :商品详情页的高频查询。
实现思路

  1. 本地Guava Cache缓存热点数据,TTL设为5分钟。
  2. 缓存miss时查询Redis,并更新本地缓存。

示例代码

java 复制代码
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

LoadingCache<String, String> localCache = CacheBuilder.newBuilder()
    .maximumSize(1000) // 最大缓存条目
    .expireAfterWrite(5, TimeUnit.MINUTES) // 5分钟过期
    .build(new CacheLoader<String, String>() {
        @Override
        public String load(String key) {
            return jedis.get(key); // 从Redis加载
        }
    });

// 查询
String value = localCache.get("product:123");

优化结果:Redis负载降低70%,延迟从10ms降至1ms。

示意图:热点数据处理流程

css 复制代码
[请求] --> [本地缓存] --> Hit --> [返回]
              | Miss
              v
           [Redis] --> [更新本地缓存] --> [返回]

过渡段:代码优化让Redis的"油门"踩得更稳,但优化效果如何,还得看真实项目的验证。接下来,我们通过一个案例,完整复盘性能优化的实践过程。

五、真实项目案例:性能优化的完整实践

理论和技巧固然重要,但真正的考验在于实战。这一章,我们将走进一个真实的社交平台项目,复盘Redis性能优化的全过程。从问题发现到解决方案落地,再到效果验证,这个案例将为你展示如何将前几章的知识融会贯通,解决实际业务中的性能瓶颈。

5.1 案例背景

这是一个日活跃用户(DAU)百万的社交平台,Redis主要用于存储用户动态(如朋友圈帖子)。每个动态包含发布者ID、内容和时间戳,平均每天新增动态50万条,峰值QPS达到5万。系统架构采用Redis单实例部署,内存分配为16GB。

5.2 问题描述

在一次活动推广期间,高峰期QPS激增至8万,Redis表现却"掉链子":

  • 查询延迟从平时的20ms飙升至500ms,用户加载动态时明显卡顿。
  • 内存使用率接近100%,频繁触发键淘汰,导致部分动态丢失。
  • CPU占用率居高不下,分析发现大量命令执行时间过长。

5.3 优化过程

针对问题,我们分三步优化:配置调整、数据结构优化和代码改进。

5.3.1 配置调优:调整内存策略

问题 :默认的volatile-lru策略只淘汰设置了过期时间的键,但动态数据未统一设置TTL,导致内存溢出。
解决方案

  • 修改maxmemory-policyallkeys-lru,全局淘汰不常用键。
  • 设置maxmemory 14gb,预留2GB给系统。
    效果:内存使用率降至85%,淘汰集中在冷数据上,动态丢失问题解决。

5.3.2 数据结构优化:List换ZSet

问题 :动态存储使用List(LPUSH存新动态,LRANGE分页查询),但列表过长(单用户超1万条)导致LRANGE复杂度飙升至O(n)。
解决方案

  • 将List替换为ZSet,以时间戳作为score,实现排序和分页。
  • 新增动态:ZADD timeline:user:123 <timestamp> <post_id>
  • 分页查询:ZREVRANGEBYSCORE timeline:user:123 +inf -inf LIMIT 0 10
    效果:查询复杂度降至O(log n + m),延迟从300ms降至30ms。

5.3.3 代码优化:引入Pipeline

问题 :客户端逐条查询多个用户动态,RTT开销巨大。
解决方案 :使用Pipeline批量获取。
代码示例

java 复制代码
Jedis jedis = pool.getResource();
Pipeline pipeline = jedis.pipelined();
List<String> userIds = Arrays.asList("123", "456", "789");
for (String userId : userIds) {
    pipeline.zrevrangeByScore("timeline:user:" + userId, "+inf", "-inf", 0, 10);
}
List<Object> results = pipeline.syncAndReturnAll();

效果:单次请求延迟从50ms降至15ms,QPS提升至12万。

5.4 优化结果

经过以上优化,系统性能显著提升:

  • QPS:从5万提升至15万,增长3倍。
  • 延迟:从500ms降至50ms以内,用户体验明显改善。
  • 内存使用率:稳定在80%-90%,不再频繁淘汰热点数据。

效果对比表

指标 优化前 优化后 提升幅度
QPS 5万 15万 300%
延迟 500ms 50ms 90%降低
内存使用率 ~100% 85% 更稳定

5.5 经验总结

这个案例让我深刻体会到分层优化的重要性:

  1. 配置先行:先解决内存和资源分配问题,避免"基础不牢"。
  2. 数据结构跟进:针对业务特点选择合适的工具,效率翻倍。
  3. 代码收尾:通过批量操作压榨网络性能,锦上添花。

示意图:优化路径

css 复制代码
[问题分析] --> [配置调优] --> [数据结构优化] --> [代码优化] --> [性能提升]

过渡段:通过这个案例,我们看到了Redis优化的威力,但实践中的坑也不少。接下来,我们总结一些常见误区和避坑指南,帮助你少走弯路。

六、常见误区与避坑指南

Redis性能优化是一把双刃剑,用得好能让系统如虎添翼,用不好则可能自乱阵脚。在长期的实践中,我发现许多开发者容易陷入一些误区,这些"坑"往往源于对Redis特性的误解或过度追求极致性能。这一章,我们将梳理三大常见误区,分享避坑经验,帮助你在优化之路上走得更稳。

6.1 盲目追求高性能的代价

误区 :为了追求极致QPS或低延迟,过度优化配置和代码。
真实案例 :某项目将maxmemory-policy设为noeviction(永不淘汰),以为能保住所有数据,结果内存溢出,Redis直接宕机。
教训:性能优化要与业务需求平衡,过度优化可能导致代码复杂度上升或稳定性下降。

避坑建议

  • 根据业务优先级选择优化目标:延迟敏感型应用(如实时聊天)优先降低延迟,吞吐量敏感型(如日志系统)优先提升QPS。
  • 保留适度冗余,比如预留20%内存,避免极端情况下的崩溃。

6.2 忽视监控的重要性

误区 :优化完成后不持续监控,认为"调好了就万事大吉"。
真实案例 :一个电商项目优化后QPS提升至10万,但未监控慢查询日志(slowlog),结果一次KEYS *操作偷偷上线,延迟激增至2秒才被发现。
教训:Redis性能会随数据量和访问模式变化,缺乏监控等于"闭眼开车"。

避坑建议

  • 慢日志 :配置slowlog-log-slower-than 10000(单位微秒,10ms),定期检查SLOWLOG GET
  • INFO命令 :用INFO MEMORYINFO STATS监控内存和命令执行情况。
  • 外部工具:引入Prometheus + Grafana,实时可视化QPS、延迟和内存使用率。

示例命令

bash 复制代码
CONFIG SET slowlog-log-slower-than 10000
SLOWLOG GET 10  # 查看最近10条慢查询

6.3 不合理的集群设计

误区 :业务规模不大时急于上Redis Cluster,追求高可用和高并发。
真实案例 :一个日活10万的小型应用部署了6节点Cluster,结果运维成本翻倍,性能却因跨槽查询下降10%。
教训:集群虽好,但引入复杂度,适合大流量场景,小规模业务反而"画蛇添足"。

避坑建议

  • 单实例:日QPS低于50万时,单实例+主从足以应对。
  • 分片:数据量大但并发不高时,手动分片(按业务Key划分)比Cluster更灵活。
  • Cluster时机:QPS超百万或需要自动故障转移时再考虑。

对比表:部署模式选择

模式 优点 缺点 适用场景
单实例 简单,性能高 单点风险 小规模业务
主从 读写分离,备份 写仍单点 中等规模
Cluster 高可用,分布式 复杂,跨槽开销 大规模高并发

过渡段:避开这些误区,Redis优化才能事半功倍。到此,我们已经从配置、数据结构、代码实现和实战案例,全面剖析了性能优化的方方面面。接下来,让我们总结经验,并展望未来的趋势。

七、总结与展望

经过前六章的深入探讨,我们从配置调优到代码实现,完成了一次Redis性能优化的全景之旅。这一章,我们将提炼核心收获,分享实践建议,并展望Redis未来的发展趋势,希望为你的优化之路点亮一盏明灯。

7.1 核心收获

Redis性能优化并非单一维度的努力,而是配置、数据结构和代码实现的三重奏:

  • 配置调优奠定基础,像给Redis装上强劲的"引擎",确保内存、网络和持久化策略匹配业务需求。
  • 数据结构选择提升效率,好比选对"赛道",让每种场景用上最合适的工具。
  • 代码实现压榨潜力,通过连接池、序列化和批量操作,把性能推向极致。

实践建议

  1. 分层优化:从小处入手,先调配置,再优数据结构,最后改代码。
  2. 监控先行:用慢日志和INFO命令建立性能基线,避免盲目调整。
  3. 从小到大:从单实例开始,逐步扩展到主从或Cluster,切忌一步到位。

这些经验都源于实战中的踩坑与成长。比如,我曾在追求极致性能时忽视了数据安全性,结果付出了宕机的代价。从那以后,我学会了在性能与稳定间找到平衡点。

7.2 未来趋势

Redis作为开源项目的标杆,仍在快速发展。以下是值得关注的方向:

  • Redis 7.0新特性:多线程I/O的引入显著提升了网络处理能力,尤其在高并发场景下,QPS有望再翻倍。建议关注其稳定性和实际应用效果。
  • 云原生优化:随着Kubernetes普及,Redis Operator和Serverless Redis成为趋势,如何在容器化环境中优化延迟和成本是个新课题。
  • 生态融合:Redis Modules(如RedisJSON、RedisGraph)扩展了功能边界,未来可能与大数据工具(如Spark)更紧密结合。

个人心得:Redis就像一匹烈马,驾驭得好能跑得飞快,但也需要耐心调教。我建议开发者保持学习心态,多尝试、多总结,找到适合自己业务的"独家配方"。

结语:性能优化没有终点,只有起点。希望这篇指南能为你提供实用的思路和工具,让你在Redis的世界里游刃有余。无论是面对秒杀的高并发,还是热点数据的低延迟,愿你都能从容应对,跑出属于自己的"最优解"。

相关推荐
艾菜籽3 小时前
MyBatis操作数据库入门
java·数据库·mybatis
-Initiation3 小时前
数据库的安全与保护
数据库·安全
蔚蓝星辰mic3 小时前
数据库运维查询SQL语句集合
数据库·sql·1024程序员节
NocoBase4 小时前
8 人团队如何效率拉满?——创联云的开发方法论
数据库·低代码·开源
kgduu5 小时前
go-ethereum core之交易索引txIndexer
服务器·数据库·golang
摇滚侠5 小时前
全面掌握 PostgreSQL 关系型数据库,PostgreSQL 介绍,笔记02
数据库·笔记·postgresql
百锦再5 小时前
国产数据库替代MongoDB的技术实践:金仓数据库赋能浙江省人民医院信息化建设新展望
java·开发语言·数据库·mongodb·架构·eclipse·maven
程序边界5 小时前
MongoDB迁移到KES实战全纪录(下):性能优化与实践总结
数据库·mongodb·性能优化
武子康5 小时前
Java-160 MongoDB副本集部署实战 单机三实例/多机同法 10 分钟起集群 + 选举/读写/回滚全流程
java·数据库·sql·mongodb·性能优化·系统架构·nosql