关于redis:Redis分片机制

为什么须要分片机制

如果须要存储海量的内存数据,如果只应用一台redis,则无奈保障redis工作的效率。大量工夫都节约到了寻址中,所以须要一种机制可能满足该要求。
采纳分片机制实现:

Redis分片搭建

搭建注意事项

Redis服务的启动须要依赖于redis.conf的配置文件,如果须要筹备多台redis则须要多个redis.conf的配置。
筹备端口号:
1.6379
2.6380
3.6381

分片实现


批改端口号:将各自的端口号进行批改
1.进入各自的redis.conf文件中
2.批改各自的端口号

启动redis服务器

校验服务器是否失常运行

对于分片的注意事项

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

分片入门案例

/**
     * 测试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"));
    }

一致性hash算法

个别的hash是8为16禁止数。0—9 A–F 组合总共为2^32。
如果对雷同的数据进行hash运算,后果必然雷同。
一个数据1M和数据1G的hash运算的速度统一。

一致性hash算法介绍

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

个性

平衡性

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

解决办法:引入虚构节点

枯燥性

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

分散性

分散性是指数据应该扩散地寄存在分布式集群中的各个节点(节点本人能够有备份),不用每个节点都存储所有的数据 。

SpringBoot整合Redis分片

编辑配置文件

# 配置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

编辑配置类

@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);
    }
   }

批改AOP注入项

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理