在Spring Cloud微服务项目中遇到Redis CPU飙升

在Spring Cloud微服务项目中遇到Redis CPU飙升的问题时,可以按照以下步骤进行排查和解决:

监控和分析

在监控和分析Redis性能时,关注CPU使用率、内存使用、网络流量和命令统计等是非常关键的。下面我将详细说明如何使用Redis自带的命令和监控工具。

1.使用Redis自带的INFO命令

  1. 命令介绍INFO命令用于获取Redis服务器的状态信息,包括内存、CPU、客户端连接、持久化等各方面的详细数据。

  2. 实例代码

    bash 复制代码
    redis-cli INFO

    这条命令将输出大量的信息,您可以根据需要关注特定的部分,例如memory用于内存信息,cpu用于CPU使用情况。

  3. 关键指标解读

    • used_memory:Redis分配器分配的内存总量,过高可能表示内存泄漏或缓存过大。
    • used_cpu_sys:Redis服务器耗费的系统CPU时间。
    • connected_clients:当前连接的客户端数量,过多的连接可能会导致性能下降。

2.使用redis-cli --stat

  1. 命令介绍redis-cli --stat 提供了一个实时更新的界面,显示关键的Redis性能指标。

  2. 实例代码

    bash 复制代码
    redis-cli --stat

    这个命令将实时显示操作次数、网络流量、已连接客户端数等信息。

  3. 关键指标解读

    • ops/sec:每秒操作次数,反映了Redis的负载情况。
    • network:网络输入/输出字节数,有助于识别网络瓶颈。

3.使用redis-top或第三方监控工具

  1. 工具介绍redis-top是一个第三方的实时监控工具,类似于Linux的top命令,专门为Redis设计。

    第三方监控工具,如Prometheus和Grafana,可以提供更详细的监控和图形化界面。

  2. 安装和使用redis-top

    bash 复制代码
    git clone https://github.com/myzhan/redis-top.git
    cd redis-top
    python redis-top.py

    这将启动redis-top,并显示实时数据。

  3. 配置Prometheus和Grafana监控(更高级):

    • 安装Prometheus和Grafana。
    • 配置Prometheus以从Redis收集指标。
    • 在Grafana中创建仪表板来展示这些指标。

关注指标

  • CPU使用率:高CPU使用率可能表示Redis正在处理大量请求或遇到了性能问题。

  • 内存使用:内存泄漏、不当的键设计或大key可能导致内存使用不断增加。

  • 网络流量:监控网络流量有助于识别是否存在大量的数据传输或频繁的小数据传输,这可能会影响Redis的性能。

  • 命令统计:了解Redis处理的命令类型和频率,可以帮助识别哪些操作最耗资源。

确定热点操作

确定热点操作是解决Redis性能问题的关键一环,主要通过两种方式:使用SLOWLOG命令查找执行时间较长的命令,和使用MONITOR命令实时监控Redis操作。下面将详细说明这两个命令的使用方法和思考步骤。

1.使用SLOWLOG命令查找慢查询

  1. 命令介绍SLOWLOG命令用于记录执行时间超过指定阈值的命令。这有助于识别耗时的操作,是性能优化的重要参考。

  2. 实例代码

    bash 复制代码
    redis-cli SLOWLOG GET 10

    此命令返回最近的10条慢查询。

  3. 分析和思考

    • 查看慢查询的具体命令和执行时间。
    • 分析导致查询变慢的原因,如大key操作、复杂的数据结构操作等。
  4. 设置慢查询阈值

    bash 复制代码
    redis-cli CONFIG SET slowlog-log-slower-than <microseconds>

    这个命令可以设置慢查询的阈值,单位是微秒。

2.使用MONITOR命令实时监控Redis操作

  1. 命令介绍MONITOR是一个调试命令,它实时打印出服务器接收到的每一个命令,用于实时监控和诊断。

  2. 实例代码

    bash 复制代码
    redis-cli MONITOR

    运行此命令后,你会看到所有通过Redis执行的命令。

  3. 分析和思考

    • 监控命令输出,寻找频繁出现的操作。
    • 注意大key操作,如对大hash或大list的操作。
    • 监测是否有不合理的全键扫描(如KEYS *)。

代码层面排查

代码层面的排查是定位和解决Redis性能问题的关键步骤之一。在微服务架构中,不同的服务可能以不同的方式与Redis交互,因此需要仔细审核相关代码。以下是进行代码层面排查的步骤和实例:

