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分片宕机,那么整个分片不能使用;