Python如何实现Redis构造简易客户端(教程在这)
Posted 徐浪老师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python如何实现Redis构造简易客户端(教程在这)相关的知识,希望对你有一定的参考价值。
文章目录
前言
Redis 是我们在开发过程中经常会用到的内存数据库,尤其是在Python的第三方模块Redis-py的支持下,在Python中使用Redis及其方便。
但是在有些情况下,我们无法使用像Redis-py这样的第三方模块(比如QMT),这时候就需要自己实现一个简易版的Redis-py了。
本文将教大家如何用20行代码,制作一个简易版的Redis客户端,不过仅以GET命令为例,其他命令的用法也差不多。
一、准备
开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。
(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—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 pickle
REDIS_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 pickle
REDIS_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 pickle
REDIS_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 msg
print(get_msg(msg))
效果如下:
[‘000957’, ‘002031’, ‘000899’, ‘300339’, ‘002090’, ‘601016’, ‘002547’, ‘002863’, ‘002591’, ‘002514’, ‘000629’, '00
在QMT等会限制第三方模块的软件中,使用这样的方式访问Redis,就不会再遇到白名单的限制了。
总结
我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python徐浪老师大讲堂!
安装好Pycharm后如何配置Python解释器简易教程
这两天有许多Python小白加入学习群,并且问了许多关于Pycharm基本使用的问题,今天小编就以配置Python解释器的问题给大家简单絮叨一下。
1、一般来说,当我们启动Pycharm,如果Pycharm正常激活的话,就会直接进入到Pycharm中去,并且Pycharm经常会弹出下图的界面。(如果有小伙伴的Pycharm尚未激活,可以站内私信,小编这有好几个激活码,给大家分享。)
其实这个是Pycharm的提示信息,一般是Pycharm的简易或快捷方式介绍或者其他的Pycharm功能说明,大家完全可以不用理会,直接点击右下方的“Close”即可,不会对你产生任何影响。
2、之后我们可能会碰到一个问题,先后有好几个小伙伴咨询Pycharm安装后并不能直接写代码,并且有图为证,如下图所示。
一看到这个提示,就知道Pycharm中尚未配置Python解释器,此时不用慌,并不是Pycharm没有安装成功,而是因为有个配置尚未完成,只需要配置好Python解释器之后,一切都会正常。其实Python解释器的配置并不难,具体的教程如下。
3、首先点击上图中“Configure Python Interpreter”,之后Pycharm就会自动定位到“Project Interpreter”这个位置,如下图所示,该界面是Pycharm的设置窗口之一,专门用于配置Python解释器的。
4、此时只需要点击“Project Interpreter”右侧的小三角下拉框,如下图右侧的红色小框框所示。
5、点击该按钮之后,Pycharm会自动弹出Python的解释器路径,如下图所示。
6、此时只需要选择其中一个Python解释器,就可以配置成功了。在这里,以第一个Python解释器为例,点击之后,等待Pycharm进行加载,如下图所示。
7、此时可以看到“Project Interpreter”已经有Python解释器了,并且相关的库正在加载中(Loading),稍等片刻之后就可以加载成功。相关库加载好之后,Python解释器配置就完成了,如下图所示。
8、点击“Apply”,表示将相关库加载到Python解释器中,稍等片刻即可,等“Apply”这个选项卡灰化之后,再点击“OK”选项卡,如下图所示。
9、接下来Pycharm就会自动关闭“Setting”窗口,自动回到Pycharm主页面中,并且会显示加载Python解释器的过程,如下图所示,稍等片刻之后就会完成。
10、顺利加载完成之后,之前的提示就会消失了,此时Pycharm一起回复正常,如下图所示。
现在,小伙伴们就可以自由的使用Pycharm敲代码啦~~~
11、如果在“Setting”窗口中的“Project Interpreter”下拉框中没有弹出Python安装路径或者弹出的路径位置不对,则需要点击旁边的那个设置按钮,如下图所示。
12、之后会弹出下图的对话框,点击第一个“Add Local”,表示从本地添加Python解释器。
此时Pycharm就会定位到本地磁盘,此时你要做的就是将Python的安装位置找出来,然后点击“OK”进行确认即可。
13、之后的操作步骤就和上面正常加载Python解释器的步骤一样了,祝大家一切顺利。
小伙伴们,这下你们应该get到Pycharm中该如何加载Python解释器的正确姿势了吧?
以上是关于Python如何实现Redis构造简易客户端(教程在这)的主要内容,如果未能解决你的问题,请参考以下文章