话不多说,我们知道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的情况下如何实现读写分离相关推荐

  1. c#中什么情况下用(int)什么情况下用Convert.ToInt32

    1.c#中什么情况下用(int)什么情况下用Convert.ToInt32   ? 比如说有一个string型的3 ,要给它转换成int型的是用(int)3 ,还是用Convert.ToInt32(3 ...

  2. 类的组合在什么情况下使用_什么情况下选择使用圆锥滚子轴承?(原创轴承外贸写作素材)...

    什么情况下选择使用圆锥滚子轴承?(轴承外贸写作素材) When should you choose to use tapered roller bearings? (Bearing foreign t ...

  3. Calendar类的get () 与set()在获取月份情况下与设置月份情况下不同

    public static void getAllDayofMonth(String date) { /*** 以下是月份三种情况测试* * 在没有设置月份的情况下,获取当前月份的测试?: 当前月份为 ...

  4. linux cp进行目录拷贝,目的路径下存在同名目录情况下出现的问题

    cp -rf  abc  /home/oracle/ /home/oracle/下存在目录abc,则源目录abc及其内部文件被拷贝到了/home/oracle/abc下,即/home/oracle/a ...

  5. WORD研究:“允许标点溢出边界”在稿纸下有用,其他情况下很不明显

    做了一个文档,最后一个标点越界了.这自然是错误的.有同事提示,右键.段落.中文版式,有一个"允许标点溢出边界".如图: 吾一时就奇怪了,这个功能有什么用?于是搜索了一番,得到一些零 ...

  6. css 命名 有的加# ,有的加点 ,有的没加。请问下都在什么情况下用的?

    [nav{}] 这样的样式是给特定的标签直接定义样式时使用的,这个样式名称是跟标签是相对应的,比如我要给<p></p>这个标签设置样式,那我就可以直接写:p{样式}就可以,但是 ...

  7. mybatis的parameterType属性那些情况下要写 哪些情况下不用写

    不写: 如果 是基本类型,或者是java自身的引用类型,在mybatis 运行时,会自动的进行匹配,可以省略parameterType属性. 写: 如果是你自己声明的一个类型,因为可能在引入的jar包 ...

  8. 一文讲清,MySQL主从架构

    MySQL在生成环境中,如果是单机版的部署方式,就会有很大的可用性问题,MySQL提供了一套主从复制的架构,以提高其可用性. MySQL主从复制架构,就是部署两台机器,一台机器上部署的MySQL是ma ...

  9. 在表空间有足够free space的情况下出现ORA-1652

    版本10.2.0.5之前存在这样的问题,当打开recyclebin回收站功能的情况下, Tablespace 上有足够的Free Space空闲空间,但是因为这些Free Space属于回收站中的对象 ...

  10. python中单下划线_foo与双下划线_Python中单下划线和双下划线

    什么是 Python? Python 之父 Guido van Rossum 说:Python是一种高级程序语言,其核心设计哲学是代码可读性和语法,能够让程序员用很少的代码来表达自己的想法. 对于我来 ...

最新文章

  1. 全球首款AI的操作系统来了!100%国产,像用Windows一样简单
  2. 网页分享到微信、微博、QQ空间、百度贴吧等
  3. vue中通过数据双向绑定给video标签的src赋值,只有第一次有效,怎么解决?
  4. 实现mysql按月统计的教程
  5. 手持终端机USB无法同步连接是什么意思?
  6. Mac 解决brew一直卡在Updating Homebrew
  7. angular5.0封装underscore常用pipe并发布到npm全套流程
  8. spring boot + vue + element-ui全栈开发入门
  9. 各种封装——封装getClass
  10. 大四课程设计之基于RFID技术的考勤管理系统(二)读取COM口数据
  11. linux 下把整数转化为字符串
  12. mysql 岩机_mysql数据库基本应用
  13. 通信维修专用电源_万可PRO 2电源 | 开拓性通信功能,自信迈入数字化时代
  14. 事实证明:市场没有换来任何技术
  15. SpringBoot蓝天幼儿园管理系统
  16. 用java做一个简易的五子棋
  17. yaml 变量引用_yaml语法
  18. Python爬虫实战之三:requests-百度/360搜索关键词提交
  19. 安装arcgis api for python步骤、以及注意事项
  20. win7计算机打开显卡设置在哪,[win7显卡设置在哪里]WIN7显卡优化设置在哪

热门文章

  1. easyExcel导出下拉选择框,多sheet数据excle导入导出
  2. Unity3D高级编程之进阶主程-陆泽西 (Jesse Lu)
  3. jsp+ssm计算机毕业设计st音乐网站论文【附源码】
  4. vue中好用的视频插件推荐,video+canvas实现视频截图第一帧,ffmpeg实现视频截图第一帧
  5. Android旅游自助项目之APP设计方案
  6. Java实现合成图片
  7. ios弧形进度条_iOS圆形进度条
  8. 男孩取名分享:光彩夺目、聪明机灵的男孩名
  9. 用Python做股市数据分析(二)
  10. Hopkins Statistic判断irir数据集聚类性能