1. 审核频繁的读写操作

  • 问题:频繁的读写操作可能导致Redis CPU使用率升高和响应时间延迟。

  • 排查方法

    • 审查代码,寻找大量重复的Redis读写操作,特别是在循环中的操作。
    • 检查是否有未使用缓存或缓存过期策略不当的情况。
  • 代码示例(Java使用Jedis):

    java 复制代码
    Jedis jedis = new Jedis("localhost");
    for (int i = 0; i < 10000; i++) {
        jedis.set("key" + i, "value" + i); // 频繁写操作
        jedis.get("key" + i); // 频繁读操作
    }
    jedis.close();

    这段代码在循环中频繁进行读写操作,可能导致性能问题。

2. 检查大key操作

  • 问题:大key操作会占用大量内存和CPU资源,影响Redis性能。

  • 排查方法

    • 检查是否有将大量数据存储在单个key中的情况,如大列表、大哈希表等。
    • 使用MEMORY USAGE key命令检查key的内存占用。
  • 代码示例

    java 复制代码
    Jedis jedis = new Jedis("localhost");
    // 假设有一个大的列表
    for (int i = 0; i < 100000; i++) {
        jedis.lpush("largeList", "element" + i);
    }
    jedis.close();

    这段代码创建了一个非常大的列表,可能导致性能问题。

3. 避免不必要的全键扫描

  • 问题 :使用如KEYS命令进行全键扫描会阻塞Redis并消耗大量CPU资源。

  • 排查方法

    • 审查代码,查找是否使用了KEYS等全键扫描命令。
    • 考虑使用更高效的命令,如SCAN
  • 代码示例

    java 复制代码
    Jedis jedis = new Jedis("localhost");
    Set<String> keys = jedis.keys("*"); // 不推荐在生产环境使用
    for (String key : keys) {
        // 对key进行操作
    }
    jedis.close();

    这段代码使用了KEYS命令进行全键扫描,可能导致性能问题。

连接管理

在微服务架构中,合理管理Redis的连接非常关键,因为不恰当的连接管理可能会导致性能问题。下面我们详细探讨如何检查和配置Redis的连接数和连接池,并提供相应的实例代码。

1.检查Redis连接数

  1. 使用INFO命令

    bash 复制代码
    redis-cli INFO clients

这个命令可以显示当前连接到Redis的客户端数量和一些相关信息。

  1. 关键指标

    • connected_clients:当前已连接的客户端数量。
    • maxclients:服务器配置的最大客户端连接数。

2.配置连接池

连接池的使用可以有效减少频繁建立和销毁连接的开销,提升性能。

Java中使用Jedis连接池的示例

  1. 创建连接池配置

    java 复制代码
    JedisPoolConfig poolConfig = new JedisPoolConfig();
    poolConfig.setMaxTotal(50); // 最大连接数
    poolConfig.setMaxIdle(10);  // 最大空闲连接数
    poolConfig.setMinIdle(5);   // 最小空闲连接数
    poolConfig.setTestOnBorrow(true); // 在获取连接的时候检查有效性
  2. 创建Jedis连接池

    java 复制代码
    JedisPool jedisPool = new JedisPool(poolConfig, "localhost", 6379);
  3. 使用连接池

    java 复制代码
    try (Jedis jedis = jedisPool.getResource()) {
        // 执行Redis操作
        jedis.set("key", "value");
        String value = jedis.get("key");
        // ...
    } // 连接将自动归还给连接池

Spring Boot中配置连接池

如果使用Spring Boot,通常可以在application.ymlapplication.properties中配置。

  1. 在application.yml中配置

    yaml 复制代码
    spring:
      redis:
        host: localhost
        port: 6379
        jedis:
          pool:
            max-active: 50  # 最大连接数
            max-idle: 10    # 最大空闲连接数
            min-idle: 5     # 最小空闲连接数
  2. 使用RedisTemplate : 在Spring Boot应用中,可以直接注入RedisTemplateStringRedisTemplate来执行操作。

Redis配置调优

对Redis进行配置调优是提高其性能和稳定性的重要步骤。这包括调整内存管理、选择合适的持久化策略以及优化其他相关配置。以下是一些主要的调优方向和示例。

