0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何制作简易版的Redis客户端

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-16 11:52 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Redis 是我们在开发过程中经常会用到的内存数据库,尤其是在Python的第三方模块Redis-py的支持下,在Python中使用Redis及其方便。

但是在有些情况下,我们无法使用像Redis-py这样的第三方模块(比如QMT),这时候就需要自己实现一个简易版的Redis-py了。

本文将教大家如何用20行代码,制作一个简易版的Redis客户端,不过仅以GET命令为例,其他命令的用法也差不多。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。

**(可选1) **如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

**(可选2) **此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南

2.原理剖析

其实通过Redis GET返回的数据就是一些字符串,这些字符串的格式如下:

b'$466rnx80x04x95xc7x01x00x00x00x00x00x00]x94(x8cx06000957x94x8cx06002031x94x8cx06000899x94x8cx06300339x94x8cx06002090x94x8cx06601016x94x8cx06002547x94x8cx06002863x94x8cx06002591x94x8cx06002514x94x8cx06000629x94x8cx06002204x94x8cx06000544x94x8cx06002374x94x8cx06000821x94x8cx06000625x94x8cx06000158x94x8cx06002703x94x8cx06002866x94x8cx06600686x94x8cx06002796x94x8cx06300598x94x8cx06002101x94x8cx06002454x94x8cx06000970x94x8cx06000631x94x8cx06002121x94x8cx06600348x94x8cx06600996x94x8cx06002080x94x8cx06002194x94x8cx06002466x94x8cx06300663x94x8cx06002616x94x8cx06000665x94x8cx06600992x94x8cx06300750x94x8cx06300059x94x8cx06002047x94x8cx06002997x94x8cx06000521x94x8cx06002594x94x8cx06002261x94x8cx06002125x94x8cx06002085x94x8cx06002168x94x8cx06002665x94x8cx06002523x94x8cx06603067x94x8cx06002432x94e.rn'

可见其是一个bytes字符串,开头$xxx是此数据的长度,rn作为分割符,后面紧跟着的就是你的原始数据内容,最后才是rn作为结尾。

根据这个返回内容,我们就可以制作一个简易的客户端用于在无法引用第三方模块的环境中接收Redis信息。

3.编写简易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 rn".encode("utf-8"))
# 接收小于 1M 的数据
msg = s.recv(1024 * 1024)
s.close()
print(msg)
# b'$466rnx80x04x95xc7x01x00x00x00x00x00x00]x94(x8cx06000957x94x8cx06002031x94x8cx06000899x94x8cx06300339x94x8cx06002090x94x8cx06601016x94x8cx06002547x94x8cx06002863x94x8cx06002591x94x8cx06002514x94x8cx06000629x94x8cx06002204x94x8cx06000544x94x8cx06002374x94x8cx06000821x94x8cx06000625x94x8cx06000158x94x8cx06002703x94x8cx06002866x94x8cx06600686x94x8cx06002796x94x8cx06300598x94x8cx06002101x94x8cx06002454x94x8cx06000970x94x8cx06000631x94x8cx06002121x94x8cx06600348x94x8cx06600996x94x8cx06002080x94x8cx06002194x94x8cx06002466x94x8cx06300663x94x8cx06002616x94x8cx06000665x94x8cx06600992x94x8cx06300750x94x8cx06300059x94x8cx06002047x94x8cx06002997x94x8cx06000521x94x8cx06002594x94x8cx06002261x94x8cx06002125x94x8cx06002085x94x8cx06002168x94x8cx06002665x94x8cx06002523x94x8cx06603067x94x8cx06002432x94e.rn'

请注意,recv里你设定的大小会直接占用内存,所以请设定一个适宜的数目,或者从返回值中的美元符后的数字判断你需要接收的数据大小。

比如第一次请求,你只接收1024个字节,拿到 $xxx 这个长度后,重新send一次命令,再 s.recv(xxx) 长度。

上述例子中得到的内容是redis的格式,我们需要把rn给去除掉,并只取中间的数据便是我们存入redis的原始数据。

