大家好~我是米洛

我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持。

欢迎关注我的公众号测试开发坑货,获取最新文章教程!

回顾

上一节我们编写了Redis的相关配置编辑页面,博主这里也趁热打铁,把前端页面完善了。(可能会有一点点小问题,但应该主流程都正常)

其实和其他配置管理页面差不多,前端优化了一下面包屑,顶部的菜单也放回到左侧了。看看mac下的效果:

搜索选项改动了一些,所见即所得,如果搜索项发生变化,那么内容也会随之切换

关于Redis客户端的选用

其实在这个问题上我是比较纠结的,redis有star很多的py客户端,也有与之对应的集群版本。但他们并不支持asyncio

而支持asyncio的aioredis,本身是个很好的选择,但人家没有支持redis集群的计划。orz

所以今天想的是要不就用个同步的redis-cluster-py库算了,不过在我翻了github一段时间,发现了个叫aredis的异步库。大概瞅了下,他基本上是保持了和redis-cluster-py接近的api,可能也是为了吸引用户

所以咱们就先试验一下,小白鼠嘛,总得有人来做。

安装aredis

看官网是要安装aredis[hiredis],但我好像不适合这样方式,于是我分开装:

pip3 install aredis hiredis

编写RedisManager

其实这里还是和MySQL比较接近的,也是通过一个字典存放各个redis的连接配置。

不过由于Redis的集群和单实例还有一点区别(好在我们编写配置的时候就准备好了),所以我们最好是针对单实例和集群分别编写2个map存放他们的client,当然1个也是ok的。

整体流程: 从字典获取客户端,如果没有则新开一个客户端,并放入缓存,有则返回。

  • 可能存在的问题

    代码不是线程安全的,需要观察是否需要加锁

    缓存不像LRU会降频,也不能自动过期

    对我来说第一个肯定是个大问题,如果出现了就必须得解决。至于第二个问题,由于redis配置很少变动,而且我们本身是连接池的形式,所以影响不算大。

    话不多说,现在我们就来编写吧:

"""
redis客户端,基于aredis(支持集群,aioredis不支持集群)
"""
from aredis import StrictRedisCluster, ClusterConnectionPool, ConnectionPool, StrictRedis from app.excpetions.RedisException import RedisException class PityRedisManager(object):
"""非线程安全,可能存在问题
"""
_cluster_pool = dict()
_pool = dict() @staticmethod
def get_cluster_client(redis_id: int, addr: str):
"""
获取redis集群客户端
:param redis_id:
:param addr:
:return:
"""
cluster = PityRedisManager._cluster_pool.get(redis_id)
if cluster is not None:
return cluster
client = PityRedisManager.get_cluster(addr)
PityRedisManager._cluster_pool[redis_id] = client
return client @staticmethod
def get_single_node_client(redis_id: int, addr: str, password: str, db: str):
"""
获取redis单实例客户端
:param redis_id:
:param addr:
:param password:
:param db:
:return:
"""
node = PityRedisManager._cluster_pool.get(redis_id)
if node is not None:
return node
host, port = addr.split(":")
pool = ConnectionPool(host=host, port=port, db=db, max_connections=100, password=password,
decode_responses=True)
client = StrictRedis(connection_pool=pool)
PityRedisManager._pool[redis_id] = PityRedisManager.get_cluster(addr)
return client @staticmethod
def refresh_redis_client(redis_id: int, addr: str, password: str, db: str):
"""
刷新redis客户端
:param redis_id:
:param addr:
:param password:
:param db:
:return:
"""
host, port = addr.split(":")
pool = ConnectionPool(host=host, port=port, db=db, max_connections=100, password=password,
decode_responses=True)
client = StrictRedis(connection_pool=pool, decode_responses=True)
PityRedisManager._pool[redis_id] = client @staticmethod
def refresh_redis_cluster(redis_id: int, addr: str):
PityRedisManager._cluster_pool[redis_id] = PityRedisManager.get_cluster(addr) @staticmethod
def get_cluster(addr: str):
"""
获取集群连接池
:param addr:
:return:
"""
try:
nodes = addr.split(',')
startup_nodes = [{"host": n.split(":")[0], "port": n.split(":")[1]} for n in nodes]
pool = ClusterConnectionPool(startup_nodes=startup_nodes, max_connections=100, decode_responses=True)
client = StrictRedisCluster(connection_pool=pool, decode_responses=True)
return client
except Exception as e:
raise RedisException(f"获取Redis连接失败, {e}")

我们以数据库的唯一id为key,缓存redis的连接池

由于连接池会自动开启/关闭连接,所以我们不需要手动关闭客户端,非常方便。

可以明显看到我们分别用了ClusterConnectionPool和ConnectionPool,分别对应集群和实例。参数基本上算是一致。

至于refresh,是给改动redis以后做的刷新连接的工作。

以上就是RedisManager的内容,到这只是能够获取Redis客户端了。

尝试一下

有条件的同学可以本次安装redis:

