关于java:Redis分片

14次阅读

共计 1997 个字符,预计需要花费 5 分钟才能阅读完成。

1.Redis 分片机制

1.1 为什么须要分片机制

如果须要存储海量的内存数据, 如果只应用一台 redis, 无奈保障 redis 工作效率. 大量的工夫都节约在了寻址当中. 所以须要一种机制, 来满足这种需要.
采纳分片机制实现:

1.2Redis 分片搭建

1.2.1 搭建注意事项

Redis 服务启动须要依赖 redis.conf 的配置文件. 如果须要筹备 3 台 redis 则须要筹备 3 个 redis.conf 的配置.
筹备端口号
6379
6380
6381

1.2.2 分片实现

批改端口号: 间各自的端口号进行批改

启动 3 台 redis 服务器

校验服务器是否失常运行

1.2.3 对于分片的注意事项

1. 问题形容
当启动多台 redis 服务器之后, 多台 redis 临时没有必然的分割, 各自都是独立的实体, 能够数据的存储.
2. 如果将分片通过程序的形式进行操作, 要把 3 台 redis 当做一个整体, 所以与上述的操作齐全不同, 不会呈现一个 key 同时保留多个 redis 的景象.

1.3 分片入门案例

 /**
     * 测试 Redis 分片机制
     * 思考: shards 如何确定应该存储到哪台 redis 中呢???
     */
    @Test
    public void testShards(){List<JedisShardInfo> shards = new ArrayList<>();
        shards.add(new JedisShardInfo("192.168.126.129",6379));
        shards.add(new JedisShardInfo("192.168.126.129",6380));
        shards.add(new JedisShardInfo("192.168.126.129",6381));
        // 筹备分片对象
        ShardedJedis shardedJedis = new ShardedJedis(shards);
        shardedJedis.set("shards","redis 分片测试");
        System.out.println(shardedJedis.get("shards"));
    }

1.4 一致性 hash 算法

1.4.1 一致性 hash 算法介绍

一致性 hash 算法在 1997 年由麻省理工学院提出, 是一种非凡的算法, 目标是解决分布式缓存问题. 在移除或者增加一个服务器时, 可能尽可能小地扭转已存在的服务申请与解决申请服务器之间的映射关系。一致性哈希解决了简略哈希算法在分布式哈希表 (Distributed Hash Table,DHT) 中存在的动静伸缩等问题。

1.4.2 个性 1 - 平衡性

概念: 平衡性是指 hash 的后果应该平均分配各个节点, 这样从算法上解决了负载平衡问题.(大抵平分)
问题形容: 因为节点都是通过 hash 形式进行合计, 所以可能呈现如图中的景象, 导致负载重大不均衡.

解决办法: 引入虚构节点

1.4.3 个性 2 - 枯燥性

特点: 枯燥性是指在新增或者删除节点时, 不影响零碎失常运行.

1.4.4 个性 3 - 分散性

谚语: 鸡蛋不要放到一个篮里.
分散性是指数据应该扩散地寄存在分布式集群中的各个节点 (节点本人能够有备份), 不用每个节点都存储的数据.

1.5SpringBoot 整合 Redis 分片

1.5.1 编辑配置文件

# 配置 redis 单台服务器
redis.host=192.168.126.129
redis.port=6379

# 配置 redis 分片机制
redis.nodes=192.168.126.129:6379,192.168.126.129:6380,192.168.126.129:6381

1.5.2 编辑配置类

@Configuration
@PropertySource("classpath:/properties/redis.properties")
public class JedisConfig {@Value("${redis.nodes}")
    private String nodes;  //node,node,node.....

    // 配置 redis 分片机制
    @Bean
    public ShardedJedis shardedJedis(){nodes = nodes.trim();   // 去除两边多余的空格
        List<JedisShardInfo> shards = new ArrayList<>();
        String[] nodeArray = nodes.split(",");
        for (String strNode : nodeArray){   //strNode = host:port
            String host = strNode.split(":")[0];
            int port = Integer.parseInt(strNode.split(":")[1]);
            JedisShardInfo info = new JedisShardInfo(host, port);
            shards.add(info);
        }
        return new ShardedJedis(shards);
    }
   }

1.5.3 批改 AOP 注入项

~~~~

正文完
 0