文档章节

【Redis】对指定db进行操作

o
 osc_wws45aot
发布于 2019/08/20 15:43
字数 740
阅读 14
收藏 0

精选30+云产品,助力企业轻松上云!>>>

问题

自动化测试大量报错,原因是验证码错误,从redis中查询验证码,返回结果均为null。

原因

因为在UAT环境,各项目共用1个redis,db0中的数据较多,达到了600W+,导致查询速度较慢,故验证码发送服务将验证码的存储从db0切到了db4。

导致自定义的Jmeter函数无法正常查询到验证码,因为原本该函数是默认充db0中进行查询的。

解决方案

自定义函数中是使用jedis对redis使用操作,版本为3.0.1,maven详细依赖如下:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.0.1</version>
</dependency>

在网上查询的方法有在config中添加配置与在redis对象上使用select()两种方案,可能是因为jedis版本不同,以上2中方案均不适用。

因为JedisPoolConfig中没有方法用于设置db,并且ShardedJedis中没有select()方法,只能寻找其他技术方案进行解决。

函数中原使用以下方法创建redis分片:

public static ShardedJedis getJedis (String host, String password) {
    JedisShardInfo jedisShardInfo = new JedisShardInfo(host,6379);
    jedisShardInfo.setPassword(password);
    List<JedisShardInfo> list = new LinkedList<JedisShardInfo>();
    list.add(jedisShardInfo);
    ShardedJedisPool pool = new ShardedJedisPool(config, list);
    ShardedJedis jedis = pool.getResource();
    return jedis;
}

查看JedisShardInfo中的JedisShardInfo(String host, int port)构造方法,

public JedisShardInfo(String host, int port) {
    this(host, port, 2000);
}

继续查看调用链,

public JedisShardInfo(String host, int port, int timeout) {
    this(host, port, timeout, timeout, 1);
}
public JedisShardInfo(String host, int port, int connectionTimeout, int soTimeout, int weight) {
    super(weight);
    this.password = null;
    this.name = null;
    this.db = 0;
    this.host = host;
    this.port = port;
    this.connectionTimeout = connectionTimeout;
    this.soTimeout = soTimeout;
}

发现db默认写死为0,且没有set方法。

查询JedisShardInfo中的其他构造方法,发现JedisShardInfo(String host)方法:

public JedisShardInfo(String host) {
    super(1);
    this.password = null;
    this.name = null;
    this.db = 0;
    URI uri = URI.create(host);
    if (JedisURIHelper.isValid(uri)) {
        this.host = uri.getHost();
        this.port = uri.getPort();
        this.password = JedisURIHelper.getPassword(uri);
        this.db = JedisURIHelper.getDBIndex(uri);
        this.ssl = JedisURIHelper.isRedisSSLScheme(uri);
    } else {
        this.host = host;
        this.port = 6379;
    }
}

此处的db设置并未写死,看起来是根据url来获取设置,进入JedisURIHelper.getPassword()查看详情:

public static int getDBIndex(URI uri) {
    String[] pathSplit = uri.getPath().split("/", 2);
    if (pathSplit.length > 1) {
        String dbIndexStr = pathSplit[1];
        return dbIndexStr.isEmpty() ? 0 : Integer.parseInt(dbIndexStr);
    } else {
        return 0;
    }
}

从方法中得知,db可根据url中"/"后的值进行设置,而url是通过URI.create()方法获得,查询URI.create()方法详情:

public static URI create(String str) {
    try {
        return new URI(str);
    } catch (URISyntaxException x) {
        throw new IllegalArgumentException(x.getMessage(), x);
    }
}

查询if判断条件中的JedisURIHelper.isValid()方法:

public static boolean isValid(URI uri) {
    return !isEmpty(uri.getScheme()) && !isEmpty(uri.getHost()) && uri.getPort() != -1;

故得知,使用JedisShardInfo(String host)进行实例化时,入参为URL的形式,需要有协议头、host地址、端口号,并在host添加"/",再其后设置dbIndex,如下所示形式:

http://xxxxxxx.redis.rds.aliyuncs.com:6379/4

结论

在自定义函数中的getJedis()方法里使用JedisShardInfo(String host)对JedisShardInfo进行实例化,并以http://redisHost:port/dbIndex的形式设置redis地址,则可对redis的指定db进行操作。

修改后的getJedis()方法如下:

public static ShardedJedis getJedis (String host, String password) {
    JedisShardInfo jedisShardInfo = new JedisShardInfo(host);
    jedisShardInfo.setPassword(password);
    List<JedisShardInfo> list = new LinkedList<JedisShardInfo>();
    list.add(jedisShardInfo);
    ShardedJedisPool pool = new ShardedJedisPool(config, list);
    ShardedJedis jedis = pool.getResource();
    return jedis;
}
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
【Redis】- 基础认识

常见KV数据库:memcached 、redis Redis作用:数据内存缓存,提供持久化机制,保证数据可恢复性 工作流程:应用程序--->redis(命中缓存中则直接返回,否则访问目标数据库再缓存)----->目标服...

ZeroneLove
2019/02/23
7
0
【Redis】-- 核心原理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/YYZZHC999/article/details/100068202 一、简介 分布式缓存是分布式系...

杨晓慧_Hepburn
2019/08/25
0
0
【Redis】Redis学习笔记

Redis学习笔记 参考官方文档 一、common item 1.1 redis-cli: 常用选项 常见集群操作命令: pingping...set a bget aexec 开始执行 特殊操作模式 查看当前数据情况,负载情况, 默认15秒一次...

LittleGump
04/28
0
0
【Redis】入门

Redis概述 Redis常用数据结构 Redis删除过期数据策略 Redis内存淘汰机制 Redis持久化机制 缓存问题及解决方案 Redis概述 Redis是一个开源的、基于内存的数据结构存储器,可以用作数据库、缓存...

WilsonPan
04/05
0
0
【Redis】入门

Redis概述 Redis常用数据结构 Redis删除过期数据策略 Redis内存淘汰机制 Redis持久化机制 缓存问题及解决方案 Redis概述 Redis是一个开源的、基于内存的数据结构存储器,可以用作数据库、缓存...

WilsonPan
04/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在控制器中使用过滤器? - How to use a filter in a controller?

问题: I have written a filter function which will return data based on the argument you are passing. 我编写了一个过滤函数,它将根据您传递的参数返回数据。 I want the same functi......

富含淀粉
今天
26
0
android:layout_weight是什么意思? - What does android:layout_weight mean?

问题: I don't understand how to use this attribute. 我不明白如何使用这个属性。 Can anyone tell me more about it? 谁能告诉我更多关于它的事情? 解决方案: 参考一: https://stacko...

javail
今天
17
0
CSS背景不透明度[重复] - CSS Background Opacity [duplicate]

问题: This question already has an answer here: 这个问题已经在这里有了答案: How do I give text or an image a transparent background using CSS? 如何使用CSS为文本或图像提供透明背...

fyin1314
今天
27
0
node http 获取gb2312网页如何转为utf8

最初,我想当然认为是下述做法,但被证明是错误的 const http = require('http'), iconv = require('iconv-lite');const url = 'http://xxx';http.get(url, function(res) { var bo......

高延
今天
24
0
动态规划:LC198.打家劫舍

题目描述: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入...

曦鱼violet
今天
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部