1. 调整maxmemory策略

  • 问题:当Redis用作缓存时,如果内存不足以容纳所有数据,就需要一种机制来决定哪些数据被移除。

  • 解决方案 :设置maxmemory配置,并选择一个适当的淘汰策略。

  • 配置示例

    bash 复制代码
    CONFIG SET maxmemory 100mb
    CONFIG SET maxmemory-policy allkeys-lru

    这个例子设置了最大内存为100MB,并采用了allkeys-lru(最近最少使用)策略,当内存达到限制时,会淘汰最近最少使用的键。

2. 优化持久化设置

Redis支持两种主要的持久化方式:RDB(快照)和AOF(只追加文件)。

RDB持久化

  • 优点:RDB是一种高效的方式来保存Redis在某一时刻的数据快照。

  • 配置示例

    bash 复制代码
    CONFIG SET save "60 10000"  # 60秒内如果超过10000次更新则触发RDB持久化

AOF持久化

  • 优点:AOF记录每次写操作,重启时通过重放这些操作来恢复数据。

  • 配置示例

    bash 复制代码
    CONFIG SET appendonly yes
    CONFIG SET appendfsync everysec  # 每秒同步一次到磁盘

3. 其他性能相关的配置

  • TCP连接设置

    bash 复制代码
    CONFIG SET tcp-keepalive 60

设置TCP保持活动的时间,有助于防止网络设备意外关闭空闲连接。

  • 禁用不必要的命令 : 如果某些危险命令(如FLUSHALLKEYS)不需要在生产环境中使用,可以考虑禁用它们以提高安全性。

硬件资源检查

硬件资源对于确保Redis和整个微服务架构的性能至关重要。如果硬件资源不足,无论如何优化代码或Redis配置,都可能无法达到理想的性能。以下是检查和评估服务器硬件资源的步骤及相关建议。

1. 检查CPU使用率

  • 重要性:高CPU使用率可能会导致Redis响应缓慢。

  • 检查方法 :可以使用操作系统提供的工具,如Linux中的tophtop命令。

  • 命令示例

    bash 复制代码
    top

    top界面中,查看%Cpu(s)字段来了解CPU使用情况。

2. 检查内存使用

  • 重要性:Redis是基于内存的存储系统,充足的内存对于其性能至关重要。

  • 检查方法 :使用如free命令检查系统的内存使用情况。

  • 命令示例

    bash 复制代码
    free -m

    这会显示以MB为单位的内存使用情况,包括总量、已用量和可用量。

3. 磁盘IO性能

  • 重要性:尤其是当使用AOF持久化时,磁盘的IO性能会直接影响Redis的性能。

  • 检查方法 :可以使用iostat工具来检查。

  • 命令示例

    bash 复制代码
    iostat -dx 2

    这会显示每个设备的磁盘IO统计信息。

4. 网络带宽

  • 重要性:对于分布式微服务和Redis集群,网络带宽是一个重要的考虑因素。

  • 检查方法 :使用iftopnload等工具来监控网络流量。

  • 命令示例

    bash 复制代码
    iftop

    这会显示网络接口的实时带宽使用情况。

Redis分片或集群

当单个Redis实例无法满足性能需求或需要提高可用性时,可以考虑使用Redis分片或集群。这些方法可以提高Redis的扩展性和容错能力。

1.Redis分片(Sharding)

