烟台住房和城乡建设厅网站,it运维是什么,熟悉网页设计人机交互实验报告,wordpress 韩国 主题文章目录前言一、准备二、原理剖析三、编写简易Redis客户端总结前言
Redis 是我们在开发过程中经常会用到的内存数据库#xff0c;尤其是在Python的第三方模块Redis-py的支持下#xff0c;在Python中使用Redis及其方便。
但是在有些情况下#xff0c;我们无法使用像Redis-…
文章目录前言一、准备二、原理剖析三、编写简易Redis客户端总结前言
Redis 是我们在开发过程中经常会用到的内存数据库尤其是在Python的第三方模块Redis-py的支持下在Python中使用Redis及其方便。
但是在有些情况下我们无法使用像Redis-py这样的第三方模块比如QMT这时候就需要自己实现一个简易版的Redis-py了。
本文将教大家如何用20行代码制作一个简易版的Redis客户端不过仅以GET命令为例其他命令的用法也差不多。 一、准备
开始之前你要确保Python和pip已经成功安装在电脑上如果没有可以访问这篇文章超详细Python安装指南 进行安装。
(可选1) 如果你用Python的目的是数据分析可以直接安装AnacondaPython数据分析与挖掘好帮手—Anaconda它内置了Python和pip.
(可选2) 此外推荐大家用VSCode编辑器它有许多的优点Python 编程的最好搭档—VSCode 详细指南。
二、原理剖析
其实通过Redis GET返回的数据就是一些字符串这些字符串的格式如下
b$466\r\n\x80\x04\x95\xc7\x01\x00\x00\x00\x00\x00\x00]\x94(\x8c\x06000957\x94\x8c\x06002031\x94\x8c\x06000899\x94\x8c\x06300339\x94\x8c\x06002090\x94\x8c\x06601016\x94\x8c\x06002547\x94\x8c\x06002863\x94\x8c\x06002591\x94\x8c\x06002514\x94\x8c\x06000629\x94\x8c\x06002204\x94\x8c\x06000544\x94\x8c\x06002374\x94\x8c\x06000821\x94\x8c\x06000625\x94\x8c\x06000158\x94\x8c\x06002703\x94\x8c\x06002866\x94\x8c\x06600686\x94\x8c\x06002796\x94\x8c\x06300598\x94\x8c\x06002101\x94\x8c\x06002454\x94\x8c\x06000970\x94\x8c\x06000631\x94\x8c\x06002121\x94\x8c\x06600348\x94\x8c\x06600996\x94\x8c\x06002080\x94\x8c\x06002194\x94\x8c\x06002466\x94\x8c\x06300663\x94\x8c\x06002616\x94\x8c\x06000665\x94\x8c\x06600992\x94\x8c\x06300750\x94\x8c\x06300059\x94\x8c\x06002047\x94\x8c\x06002997\x94\x8c\x06000521\x94\x8c\x06002594\x94\x8c\x06002261\x94\x8c\x06002125\x94\x8c\x06002085\x94\x8c\x06002168\x94\x8c\x06002665\x94\x8c\x06002523\x94\x8c\x06603067\x94\x8c\x06002432\x94e.\r\n可见其是一个bytes字符串开头$xxx是此数据的长度\r\n作为分割符后面紧跟着的就是你的原始数据内容最后才是\r\n作为结尾。
根据这个返回内容我们就可以制作一个简易的客户端用于在无法引用第三方模块的环境中接收Redis信息。
三、编写简易Redis客户端
与Redis通信我们只需要用Python原生的socket模块即可。
import socket
import pickleREDIS_HOST 127.0.0.1
REDIS_PORT 6379
# 创建 socket 对象
s socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务指定主机和端口
s.connect((REDIS_HOST, REDIS_PORT))
s.close()这样就与你的Redis服务器连接上了接下来只需要向socket发送你的命令并receive即可获取对应的内容
import socket
import pickleREDIS_HOST 127.0.0.1
REDIS_PORT 6379
# 创建 socket 对象
s socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务指定主机和端口
s.connect((REDIS_HOST, REDIS_PORT))
# GET 某个 KEY 的内容
s.send(GET RQB_keys_20220719 \r\n.encode(utf-8))
# 接收小于 1M 的数据
msg s.recv(1024 * 1024)
s.close()
print(msg)
# b$466\r\n\x80\x04\x95\xc7\x01\x00\x00\x00\x00\x00\x00]\x94(\x8c\x06000957\x94\x8c\x06002031\x94\x8c\x06000899\x94\x8c\x06300339\x94\x8c\x06002090\x94\x8c\x06601016\x94\x8c\x06002547\x94\x8c\x06002863\x94\x8c\x06002591\x94\x8c\x06002514\x94\x8c\x06000629\x94\x8c\x06002204\x94\x8c\x06000544\x94\x8c\x06002374\x94\x8c\x06000821\x94\x8c\x06000625\x94\x8c\x06000158\x94\x8c\x06002703\x94\x8c\x06002866\x94\x8c\x06600686\x94\x8c\x06002796\x94\x8c\x06300598\x94\x8c\x06002101\x94\x8c\x06002454\x94\x8c\x06000970\x94\x8c\x06000631\x94\x8c\x06002121\x94\x8c\x06600348\x94\x8c\x06600996\x94\x8c\x06002080\x94\x8c\x06002194\x94\x8c\x06002466\x94\x8c\x06300663\x94\x8c\x06002616\x94\x8c\x06000665\x94\x8c\x06600992\x94\x8c\x06300750\x94\x8c\x06300059\x94\x8c\x06002047\x94\x8c\x06002997\x94\x8c\x06000521\x94\x8c\x06002594\x94\x8c\x06002261\x94\x8c\x06002125\x94\x8c\x06002085\x94\x8c\x06002168\x94\x8c\x06002665\x94\x8c\x06002523\x94\x8c\x06603067\x94\x8c\x06002432\x94e.\r\n请注意recv里你设定的大小会直接占用内存所以请设定一个适宜的数目或者从返回值中的美元符后的数字判断你需要接收的数据大小。
比如第一次请求你只接收1024个字节拿到 $xxx 这个长度后重新send一次命令再 s.recv(xxx) 长度。
上述例子中得到的内容是redis的格式我们需要把\r\n给去除掉并只取中间的数据便是我们存入redis的原始数据。
import pickle def get_msg(msg): msg_new msg.split(b\r\n)[1] msg pickle.loads(msg_new) return msg
因为我的原始内容是pickle格式因此我在取出原始数据后使用pickle.loads便能拿到我想要的内容完整代码如下
import socket
import pickleREDIS_HOST 127.0.0.1
REDIS_PORT 6379
# 创建 socket 对象
s socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务指定主机和端口
s.connect((REDIS_HOST, REDIS_PORT))
# GET 某个 KEY 的内容
s.send(GET RQB_keys_20220719 \r\n.encode(utf-8))
# 接收小于 1M 的数据
msg s.recv(1024 * 1024)
s.close()def get_msg(msg):msg_new msg.split(b\r\n)[1]msg pickle.loads(msg_new)return msgprint(get_msg(msg))效果如下
[‘000957’, ‘002031’, ‘000899’, ‘300339’, ‘002090’, ‘601016’, ‘002547’, ‘002863’, ‘002591’, ‘002514’, ‘000629’, 00 在QMT等会限制第三方模块的软件中使用这样的方式访问Redis就不会再遇到白名单的限制了。
总结
我们的文章到此就结束啦如果你喜欢今天的Python 实战教程请持续关注Python徐浪老师大讲堂