redis集群主从之读写分离
redis集群主从之读写分离
1、集群部署
这里就不详细赘述如何部署主从集群了,一般都是使用slaveOf配置来进行初始化配置。
2、与springboot集成实现读写分离
通过注解实现调用层读写分离,然后根据取模运算来确定访问哪个读库
- 在springcloud配置中心增加redis配置:
配置读写节点
spring:
redis:
database: 0
pool:
max-active: 8
max-idle: 9
max-wait: -1
min-idle: 0
redis-master:
host: 192.168.1.1
prot: 6379
password:
testOnBorrow: false
redis-slave1:
host: 192.168.1.2
prot: 6379
password:
testOnBorrow: false
redis-slave2:
host: 192.168.1.3
prot: 6379
password:
testOnBorrow: false
- 增加自动配置类
如下:
@Configuration
public class RedisConfiguration {
@Value("${spring.redis.pool.max-idle}")
private int maxIdle;
@Value("${spring.redis.pool.max-active}")
private int maxTotal;
@Value("${spring.redis.database}")
private int index;
@Value("${spring.redis.pool.max-wait}")
private long maxWaitMillis;
@Bean(name = "redisMasterTemplate")
public StringRedisTemplate redisMasterTemplate(@Value("${spring.redis-master.host}") String hostName,
@Value("${spring.redis-master.port}") int port, @Value("${spring.redis-master.password}") String password, @Value("${spring.redis-master.testOnBorrow}") boolean testOnBorrow) {
StringRedisTemplate temple = new StringRedisTemplate();
temple.setConnectionFactory(
connectionFactory(hostName, port, password, maxIdle, maxTotal, index, maxWaitMillis, testOnBorrow));
return temple;
}
@Bean(name = "redisSlave1Template")
public StringRedisTemplate redisSlave1Template(@Value("${spring.redis-slave1.host}") String hostName,
@Value("${spring.redis-slave1.port}") int port, @Value("${spring.redis-slave1.password}") String password, @Value("${spring.redis-slave1.testOnBorrow}") boolean testOnBorrow) {
StringRedisTemplate temple = new StringRedisTemplate();
temple.setConnectionFactory(
connectionFactory(hostName, port, password, maxIdle, maxTotal, index, maxWaitMillis, testOnBorrow));
return temple;
}
@Bean(name = "redisSlave1Template")
public List<StringRedisTemplate> redisSlaveTemplate() {
List<StringRedisTemplate> list = new ArrayList<StringRedisTemplate>();
list.add(redisSlave1Template());
list.add(redisSlave2Template());
return list;
}
@Bean(name = "redisSlave2Template")
public StringRedisTemplate redisSlave1Template(@Value("${spring.redis-slave2.host}") String hostName,
@Value("${spring.redis-slave2.port}") int port, @Value("${spring.redis-slave2.password}") String password, @Value("${spring.redis-slave2.testOnBorrow}") boolean testOnBorrow) {
StringRedisTemplate temple = new StringRedisTemplate();
temple.setConnectionFactory(
connectionFactory(hostName, port, password, maxIdle, maxTotal, index, maxWaitMillis, testOnBorrow));
return temple;
}
public RedisConnectionFactory connectionFactory(String hostName, int port, String password, int maxIdle,
int maxTotal, int index, long maxWaitMillis, boolean testOnBorrow) {
JedisConnectionFactory jedis = new JedisConnectionFactory();
jedis.setHostName(hostName);
jedis.setPort(port);
if (StringUtils.isNotEmpty(password)) {
jedis.setPassword(password);
}
if (index != 0) {
jedis.setDatabase(index);
}
jedis.setPoolConfig(poolCofig(maxIdle, maxTotal, maxWaitMillis, testOnBorrow));
// 初始化连接pool
jedis.afterPropertiesSet();
RedisConnectionFactory factory = jedis;
return factory;
}
public JedisPoolConfig poolCofig(int maxIdle, int maxTotal, long maxWaitMillis, boolean testOnBorrow) {
JedisPoolConfig poolCofig = new JedisPoolConfig();
poolCofig.setMaxIdle(maxIdle);
poolCofig.setMaxTotal(maxTotal);
poolCofig.setMaxWaitMillis(maxWaitMillis);
poolCofig.setTestOnBorrow(testOnBorrow);
return poolCofig;
}
}
封装调用接口
@Component
public class StringRedisTemplateProxy {
@Autowired
private StringRedisTemplate redisMasterTemplate;
@Autowired
private List<StringRedisTemplate> redisSlaveList;
private int index=0;
public void setValue(String key,String value) {
redisMasterTemplate.opsForValue().set(key, value);
}
public String getValue(String key) {
index++;
return redisSlaveList.get(index).opsForValue().get(key);
}
}
这里缺点就是无法做到故障转移,这里就需要用到虚拟ip和脚本定时监控。
1、使用一个虚拟ip指向redis master
2、如果从节点故障,可以采用重试机制来进行一次调用读节点,如果是主节点故障,则需要通过脚本自动将一个从节点切换成主节点,并将虚拟IP绑定在该节点上。
redis集群主从之读写分离的更多相关文章
- (转)基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案
转载自:http://warm-breeze.iteye.com/blog/2020413 本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedi ...
- 基于Redis Sentinel的Redis集群(主从Sharding)高可用方案(转)
本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在 ...
- 基于Redis Sentinel的Redis集群(主从&Sharding)高可用方案
本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在 ...
- 查看Redis集群主从对应关系工具
工具的作用: 1)比"cluster nodes"更为直观的显示结果 2)指出落在同一个IP上的master 3)指出落在同一个IP上的master和slave对 运行效果图: 源 ...
- Redis Sentinel的Redis集群(主从&Sharding)高可用方案
在不使用redis3.0之后版本的情况下,对于redis服务端一般是采用Sentinel哨兵模式,也就是一主多备的方式. 这里,先抛出三个问题, 问题1:单节点宕机数据丢失?问题2:多节点(节点间没有 ...
- 基于Keepalived高可用集群的MariaDB读写分离机制实现
一 MariaDB读写分离机制 在实现读写分离机制之前先理解一下三种主从复制方式:1.异步复制:MariaDB默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库 ...
- linux上使用amoeba实现MySql集群,以及读写分离,主从复制
一.由于是MySql集群,所以就不可能只有一个MySql,需要多个MySql,具体安装步骤,可以参考http://www.cnblogs.com/ywzq/p/4882140.html这个地址进行安装 ...
- redis集群主从集群搭建、sentinel(哨兵集群)配置以及Jedis 哨兵模式简要配置
前端时间项目上为了提高平台性能,为应用添加了redis缓存,为了提高服务的可靠性,redis部署了高可用的主从缓存,主从切换使用的redis自带的sentinel集群.现在权作记录.
- redis集群主从中断,报io过高 不错
问题原因:1.由于这个集群redis操作非常频繁,1分钟操作数据达到1-2G,所有自动aof非常频繁,主从复制打包rdb也非常频繁,之前配置已经无法满足要求报异常如下6943:M 19 Jul 20: ...
- Redis集群-主从模式
1.架构设计 集群在单台主机上模拟搭建6个节点(3主3从的集群): 2.配置 创建与端口相同的文件夹存储Redis配置文件和持久化文件. 目录如下: 每个节点配置文件如下: 节点1: bind 192 ...
随机推荐
- Windows无法调节亮度
原因1:驱动问题 解决方式: 安装360驱动大师,一键安装. 也可以使用其他软件:如驱动精灵. 推荐使用电脑品牌本身的驱动软件:如联想:联想驱动管理 原因2:设备管理问题 解决方式: 计算机 -> ...
- KEIL5 编译生成 hex、bin文件
--- title: file_name date: 2020-05-31 10:27:10 categories: tags: - stm32 - keil - config --- KEIL 工程 ...
- FLUTTER 中 Isolate 的一个例子.
isolate 起因 最近看了一点isolate的东西, 自己写了一个例子. 普通的的 consummer-producer例子是只有前后两端的,实际上,会把前后两端再进行包装. 我这里这个例子,是把 ...
- AT_joisc2019_j 题解
先考虑这个式子: \[\sum_{j=1}^{M} |C_{k_{j}} - C_{k_{j+1}}| \] 一定是在 \(C\) 有序时取到,具体证明很简单各位读者自己证明. 那么现在式子变成: \ ...
- Mybatis 中 foreach 的四种用法
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. ...
- computed 和 watch 的区别和运用的场景?
computed: 是计算属性,依赖其它属性值,并且 computed 的值有缓存,只有它依赖的属性值发生改变,下一次获取 computed 的值时才会重新计算 computed 的值: watch: ...
- eclipse注释取消注释
方法一:使用Ctrl+/快捷键 1 第1步:在Eclipse中拖动鼠标,选中需要注释的代码,通常为连续多行代码. 2 第2步:按住Ctrl+/快捷键,如图所示. 3 第3步:会发现所选代码被&qu ...
- 英特尔开源新等宽字体Intel One Mono,称可保护开发者视力
英特尔开源了一款面向开发者的新等宽字体 "Intel One Mono ",这是一种富有表现力的等宽字体系列,集清晰度.易读性和开发者视力保护于一体. Intel One Mono ...
- 引入样式在Element UI (Vue 2)和Element Plus (Vue 3)中的不同
引入样式 Element UI (Vue 2): import 'element-ui/lib/theme-chalk/index.css'; Element Plus (Vue 3): im ...
- [oeasy]python0079_控制序列_光标位置设置_ESC_逃逸字符_CSI
光标位置 回忆上次内容 上次我们研究的比较杂 类型转化 进制转化 捕获异常 版本控制 生成帮助文档 变量的常用类型 变量的生命周期控制 数据类型主要研究了两个 字符串 str 整型数字 int ...