redis:切片
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分片宕机,那么整个分片不能使用;
- SpringBoot-Mybatis_Plus学习记录之公共字段自动填充
- Windows 安装配置 JIRA
- 变化驱动:正交设计
- mybatis xml mapper 文件中 if-else 写法
- 深入探索Scala的Option
- 在Clion的IDE中指定命令行参数
- CentOS6 安装并破解Jira 7
- Martin Odersky访谈录所思
- 解决Boost库链接出错问题
- 引入Option优雅地保证健壮性
- java正则校验,密码必须由字母和数字组成
- Spring Boot集成JasperReports生成PDF文档
- Redux框架reducer对状态的处理
- 使用Spring Cloud Security OAuth2搭建授权服务
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 内网渗透 | 内网中的信息收集
- 通过命令下载执行恶意代码的几种姿势
- CS如何配置通过CDN上线
- Height transition
- 【DB笔试面试861】在Oracle中,有哪些常见组件?
- 【DB笔试面试862】在Oracle中,如何安装DBMS_NETWORK_ACL_ADMIN包?
- 【DB宝19】在Docker中使用MySQL高可用之MHA
- 【DB笔试面试863】在Oracle中,如何让Oracle DB、监听和oem开机启动?
- 【DB笔试面试864】在Oracle中,响应文件在什么位置?
- 设计模式几大原则
- Thrift使用教程(Java版本)
- C语言实现三子棋
- C语言操作符
- 一级指针、二级指针、指针和数组、指针数组总结
- C++入门知识(一)