Redis分片

BolunWu

1.Redis分片机制

1.1为什么需要分片机制

如果需要存储海量的内存数据,如果只使用一台redis,无法保证redis工作效率.大量的时间都浪费在了寻址当中.所以需要一种机制,来满足这种需求.

采用分片机制实现:

image

1.2Redis分片搭建

1.2.1搭建注意事项

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

1.2.2分片实现

image

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

image

启动3台redis服务器

image

校验服务器是否正常运行

1.2.3关于分片的注意事项

1.问题描述
当启动多台redis服务器之后,多台redis暂时没有必然的联系,各自都是独立的实体,可以数据的存储.
2.如果将分片通过程序的方式进行操作,要把3台redis当做一个整体,所以与上述的操作完全不同,不会出现一个key同时保存多个redis的现象.

image

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) 中存在的动态伸缩等问题 。

image

1.4.2特性1-平衡性

概念:平衡性是指hash的结果应该平均分配各个节点,这样从算法上解决了负载均衡问题.(大致平分)
问题描述:由于节点都是通过hash方式进行算计,所以可能出现如图中的现象,导致负载严重不平衡.

image

解决方法:引入虚拟节点

image

1.4.3特性2-单调性

特点:单调性是指在新增或者删除节点时,不影响系统正常运行.

image

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注入项

image~~~~

阅读 140
4 声望
3 粉丝
0 条评论
4 声望
3 粉丝
宣传栏