分片是将数据分布在多个Redis实例上的过程,可以横向扩展性能和容量。

  1. 使用客户端分片

    • 客户端分片是最常见的分片方法,它通过在客户端逻辑中分配键到不同的Redis实例来实现。
    • 每个实例独立运行,没有内部通信。
  2. 客户端分片的实例代码

    在Spring Boot架构中实现Redis客户端分片,通常需要使用第三方库来辅助处理分片逻辑。Spring Boot自身并不直接提供客户端分片的功能,但可以通过配置多个RedisTemplateJedisConnectionFactory来实现。下面是一个基于Spring Boot的Redis客户端分片的简单示例:

    1. 添加依赖

      首先确保在pom.xml中添加了Redis的依赖,如spring-boot-starter-data-redis

    2. 配置多个Redis连接工厂

      在Spring配置文件中定义多个JedisConnectionFactory,每个对应一个Redis实例。

      java 复制代码
      @Configuration
      public class RedisConfig {
      
       @Bean
          public JedisConnectionFactory redisConnectionFactory1() {
              RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("server1", 6379);
              return new JedisConnectionFactory(config);
          }
      
          @Bean
          public JedisConnectionFactory redisConnectionFactory2() {
              RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("server2", 6379);
              return new JedisConnectionFactory(config);
          }
      
          // 可以根据需要配置更多的Redis连接工厂
      }
    3. 创建分片策略

      接下来,创建一个简单的分片策略,用于根据key决定使用哪个Redis实例。

      java 复制代码
      public class RedisShardingStrategy {
      
          private List<JedisConnectionFactory> connectionFactories;
      
          public RedisShardingStrategy(List<JedisConnectionFactory> connectionFactories) {
              this.connectionFactories = connectionFactories;
          }
      
          public JedisConnectionFactory getShard(String key) {
              int shardIndex = Math.abs(key.hashCode()) % connectionFactories.size();
              return connectionFactories.get(shardIndex);
          }
      }
    4. 创建RedisTemplate实例

      为每个JedisConnectionFactory创建对应的RedisTemplate实例。

      java 复制代码
      @Bean
      public RedisTemplate<String, Object> redisTemplate1() {
          RedisTemplate<String, Object> template = new RedisTemplate<>();
          template.setConnectionFactory(redisConnectionFactory1());
          return template;
      }
      
      @Bean
      public RedisTemplate<String, Object> redisTemplate2() {
          RedisTemplate<String, Object> template = new RedisTemplate<>();
          template.setConnectionFactory(redisConnectionFactory2());
          return template;
      }
      
      // 为其他连接工厂创建更多的RedisTemplate实例
    5. 使用分片策略

      在服务中使用RedisShardingStrategy来选择合适的RedisTemplate进行操作。

      java 复制代码
      @Service
      public class RedisService {
      
          private final RedisShardingStrategy shardingStrategy;
          private final List<RedisTemplate<String, Object>> redisTemplates;
      
          public RedisService(RedisShardingStrategy shardingStrategy, 
                              List<RedisTemplate<String, Object>> redisTemplates) {
              this.shardingStrategy = shardingStrategy;
              this.redisTemplates = redisTemplates;
          }
      
          private RedisTemplate<String, Object> getRedisTemplate(String key) {
              JedisConnectionFactory factory = shardingStrategy.getShard(key);
              for (RedisTemplate<String, Object> template : redisTemplates) {
                  if (template.getConnectionFactory().equals(factory)) {
                      return template;
                  }
              }
              throw new IllegalStateException("No RedisTemplate found for given key");
          }
      
          public void setValue(String key, Object value) {
              RedisTemplate<String, Object> template = getRedisTemplate(key);
              template.opsForValue().set(key, value);
          }
      
          public Object getValue(String key) {
              RedisTemplate<String, Object> template = getRedisTemplate(key);
              return template.opsForValue().get(key);
          }
      }

2.Redis集群(Clustering)

Redis集群提供了一个更高级的解决方案,通过自动分片和提供数据复制及故障转移来扩展Redis。

  1. 集群特性

    • Redis集群将数据自动分片到多个节点。
    • 提供数据复制和故障转移功能,提高可用性。
  2. 搭建Redis集群

    • 需要至少三个Redis节点来构建一个稳定的集群。
    • 使用Redis的cluster meet命令将节点互相连接。
  3. Redis集群的配置示例

    • 假设有三个Redis节点,端口分别为7000、7001、7002。

    • 配置文件示例(为每个节点创建):

      conf 复制代码
      port 7000
      cluster-enabled yes
      cluster-config-file nodes.conf
      cluster-node-timeout 5000
      appendonly yes
    • 使用redis-cli --cluster create命令创建集群。

应用层优化

应用层优化是提高缓存效率和减轻对Redis依赖的重要手段。它涉及到缓存策略的优化、对热点数据的特殊处理,以及本地缓存和缓存预热的实现。以下是一些主要的应用层优化策略和示例代码。

