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

springboot操作redis集群,注意事项

整合redis可查看博文
springboot 整合redis_springboot整合redis csdn-CSDN博客

集群中操作注意事项

1 多键操作失败
当使用multiGet等需要同时访问多个键的方法时,如果没有使用Hash Tags,这些键可能会被分配到不同的槽中。如果这些槽位于不同的Redis节点上,那么multiGet将无法正确返回所有键的值。

2 Pipeline操作受限
在Redis集群中,pipeline操作不能跨越多个槽进行。如果通过pipeline发送的命令涉及多个不同的槽(即键被分配到了不同的节点),则可能会导致部分命令失败或者整个pipeline操作效率降低。

3 事务支持有限
Redis集群不支持原生的MULTI/EXEC事务模型,特别是当事务涉及多个不同的槽时。因此,尝试在集群模式下使用事务来管理多个键的操作可能会失败。


代码示例
1 application.yml

spring:
  application:
    name: zha7zha8

  data:
    redis:
      cluster:
        nodes:
          - 192.168.1.100:6381
          - 192.168.1.100:6382
          - 192.168.1.100:6383
          - 192.168.1.100:6384
          - 192.168.1.100:6385
          - 192.168.1.100:6386

2 测试类,注意:{user}: 这样的标识,名称无所谓,只要都加了相同的标识,写了些反例和正例

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.util.Arrays;
import java.util.List;

@SpringBootTest(classes = Zha7zha8Application.class)
public class RedisClusterTest {

    @Autowired
    private StringRedisTemplate redisTemplate;
    
    /**
     * 反例:未使用 Hash Tags,可能导致 Key 分配到不同的 Slot
     * 注意:由于 'user:dfss' 和 'user:00' 没有共同的 Hash Tag,
     *      这些键可能会被分配到不同的槽中,这在某些情况下(如 multiGet)可能会导致问题。
     *      例如,在Redis集群环境中,如果这些键位于不同的节点上,那么 multiGet 可能无法正确返回所有键的值。
     */
    @Test
    void testWithoutHashTags() {
        // 定义两个没有使用 Hash Tags 的键
        String key1 = "user:dfss";
        String key2 = "user:11";

        // 设置键值对
        redisTemplate.opsForValue().set(key1, "Alice");
        redisTemplate.opsForValue().set(key2, "Bob");

        // 尝试从 Redis 中获取这两个值
        List<String> values = redisTemplate.opsForValue().multiGet(Arrays.asList(key1, key2));
        System.out.println("从 Redis 中获取的值 (无 Hash Tags): " + values);
    }
    
    /**
     * 正例:使用 Hash Tags 确保 'user:1' 和 'user:2' 在同一个 Slot
     *      使用相同的 Hash Tag '{user}' 确保了 'user:1' 和 'user:2' 被分配到同一个槽中,
     *      这样可以保证 multiGet 操作能够成功返回所有相关的键值。
     */
    @Test
    void testWithHashTags() {
        // 定义两个使用相同 Hash Tags 的键
        String key1 = "{user}:1";
        String key2 = "{user}:2";

        // 设置键值对
        redisTemplate.opsForValue().set(key1, "Alice");
        redisTemplate.opsForValue().set(key2, "Bob");

        // 从 Redis 中获取这两个值
        List<String> values = redisTemplate.opsForValue().multiGet(Arrays.asList(key1, key2));
        System.out.println("从 Redis 中获取的值 (有 Hash Tags): " + values);
    }
    
    /**
     * Pipeline 操作反例
     * 注意:由于 'user:1' 和 'user:2' 没有共同的 Hash Tag,
     *      这些键可能会被分配到不同的槽中。虽然 pipeline 操作会尝试执行所有的命令,
     *      但如果涉及到跨多个节点的操作,可能会导致部分命令失败或效率降低。
     */
    @Test
    void pipelineOperationWithoutHashTags() {
        // 定义两个没有使用 Hash Tags 的键
        String key1 = "user:1";
        String key2 = "user:2";

        // Pipeline 操作
        List<Object> results = redisTemplate.executePipelined((RedisCallback<String>) connection -> {
            connection.set(key1.getBytes(), "Alice".getBytes());
            connection.set(key2.getBytes(), "Bob".getBytes());
            return null;
        });
        System.out.println("Pipeline 操作的结果 (无 Hash Tags): " + results);
    }
    
    /**
     * Pipeline 操作正例
     * 使用相同的 Hash Tag '{user}' 确保了 'user:1' 和 'user:2' 被分配到同一个槽中,
     * 这使得 pipeline 操作能够在同一节点上顺利执行,提高了操作的一致性和效率。
     */
    @Test
    void pipelineOperationWithHashTags() {
        // 定义两个使用相同 Hash Tags 的键
        String key1 = "{user}:1";
        String key2 = "{user}:2";

        // Pipeline 操作
        List<Object> results = redisTemplate.executePipelined((RedisCallback<String>) connection -> {
            connection.set(key1.getBytes(), "Alice".getBytes());
            connection.set(key2.getBytes(), "Bob".getBytes());
            return null;
        });
        System.out.println("Pipeline 操作的结果 (有 Hash Tags): " + results);
    }
}

相关文章:

  • 如何写一个网关的系统
  • 网络安全漏洞的种类分为哪些?
  • chrome.webRequest API 和 Performance API
  • Java多线程与高并发专题——ThreadLocal 适合用在哪些实际生产的场景中?
  • JavaScript 导出功能全解析:从数据到文件
  • 算法刷题记录——专题目录汇总
  • 【css酷炫效果】纯CSS实现球形阴影效果
  • 【Linux笔记】动态库与静态库的制作
  • windows安装配置FFmpeg教程
  • 数字化工厂智能制造精益化管理智能工厂数据分析大数据解决方案精品PPT格式
  • Kafka-ConsumerRecord
  • SpringBoot前后端不分离,前端如何解析后端返回html所携带的参数
  • linux系统正常,浏览器却无法访问网页
  • 【PyTorch】y = x.flatten(2).permute(0, 2, 1)
  • GGUF量化模型技术解析与DeepSeek-R1-Distill-Llama-8B选型指南
  • VMware-workstation-17.6.3安装教程
  • 涨薪技术|Kubernetes(k8s)之认识Pod
  • 通义千问模型微调——swift框架
  • Python第六章02:列表操作——下标索引
  • JVM-JAVA编译到执行全过程
  • 平度市网站建设/腾讯网网站网址
  • 淄企业网站建设公司/素材网
  • 做网站用的到java吗/网页制作公司
  • 中文软件开发平台/小红书seo排名
  • 在线网站建设收费/seo优化软件购买
  • 上海市建设协会考试网站/推广链接点击器网页