Redis实践(4.4)SpringBoot 测试主从读写分离

Redis
placeholder image
admin 发布于:2023-05-28 11:23:17
阅读:loading

前文中使用SpringBoot Data Redis项目集成了Redis的主从架构接入,本篇主要来测试一下整合后从项目中使用自定义的工具类操作redis相关的API,实现操作Redis读模式的负载均衡。本篇文章则来实践一下在常规应用中的读写分离,如果是在项目中原始集成的话,跟数据库的读写分离一样,用两套数据源,分别指向读库可写库来实现,详见下文。

1.参考代码

package cn.chendd.redis;


/**
 * Redis读写分离测试
 * @author chendd
 * @date 2023/5/20 22:00
 */
public class RedisWriteReadTest extends BaseTest {

    /**
     * 写 客户端
     */
    @Resource(name = RedisConstants.WRITE_STRING_REDIS_TEMPLATE)
    private StringRedisTemplate writeStringRedisTemplate;
    /**
     * 读 1 客户端
     */
    @Resource(name = RedisConstants.READ1_STRING_REDIS_TEMPLATE)
    private StringRedisTemplate read1StringRedisTemplate;
    /**
     * 读 2 客户端
     */
    @Resource(name = RedisConstants.READ2_STRING_REDIS_TEMPLATE)
    private StringRedisTemplate read2StringRedisTemplate;

    @Test
    public void writeAndReadInject() {
        for (int i= 0 ; i <= 20 ; i++) {
            String value = "chendd_" + UUID.randomUUID().toString().substring(22);
            String name = "name_" + value;
            this.writeStringRedisTemplate.boundValueOps(name).set(value);
            String read1 = this.read1StringRedisTemplate.boundValueOps(name).get();
            String read2 = this.read2StringRedisTemplate.boundValueOps(name).get();
            System.out.println(MessageFormat.format("写入值 = {0}, 读1客户端 = {1} ,读2客户端 = {2}", value, read1, read2));
        }
    }

    @Test
    public void writeAndReadGet() {
        for (int i= 0 ; i <= 20 ; i++) {
            String value = "chendd_" + UUID.randomUUID().toString().substring(22);;
            String name = "name_" + value;
            RedisUtils.getWriteStringRedisTemplate().boundValueOps(name).set(value);
            String read1 = RedisUtils.getReadStringRedisTemplate().boundValueOps(name).get();
            String read2 = RedisUtils.getReadStringRedisTemplate().boundValueOps(name).get();
            System.out.println(MessageFormat.format("写入值 = {0}, 读1客户端 = {1} ,读2客户端 = {2}", value, read1, read2));
        }
    }

}

【说明】

(1)上述代码包含了两个测试方法,分别是使用注解注入RedisTemplate对象和使用工具类获取,重点关注上述方法中关于参数的set和get的方式;

(2)上述代码各循环21次,将个写21条数据至主Redis,同时从从机读取20条数据,读取到的数据均摊到两个从机上;

(3)使用redis客户端可以看到被写入了几十条数据,当从主库中写入数据后,同一个线程立即在从库获取到数据(在实践当初我在担心要是同一个线程立即获取数据无法获取到怎么办,是不是我实现方式跟思维存在问题);

2.示例输出

注解读写分离.gif

(注解读写分离

注解读写分离.gif

(工具类读写分离)

 点赞


 发表评论

当前回复:作者

 评论列表


留言区