import pickle
def get_msg(msg):
    msg_new = msg.split(b"rn")[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 rn".encode("utf-8"))
# 接收小于 1M 的数据
msg = s.recv(1024 * 1024)
s.close()

def get_msg(msg):
    msg_new = msg.split(b"rn")[1]
    msg = pickle.loads(msg_new)
    return msg

print(get_msg(msg))

效果如下:

['000957', '002031', '000899', '300339', '002090', '601016', '002547', '002863', '002591', '002514', '000629', '002204', '000544', '002374', '000821', '000625', '000158', '002703', '002866', '600686', '002796', '300598', '002101', '002454', '000970', '000631', '002121', '600348', '600996', '002080', '002194', '002466', '300663', '002616', '000665', '600992', '300750', '300059', '002047', '002997', '000521', '002594', '002261', '002125', '002085', '002168', '002665', '002523', '603067', '002432']

在QMT等会限制第三方模块的软件中,使用这样的方式访问Redis,就不会再遇到白名单的限制了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    9

    文章

    3173

    浏览量

    76115
  • 开发
    +关注

    关注

    0

    文章

    376

    浏览量

    42019
  • 数据库
    +关注

    关注

    7

    文章

    3993

    浏览量

    67737
  • Redis
    +关注

    关注

    0

    文章

    390

    浏览量

    12061
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    信号处理原理-简易版

    信号处理原理-简易版主要内容信号的分类与定义随机信号与确定性信号连续信号与离散信号周期信号与非周期信号确定性信号的特性时间特性频率特性时间与频率的联系确定性信号分析时域分析频域分析随机信号特性及分析 [hide][/hide]
    发表于 11-04 10:16

    一个服务器,多个客户端,怎么向指定的客户端发数据

    我用labview做服务器,单片机做客户端客户端几百个,怎么区分客户端,给指定的客户发发数据
    发表于 06-01 09:26

    阿里云专访Redisson作者Rui Gu:构建开源企业级Redis客户端之路

    的会议,在会议上对开源Redisson客户端的作者Rui Gu做了一个访谈,Rui Gu在Redis社区国际上的影响力还有在开源上的工作给笔者留下了深刻的印象,以下是访谈的具体内容。以上照片为阿里云夏周
    发表于 07-02 16:33

    用Delphi开发OPC客户端工具的方法研究

    本文通过介绍OPC 技术的工作原理,结合OPC 客户端的工作机制,给出OPC 客户端的开发方法及在的Delphi 的具体实现,提出了OPC 客户端开发工具的设计方案,并实现了OPC 客户端
    发表于 06-15 10:37 35次下载

    CoolpyCould客户端

    一款开源的物联网服务器平台,利用nodejs写成,此文件是CoolpyCould客户端
    发表于 11-06 17:00 18次下载

    CSDN博客客户端源码

    CSDN博客客户端源码CSDN博客客户端源码CSDN博客客户端源码
    发表于 11-18 10:22 1次下载

    JAVA教程之UDP客户端模型

    JAVA教程之UDP客户端模型,很好的JAVA的资料,快来学习吧
    发表于 04-11 17:28 4次下载

    Android 仿QQ客户端及服务源码

    Android 仿QQ客户端及服务源码
    发表于 03-19 11:23 3次下载

    CA根证书和服务器、客户端证书制作及使用

    CA根证书和服务器、客户端证书制作及使用
    发表于 09-09 08:22 10次下载
    CA根证书和服务器、<b class='flag-5'>客户端</b>证书<b class='flag-5'>制作</b>及使用

    Redis的数据结构和主要命令对Redis的基本能力进行直观介绍

    当多个客户端同时向Redis申请自增序列时,Redis能够确保每个客户端得到的序列值或序列范围都是全局唯一的,绝对不会出现不同客户端得到了重
    的头像 发表于 11-05 17:57 3242次阅读

    iOS淘宝客户端应用名称发生变化 Android客户端应用名称尚未更改

    iOS淘宝客户端应用名称发生变化 Android客户端应用名称尚未更改
    发表于 04-18 15:37 1183次阅读

    HTTP客户端快速入门指南

    HTTP客户端快速入门指南
    发表于 01-12 18:45 0次下载
    HTTP<b class='flag-5'>客户端</b>快速入门指南

    HTTP客户端快速入门指南

    HTTP客户端快速入门指南
    发表于 07-03 18:38 0次下载
    HTTP<b class='flag-5'>客户端</b>快速入门指南

    MQTT中服务客户端

    MQTT 是一种基于客户端-服务架构(C/S)的消息传输协议,所以在 MQTT 协议通信中,有两个最为重要的角色,它们便是服务客户端。 1)服务
    的头像 发表于 07-30 14:55 3514次阅读

    ROS是如何设计的 ROS客户端

    实现通信的代码在ros_comm包中,如下。 其中clients文件夹一共有127个文件,看来是最大的包了。 现在我们来到了ROS最核心的地带。 客户端这个名词出现的有些突然,一个机器人操作系统里
    的头像 发表于 09-14 17:29 1424次阅读
    ROS是如何设计的 ROS<b class='flag-5'>客户端</b>库