1.缓存策略优化

  1. 失效策略

    • 设置合理的缓存失效时间,避免数据过时或缓存满载。
    • 对于一些经常访问但不常更新的数据,可以设置较长的缓存时间。
  2. 热点数据处理

    • 对于频繁访问的热点数据,可以采用更高效的缓存策略,如增加副本、使用更快的存储介质等。
  3. Java中的缓存操作示例

    java 复制代码
    public class RedisCache {
        private JedisPool jedisPool;
    
        public RedisCache(JedisPool jedisPool) {
            this.jedisPool = jedisPool;
        }
    
        public String getData(String key) {
            try (Jedis jedis = jedisPool.getResource()) {
                // 尝试从缓存中获取数据
                String value = jedis.get(key);
                if (value == null) {
                    // 如果缓存中没有,从数据库或其他地方加载
                    value = loadDataFromDB(key);
                    // 设置缓存,同时设置过期时间为1小时
                    jedis.setex(key, 3600, value);
                }
                return value;
            }
        }
    
        private String loadDataFromDB(String key) {
            // 加载数据的逻辑...
            return "some_data";
        }
    }

2.本地缓存与缓存预热

  1. 本地缓存

    • 对于高频访问但更新不频繁的数据,可以在本地内存中缓存,以减少对Redis的访问。
    • 本地缓存可以使用Guava Cache、Caffeine等库实现。
  2. 缓存预热

    • 在系统启动时或定期将热点数据加载到缓存中,减少冷启动时的大量数据库访问。
  3. Java中的本地缓存示例(使用Guava Cache):

    java 复制代码
    import com.google.common.cache.Cache;
    import com.google.common.cache.CacheBuilder;
    
    public class LocalCache {
        private Cache<String, String> cache;
    
        public LocalCache() {
            cache = CacheBuilder.newBuilder()
                                .maximumSize(1000)
                                .expireAfterWrite(10, TimeUnit.MINUTES)
                                .build();
        }
    
        public String getData(String key) {
            String value = cache.getIfPresent(key);
            if (value == null) {
                value = loadDataFromDB(key);
                cache.put(key, value);
            }
            return value;
        }
    
        private String loadDataFromDB(String key) {
            // 加载数据的逻辑...
            return "some_data";
        }
    }

压力测试

进行压力测试是评估和优化系统性能的重要环节,尤其是对于像Redis这样的缓存系统。在非生产环境中进行压力测试可以帮助发现潜在的性能瓶颈,从而优化系统的整体表现。以下是进行Redis压力测试的一些步骤和建议:

1. 选择压力测试工具

对于Redis,常用的压力测试工具有:

  • redis-benchmark:Redis自带的性能测试工具,可以快速进行基础性能测试。
  • JMeter:一个广泛使用的性能测试工具,可以进行更复杂的测试场景模拟。
  • 自定义脚本:基于你的具体需求编写测试脚本,模拟真实的应用场景。

2. 设置测试环境

  • 确保测试环境与生产环境尽可能相似,包括硬件配置、网络环境和数据量。
  • 在非生产环境进行测试,以避免影响正常业务。

3. 使用redis-benchmark进行基本测试

命令示例

bash 复制代码
redis-benchmark -h redis-host -p 6379 -c 100 -n 100000

这个命令意味着:

  • -h redis-host:指定Redis服务器的地址。
  • -p 6379:指定Redis服务器端口。
  • -c 100:使用100个并发连接。
  • -n 100000:总共发送100000个请求。

测试内容

  • 测试不同类型的操作,如GET、SET等。
  • 观察响应时间和吞吐量。

4. 使用JMeter进行高级测试

测试计划设置

  • 在JMeter中设置测试计划,包括线程组(模拟用户数)、采样器(指定Redis命令)和监听器(结果展示)。

实例使用

  • JMeter通常通过图形界面进行配置,不涉及代码编写。但可以通过JMeter的脚本语言来编写更复杂的测试逻辑。

5. 分析测试结果

  • 分析吞吐量、响应时间和资源利用率(如CPU、内存使用)。
  • 确定性能瓶颈,如是否是网络延迟、Redis配置或硬件资源限制导致。

6. 调整和优化

  • 根据测试结果调整Redis配置,如调整连接数、内存大小等。
  • 优化应用逻辑,比如改善数据访问模式、减少不必要的操作。

7. 重复测试

  • 在做出改进后,重复测试以验证优化效果。
  • 持续监控和测试,以确保系统在不断变化的负载下保持稳定性能。

进行压力测试时,重要的是要确保测试场景尽可能地模拟真实的使用情况。这可能包括模拟高并发请求、大量数据写入、长时间运行等情况。通过这些测试,可以有效地发现和解决系统在高负载下可能遇到的问题。

