redis

分片

单台redis的管理内存能力是有限的,如果保存有海量的缓存数据,则一台redis无法操作

那么就要对redis进行扩容,

redis分片主要目的实现redis内存扩容,对用户而言使用的就是一大台redis,但是内部每个redis中保存的数据都是不同的

分片原理

ShardedJedis是通过一致性哈希来实现分布式缓存的,通过一定的策略把不同的key分配到不同的redis server ,达到横向扩展的目的的

hash一致性原理

1、0到2^32-1数字组成一个hash圆环;

2、根据redis的Ip或主机名计算一个hash值,然后对应到圆环位置;

3、然后根据key计算一个hash值,放在对应的圆环上,根据key位置顺时针离圆环最近的redis服务器存取;

4、为了均衡性,通常会虚拟节点服务器;

提问 有12个球如何均匀的放在3个桶里

答:先对球从0开始进行编号0,1,2…11,再对桶进行编号0,1,2

每个球的编号对三取余,得出0,1,2…0,1,2

一致性原理也是这样,一致性算法对2^32-1进行取模

0到232-1组成了一个hash圆环,正上方是0,顺时针依次到232-1

由这2^32个点组成的圆环,被称为hash环

redis的hash原理

采用服务器的ip或者主机名来进行hash,这样每台机器就能确定在hash环上的位置

那么数据如何定位到相关的redis服务器呢?

将数据key使用相同的方法计算出hash值,并确定在hash环上的位置

从此位置顺时针“行走”,遇到的第一台服务器就是该定位的服务器

分片的准备工作
准备多台redis

在原redis根目录下创建shards文件夹

mkdir shards

将redis.conf配置文件拷贝几份到shards文件夹下并重命名

cp redis.conf shards/redis-6379.conf

cp redis.conf shards/redis-6380.conf

cp redis.conf shards/redis-6381.conf

修改配置文件中的端口为配置文件名字对应的端口

当然你可以自定义端口,但是要注意端口别被占用

开放指定端口
firewall-cmd --zone=public --add-port=端口号/tcp --permanent

启动多台redis

redis-server redis-6379.conf & redis-server redis-6380.conf & redis-server redis-6381.conf

查看是否启动成功

ps -ef|grep redis

springboot整合redis分片

在resources下新建redis.properties配置文件

redis.nodes=39.101.165.86:6379,39.101.165.86:6380,39.101.165.86:6381

新建redisConfig配置类

@PropertySource(value = "classpath:/properties/redis.properties")
@Configuration
public class RedisConfig {
    @Value("${redis.nodes}")
    private String nodes;

    @Bean
    public ShardedJedis shardedJedis(){
        List<JedisShardInfo> shards = new ArrayList<>();
        //进行切片得到每个redis的连接信息
        String[] strNodes = nodes.split(",");
        for(String strNode:strNodes){
            String[] node = strNode.split(":");
            String host = node[0];
            int port = Integer.parseInt(node[1]);
            //存入shards
            shards.add(new JedisShardInfo(host,port));
        }
        return  new ShardedJedis(shards);
    }

}

至此就可以使用redis的切片功能了

总结

1.分片主要的作用实现redis扩容;
2.修改配置文件(修改端口号);
3.通过哈希一致性原理,把key分配到每个redis中;
4.如果其中一个redis分片宕机,那么整个分片不能使用;