$ wget https://download.redis.io/releases/redis-6.2.6.tar.gz
$ tar xzf redis-6.2.6.tar.gz
$ cd redis-6.2.6
$ make

make了以后,修改redis-6.2.6目录下的redis.conf, 接着取消这一行的注释:

使用密码模式(redis最好是加密码,端口号也尽量不要用原生的6379,本宝宝有台机器被人通过redis植入了挖矿程序,苦不堪言

  • 在redis-6.2.6目录下启动
src/redis-server redis.conf

这样本地redis的实例就启动了~

编写个在线测试redis的接口

  • 先通过id拿到redis的配置信息

  • 然后通过manager拿到连接池

  • 对redis发动命令

    我们在http://localhost:7777/docs打开swagger调试:

  • 读取faker

  • 设置faker为s12

  • 再次取faker

可以看到redis的相关操作已经是可以用了,那我们今天的内容就到这了,愉快的周末总是辣么短暂

下一节我们就得编写在线执行Redis的命令及相关页面了!

测试平台系列(80) 封装Redis客户端的更多相关文章

  1. 测试平台系列(85) 把redis运用到实战中

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们让支持了前置条件 ...

  2. 测试平台系列(79) 编写Redis配置功能(下)

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们提出了优化Dao ...

  3. 测试平台系列(90) 编写oss客户端

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节我们编写了在线执行测试 ...

  4. 测试平台系列(81) 编写在线执行Redis功能

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们牛刀小试,编写了 ...

  5. 测试平台系列(83) 前置条件支持Redis语句

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上节我们打了个野,解决了一 ...

  6. 测试平台系列(72) 了解ApScheduler基本用法

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们调研了一下市面上 ...

  7. 测试平台系列(82) 解决APScheduler重复执行的问题

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们编写了在线执行R ...

  8. 测试平台系列(92) 让http请求支持文件上传

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节呢,我们编写了oss的 ...

  9. 测试平台系列(55) 引入AceEditor(代码编辑器)

    大家好,我是米洛,求三连!求关注测试开发坑货! 回顾 我们上一节已经写好了左侧数据表目录,今天继续完成sql编辑器的部分. 调研组件 monaco 因为我们的项目用的是React,市面上很多编辑器都是 ...

随机推荐

  1. C# 提取PDF中的表格

    本文介绍在C#程序中(附VB.NET代码)提取PDF中的表格的方法,调用Spire.PDF for .NET提供的提取表格的类以及方法等来获取表格单元格中的文本内容:代码内容中涉及到的主要类及方法归纳 ...

  2. 论文解读丨表格识别模型TableMaster

    摘要:在此解决方案中把表格识别分成了四个部分:表格结构序列识别.文字检测.文字识别.单元格和文字框对齐.其中表格结构序列识别用到的模型是基于Master修改的,文字检测模型用到的是PSENet,文字识 ...

  3. 【二食堂】Alpha - Scrum Meeting 1

    Scrum Meeting 1 例会时间:4.10 8:00 - 8:30 进度情况 组员 上周进度 明日任务 李健 1. 在Anaconda3中搭建了python和django的环境issue1. ...

  4. MySQL 8.0安装 + 配置环境变量 + 连接 cmd

    MySQL 安装教程 搜索 MySQL,进入官网,找到 download 点击适用于 window community 版本,点击图中第二个 450.7 M 的安装包进行下载 这里有五个选项,选择第二 ...

  5. 使用flink实现一个简单的wordcount

    使用flink实现一个简单的wordcount 一.背景 二.需求 三.前置条件 1.jdk版本要求 2.maven版本要求 四.实现步骤 1.创建 flink 项目 2.编写程序步骤 1.创建Str ...

  6. poi实现生成下拉选

    在我们日常开发中,经常需要使用poi操作excel文件,现在就简单介绍一下在poi中是如何生成下拉选的. 1.创建workbook 2.创建数据约束 3.设置数据的有效性 @Test public v ...

  7. 2021.9.26考试总结[NOIP模拟62]

    T1 set 从\(0\)到\(n\)前缀余数有\(n+1\)个,但只有\(n\)种取值,找到一样的两个输出区间即可. \(code:\) T1 #include<bits/stdc++.h&g ...

  8. jdk8下载与安装教程

     jdk8下载与安装教程下载有两种方式 一.网盘下载网盘下载链接 pan.baidu.com/s/1VQAwHS6WDjemDnKDnPIvww 提取码:f5tv二.官网下载如果想自己一步步研究亲自实 ...

  9. python fnmatch & glob

    1,转载:Python模块学习 - fnmatch & glob - Dahlhin - 博客园 (cnblogs.com) 介绍 fnmatch 和 glob 模块都是用来做字符串匹配文件名 ...

  10. Luogu P1525 [NOIp2010提高组]关押罪犯 | 并查集

    题目链接 这一道题,我用了并查集来做.在此题中,并查集的作用就是:将同一个监狱里的罪犯合并到一起. 思路:将每对罪犯之间的怨气值从大到小排序,再依次把他们分到不同的两个监狱里,当发现这一对罪犯已经在同 ...