测试平台系列(80) 封装Redis客户端
大家好~我是
米洛
!
我正在从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客户端的更多相关文章
- 测试平台系列(85) 把redis运用到实战中
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们让支持了前置条件 ...
- 测试平台系列(79) 编写Redis配置功能(下)
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们提出了优化Dao ...
- 测试平台系列(90) 编写oss客户端
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节我们编写了在线执行测试 ...
- 测试平台系列(81) 编写在线执行Redis功能
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们牛刀小试,编写了 ...
- 测试平台系列(83) 前置条件支持Redis语句
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上节我们打了个野,解决了一 ...
- 测试平台系列(72) 了解ApScheduler基本用法
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们调研了一下市面上 ...
- 测试平台系列(82) 解决APScheduler重复执行的问题
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持. 欢迎关注我的公众号测试开发坑货,获取最新文章教程! 回顾 上一节我们编写了在线执行R ...
- 测试平台系列(92) 让http请求支持文件上传
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节呢,我们编写了oss的 ...
- 测试平台系列(55) 引入AceEditor(代码编辑器)
大家好,我是米洛,求三连!求关注测试开发坑货! 回顾 我们上一节已经写好了左侧数据表目录,今天继续完成sql编辑器的部分. 调研组件 monaco 因为我们的项目用的是React,市面上很多编辑器都是 ...
随机推荐
- Serverless:这真的是未来吗?(一)
原文 | https://www.pulumi.com/blog/is_serverless_the_future_part_1/ 作者 | Lee Briggs & Piers Karsen ...
- The Data Way Vol.3|做到最后只能删库跑路?DBA 能做的还有很多
关于「The Data Way」 「The Data Way」是由 SphereEx 公司出品的一档播客节目.这里有开源.数据.技术的故事,同时我们关注开发者的工作日常,也讨论开发者的生活日常:我们聚 ...
- Python中生成器的理解
1.生成器的定义 在Python中一边循环一边计算的机制,称为生成器 2.为什么要有生成器 列表所有的数据都存在内存中,如果有海量的数据将非常耗内存 如:仅仅需要访问前面几个元素,那后面绝大多数元素占 ...
- Win7恢复注册表
前言 安装仿真实验环境的时候,按照指引把杀软关了,然后出现了"不是有效Win32应用程序"的错误,bd了一下解决方案,爬到了一篇文章:删除注册表中的.exe然后重启,然后,所有的e ...
- 【c++ Prime 学习笔记】第7章 类
类的基本思想是数据抽象和封装 数据分离抽象是一种依赖于接口和实现分离的编程/设计技术.接口包括用户能执行的操作,实现包括类的数据成员.接口实现的函数体.定义类所需的各种私有函数 封装实现了类的接口和实 ...
- 并发编程从零开始(六)-BlockingDeque+CopyOnWrite
并发编程从零开始(六)-BlockingDeque+CopyOnWrite 5.2 BlockingDeque BlockingDeque定义了一个阻塞的双端队列接口: 该接口继承了BlockingQ ...
- 2021.10.7考试总结[NOIP模拟71]
信心赛,但炸了.T3SB错直接炸飞,T4可以硬算的组合数非要分段打表求阶乘..T2也因为一个细节浪费了大量时间.. 会做难题很好,但首先还是要先把能拿的分都拿到. T1 签到题 结论:总可以做到对每个 ...
- [调试笔记] 10.8模拟赛11 T4 甜圈
这题正解线段树维护哈希,同机房神犇已经讲的很明白了.这里只说sbwzx在调试的时候犯的sb错误. 1.关于pushdown和update 众所周知,sbwzx一写带lazy的线段树,就必在pushdo ...
- Linux基础是零基础必须要过的关,你懂了多少
#LINUX基础学习 ##命令行下的基础知识 Linux区分英文的大小写. date :查看时间 cal:查看日历 [Tab] 热键 :可以自动补全命令名和文件名 [Ctrl]+C 热键 :可以中断正 ...
- Python课程笔记(三)
1.python定义类.创建对象 class Myclass: # 定义Myclass类 def sum(self,x,y): self.x = x self.y = y return self.x+ ...