关于使用RedisTemplate在主从架构下使用Lettuce的情况下如何实现读写分离
话不多说,我们知道RedisTemplate在SpringBoot 2.x以后使用了redis的高级客户端Lettuce进行了开发,题主在测试的过程中发现,即使搭建了哨兵的主从架构,使用RedisTemplate读写命令的时候无论是读还是写的命令都会在主节点进行。而从节点只是同步数据而已
如果我们在使用RedisTemplate的时候想用到读写分离的功能的话,首先题主在网上找了很多文章都没有讲到这个点(可能大家在生产环境都是用的集群多主架构吧),通过debug源码,发现RedisTemplate提供了一个可以设置的连接方式,可以在读的时候将请求的打到从服务器,写的时候打到主服务器。于是通过扩展的方式实现了可以将读写请求分离的效果(不过在测试的过程中发现只会选择一台从节点进行读请求,这点确实不够强,还以为能够根据多个从节点进行负载均衡)
核心代码如下:
/*** @className LuttuceReadFromConfig* @description TOO* @Author cfx* @DATE 2020/3/9 9:23* @VERSION 1.0**/
@Component
public class LuttuceReadFromConfig implements LettuceClientConfigurationBuilderCustomizer {@Overridepublic void customize(LettuceClientConfiguration.LettuceClientConfigurationBuilder clientConfigurationBuilder) {//设置读优先读从机clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);}
}
实现的效果如下所示
- 主节点可接收写请求
- 从节点接收读请求。
感兴趣的朋友可以看看Lettuce的这几个选项,是个枚举对象。
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package io.lettuce.core;import io.lettuce.core.ReadFromImpl.ReadFromAnyNode;
import io.lettuce.core.ReadFromImpl.ReadFromMaster;
import io.lettuce.core.ReadFromImpl.ReadFromMasterPreferred;
import io.lettuce.core.ReadFromImpl.ReadFromNearest;
import io.lettuce.core.ReadFromImpl.ReadFromReplica;
import io.lettuce.core.ReadFromImpl.ReadFromReplicaPreferred;
import io.lettuce.core.models.role.RedisNodeDescription;
import java.util.List;public abstract class ReadFrom {public static final ReadFrom MASTER = new ReadFromMaster();public static final ReadFrom MASTER_PREFERRED = new ReadFromMasterPreferred();public static final ReadFrom REPLICA_PREFERRED = new ReadFromReplicaPreferred();/** @deprecated */@Deprecatedpublic static final ReadFrom SLAVE_PREFERRED;public static final ReadFrom REPLICA;/** @deprecated */@Deprecatedpublic static final ReadFrom SLAVE;public static final ReadFrom NEAREST;public static final ReadFrom ANY;public ReadFrom() {}public abstract List<RedisNodeDescription> select(ReadFrom.Nodes var1);protected boolean isOrderSensitive() {return false;}public static ReadFrom valueOf(String name) {if (LettuceStrings.isEmpty(name)) {throw new IllegalArgumentException("Name must not be empty");} else if (name.equalsIgnoreCase("master")) {return MASTER;} else if (name.equalsIgnoreCase("masterPreferred")) {return MASTER_PREFERRED;} else if (!name.equalsIgnoreCase("slave") && !name.equalsIgnoreCase("replica")) {if (!name.equalsIgnoreCase("slavePreferred") && !name.equalsIgnoreCase("replicaPreferred")) {if (name.equalsIgnoreCase("nearest")) {return NEAREST;} else if (name.equalsIgnoreCase("any")) {return ANY;} else {throw new IllegalArgumentException("ReadFrom " + name + " not supported");}} else {return REPLICA_PREFERRED;}} else {return REPLICA;}}static {SLAVE_PREFERRED = REPLICA_PREFERRED;REPLICA = new ReadFromReplica();SLAVE = REPLICA;NEAREST = new ReadFromNearest();ANY = new ReadFromAnyNode();}public interface Nodes extends Iterable<RedisNodeDescription> {List<RedisNodeDescription> getNodes();}
}
官方文档对这块的描述地址是
https://lettuce.io/core/6.1.4.RELEASE/api/index.html
关于使用RedisTemplate在主从架构下使用Lettuce的情况下如何实现读写分离相关推荐
- c#中什么情况下用(int)什么情况下用Convert.ToInt32
1.c#中什么情况下用(int)什么情况下用Convert.ToInt32 ? 比如说有一个string型的3 ,要给它转换成int型的是用(int)3 ,还是用Convert.ToInt32(3 ...
- 类的组合在什么情况下使用_什么情况下选择使用圆锥滚子轴承?(原创轴承外贸写作素材)...
什么情况下选择使用圆锥滚子轴承?(轴承外贸写作素材) When should you choose to use tapered roller bearings? (Bearing foreign t ...
- Calendar类的get () 与set()在获取月份情况下与设置月份情况下不同
public static void getAllDayofMonth(String date) { /*** 以下是月份三种情况测试* * 在没有设置月份的情况下,获取当前月份的测试?: 当前月份为 ...
- linux cp进行目录拷贝,目的路径下存在同名目录情况下出现的问题
cp -rf abc /home/oracle/ /home/oracle/下存在目录abc,则源目录abc及其内部文件被拷贝到了/home/oracle/abc下,即/home/oracle/a ...
- WORD研究:“允许标点溢出边界”在稿纸下有用,其他情况下很不明显
做了一个文档,最后一个标点越界了.这自然是错误的.有同事提示,右键.段落.中文版式,有一个"允许标点溢出边界".如图: 吾一时就奇怪了,这个功能有什么用?于是搜索了一番,得到一些零 ...
- css 命名 有的加# ,有的加点 ,有的没加。请问下都在什么情况下用的?
[nav{}] 这样的样式是给特定的标签直接定义样式时使用的,这个样式名称是跟标签是相对应的,比如我要给<p></p>这个标签设置样式,那我就可以直接写:p{样式}就可以,但是 ...
- mybatis的parameterType属性那些情况下要写 哪些情况下不用写
不写: 如果 是基本类型,或者是java自身的引用类型,在mybatis 运行时,会自动的进行匹配,可以省略parameterType属性. 写: 如果是你自己声明的一个类型,因为可能在引入的jar包 ...
- 一文讲清,MySQL主从架构
MySQL在生成环境中,如果是单机版的部署方式,就会有很大的可用性问题,MySQL提供了一套主从复制的架构,以提高其可用性. MySQL主从复制架构,就是部署两台机器,一台机器上部署的MySQL是ma ...
- 在表空间有足够free space的情况下出现ORA-1652
版本10.2.0.5之前存在这样的问题,当打开recyclebin回收站功能的情况下, Tablespace 上有足够的Free Space空闲空间,但是因为这些Free Space属于回收站中的对象 ...
- python中单下划线_foo与双下划线_Python中单下划线和双下划线
什么是 Python? Python 之父 Guido van Rossum 说:Python是一种高级程序语言,其核心设计哲学是代码可读性和语法,能够让程序员用很少的代码来表达自己的想法. 对于我来 ...
最新文章
- 全球首款AI的操作系统来了!100%国产,像用Windows一样简单
- 网页分享到微信、微博、QQ空间、百度贴吧等
- vue中通过数据双向绑定给video标签的src赋值,只有第一次有效,怎么解决?
- 实现mysql按月统计的教程
- 手持终端机USB无法同步连接是什么意思?
- Mac 解决brew一直卡在Updating Homebrew
- angular5.0封装underscore常用pipe并发布到npm全套流程
- spring boot + vue + element-ui全栈开发入门
- 各种封装——封装getClass
- 大四课程设计之基于RFID技术的考勤管理系统(二)读取COM口数据
- linux 下把整数转化为字符串
- mysql 岩机_mysql数据库基本应用
- 通信维修专用电源_万可PRO 2电源 | 开拓性通信功能,自信迈入数字化时代
- 事实证明:市场没有换来任何技术
- SpringBoot蓝天幼儿园管理系统
- 用java做一个简易的五子棋
- yaml 变量引用_yaml语法
- Python爬虫实战之三:requests-百度/360搜索关键词提交
- 安装arcgis api for python步骤、以及注意事项
- win7计算机打开显卡设置在哪,[win7显卡设置在哪里]WIN7显卡优化设置在哪