注意事项

  • 逐步增加负载:开始时应使用较低的负载进行测试,逐渐增加,直到达到预期的最高负载。
  • 监控资源使用情况:在进行测试时,持续监控服务器的CPU、内存、磁盘I/O和网络带宽使用情况。
  • 测试数据准备:确保测试数据的真实性和多样性,以便测试能够覆盖不同的使用场景。
  • 测试结果记录:详细记录测试结果,包括测试条件、执行操作的数量和类型以及系统的响应。
  • 安全备份:在开始测试前确保对现有数据进行备份,避免测试过程中数据丢失或损坏。

通过这些步骤和注意事项,可以有效地进行Redis压力测试,并根据测试结果进行适当的优化和调整。

持续监控

持续监控Redis的性能是确保系统稳定运行的关键环节。它可以帮助你及时发现和响应新出现的问题,从而保持系统的高效和可靠性。以下是进行Redis持续监控的几个关键步骤和建议。

1. 选择监控工具

对于Redis,有多种监控工具可供选择:

  • Redis自带命令 :如INFO, MONITOR, 和SLOWLOG等。
  • 开源监控工具 :如Prometheus结合GrafanaRedis Exporter
  • 商业监控工具 :如Datadog, New Relic, RedisInsight

2. 关键性能指标

监控时应关注以下关键性能指标:

  • 内存使用情况:包括总内存使用量和内存碎片率。
  • CPU使用率:监控Redis进程的CPU使用情况。
  • 客户端连接数:活跃连接数和拒绝的连接数。
  • 吞吐量:每秒命令数。
  • 慢查询日志:记录执行时间过长的命令。

3. 使用Prometheus和Grafana进行监控

以下是使用Prometheus和Grafana进行Redis监控的基本步骤:

安装Prometheus Redis Exporter

Redis Exporter是一个Prometheus Exporter,用于收集Redis的性能指标并使其可用于Prometheus。

bash 复制代码
docker run -d --name redis_exporter -p 9121:9121 oliver006/redis_exporter

配置Prometheus监控Redis

在Prometheus的配置文件中添加Redis Exporter作为数据源。

yaml 复制代码
scrape_configs:
  - job_name: 'redis'
    static_configs:
      - targets: ['<REDIS_EXPORTER_ADDRESS>:9121']

使用Grafana展示数据

  • 在Grafana中添加Prometheus作为数据源。
  • 创建仪表板来展示和分析Redis的性能指标。

4. 设置告警机制

通过配置Prometheus的Alertmanager或使用商业监控工具的告警功能,设置告警规则以便在性能出现问题时及时收到通知。

5.自动化和脚本监控

对于一些特定的监控需求,可以编写自定义脚本来收集和分析数据。例如,使用Python或Shell脚本定期调用Redis命令,然后将结果发送到监控系统或记录到日志文件。

python 复制代码
# Python脚本示例 - 使用redis-py库监控Redis
import redis
import json

redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)

def get_redis_info():
    info = redis_client.info()
    print(json.dumps(info, indent=4))

get_redis_info()

6. 日志记录和分析

  • 使用Redis日志记录功能,记录关键事件和潜在的问题。
  • 定期分析日志文件,查找异常模式或潜在的问题。

以上步骤需要根据具体的系统环境和业务需求进行调整和优化。在处理过程中,建议逐步实施,避免大规模同时变更,以免引入新的问题。

相关推荐
BergerLee2 小时前
对不经常变动的数据集合添加Redis缓存
数据库·redis·缓存
huapiaoy2 小时前
Redis中数据类型的使用(hash和list)
redis·算法·哈希算法
【D'accumulation】3 小时前
令牌主动失效机制范例(利用redis)注释分析
java·spring boot·redis·后端
Cikiss3 小时前
微服务实战——SpringCache 整合 Redis
java·redis·后端·微服务
一休哥助手4 小时前
Redis 五种数据类型及底层数据结构详解
数据结构·数据库·redis
盒马盒马5 小时前
Redis:zset类型
数据库·redis
我是陈泽5 小时前
一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码
开发语言·python·程序员·编程·python教程·python学习·python教学
杨荧6 小时前
【JAVA开源】基于Vue和SpringBoot的洗衣店订单管理系统
java·开发语言·vue.js·spring boot·spring cloud·开源
Jay_fearless7 小时前
Redis SpringBoot项目学习
spring boot·redis
Wang's Blog7 小时前
Redis: 集群环境搭建,集群状态检查,分析主从日志,查看集群信息
数据库·redis