0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何制作簡(jiǎn)易版的Redis客戶端

科技綠洲 ? 來源:Python實(shí)用寶典 ? 作者:Python實(shí)用寶典 ? 2023-10-16 11:52 ? 次閱讀

Redis 是我們?cè)陂_發(fā)過程中經(jīng)常會(huì)用到的內(nèi)存數(shù)據(jù)庫(kù),尤其是在Python的第三方模塊Redis-py的支持下,在Python中使用Redis及其方便。

但是在有些情況下,我們無法使用像Redis-py這樣的第三方模塊(比如QMT),這時(shí)候就需要自己實(shí)現(xiàn)一個(gè)簡(jiǎn)易版的Redis-py了。

本文將教大家如何用20行代碼,制作一個(gè)簡(jiǎn)易版的Redis客戶端,不過僅以GET命令為例,其他命令的用法也差不多。

1.準(zhǔn)備

開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上,如果沒有,可以訪問這篇文章:超詳細(xì)Python安裝指南 進(jìn)行安裝。

**(可選1) **如果你用Python的目的是數(shù)據(jù)分析,可以直接安裝Anaconda:Python數(shù)據(jù)分析與挖掘好幫手—Anaconda,它內(nèi)置了Python和pip.

**(可選2) **此外,推薦大家用VSCode編輯器,它有許多的優(yōu)點(diǎn):Python 編程的最好搭檔—VSCode 詳細(xì)指南。

2.原理剖析

其實(shí)通過Redis GET返回的數(shù)據(jù)就是一些字符串,這些字符串的格式如下:

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

可見其是一個(gè)bytes字符串,開頭$xxx是此數(shù)據(jù)的長(zhǎng)度,rn作為分割符,后面緊跟著的就是你的原始數(shù)據(jù)內(nèi)容,最后才是rn作為結(jié)尾。

根據(jù)這個(gè)返回內(nèi)容,我們就可以制作一個(gè)簡(jiǎn)易的客戶端用于在無法引用第三方模塊的環(huán)境中接收Redis信息。

3.編寫簡(jiǎn)易R(shí)edis客戶端

與Redis通信,我們只需要用Python原生的socket模塊即可。

import socket
import pickle

REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
# 創(chuàng)建 socket 對(duì)象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 連接服務(wù),指定主機(jī)和端口
s.connect((REDIS_HOST, REDIS_PORT))
s.close()

這樣就與你的Redis服務(wù)器連接上了,接下來只需要向socket發(fā)送你的命令并receive即可獲取對(duì)應(yīng)的內(nèi)容:

import socket
import pickle

REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
# 創(chuàng)建 socket 對(duì)象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 連接服務(wù),指定主機(jī)和端口
s.connect((REDIS_HOST, REDIS_PORT))
# GET 某個(gè) KEY 的內(nèi)容
s.send("GET RQB_keys_20220719 rn".encode("utf-8"))
# 接收小于 1M 的數(shù)據(jù)
msg = s.recv(1024 * 1024)
s.close()
print(msg)
# b'$466rnx80x04x95xc7x01x00x00x00x00x00x00]x94(x8cx06000957x94x8cx06002031x94x8cx06000899x94x8cx06300339x94x8cx06002090x94x8cx06601016x94x8cx06002547x94x8cx06002863x94x8cx06002591x94x8cx06002514x94x8cx06000629x94x8cx06002204x94x8cx06000544x94x8cx06002374x94x8cx06000821x94x8cx06000625x94x8cx06000158x94x8cx06002703x94x8cx06002866x94x8cx06600686x94x8cx06002796x94x8cx06300598x94x8cx06002101x94x8cx06002454x94x8cx06000970x94x8cx06000631x94x8cx06002121x94x8cx06600348x94x8cx06600996x94x8cx06002080x94x8cx06002194x94x8cx06002466x94x8cx06300663x94x8cx06002616x94x8cx06000665x94x8cx06600992x94x8cx06300750x94x8cx06300059x94x8cx06002047x94x8cx06002997x94x8cx06000521x94x8cx06002594x94x8cx06002261x94x8cx06002125x94x8cx06002085x94x8cx06002168x94x8cx06002665x94x8cx06002523x94x8cx06603067x94x8cx06002432x94e.rn'

請(qǐng)注意,recv里你設(shè)定的大小會(huì)直接占用內(nèi)存,所以請(qǐng)?jiān)O(shè)定一個(gè)適宜的數(shù)目,或者從返回值中的美元符后的數(shù)字判斷你需要接收的數(shù)據(jù)大小。

比如第一次請(qǐng)求,你只接收1024個(gè)字節(jié),拿到 $xxx 這個(gè)長(zhǎng)度后,重新send一次命令,再 s.recv(xxx) 長(zhǎng)度。

上述例子中得到的內(nèi)容是redis的格式,我們需要把rn給去除掉,并只取中間的數(shù)據(jù)便是我們存入redis的原始數(shù)據(jù)。

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

因?yàn)槲业脑純?nèi)容是pickle格式,因此我在取出原始數(shù)據(jù)后使用pickle.loads便能拿到我想要的內(nèi)容,完整代碼如下:

import socket
import pickle

REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
# 創(chuàng)建 socket 對(duì)象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 連接服務(wù),指定主機(jī)和端口
s.connect((REDIS_HOST, REDIS_PORT))
# GET 某個(gè) KEY 的內(nèi)容
s.send("GET RQB_keys_20220719 rn".encode("utf-8"))
# 接收小于 1M 的數(shù)據(jù)
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等會(huì)限制第三方模塊的軟件中,使用這樣的方式訪問Redis,就不會(huì)再遇到白名單的限制了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2903

    瀏覽量

    73536
  • 開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    357

    瀏覽量

    40734
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3712

    瀏覽量

    64023
  • Redis
    +關(guān)注

    關(guān)注

    0

    文章

    368

    瀏覽量

    10780
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    信號(hào)處理原理-簡(jiǎn)易版

    信號(hào)處理原理-簡(jiǎn)易版主要內(nèi)容信號(hào)的分類與定義隨機(jī)信號(hào)與確定性信號(hào)連續(xù)信號(hào)與離散信號(hào)周期信號(hào)與非周期信號(hào)確定性信號(hào)的特性時(shí)間特性頻率特性時(shí)間與頻率的聯(lián)系確定性信號(hào)分析時(shí)域分析頻域分析隨機(jī)信號(hào)特性及分析 [hide][/hide]
    發(fā)表于 11-04 10:16

    一個(gè)服務(wù)器,多個(gè)客戶端,怎么向指定的客戶端發(fā)數(shù)據(jù)

    我用labview做服務(wù)器,單片機(jī)做客戶端,客戶端幾百個(gè),怎么區(qū)分客戶端,給指定的客戶發(fā)發(fā)數(shù)據(jù)
    發(fā)表于 06-01 09:26

    阿里云專訪Redisson作者Rui Gu:構(gòu)建開源企業(yè)級(jí)Redis客戶端之路

    的會(huì)議,在會(huì)議上對(duì)開源Redisson客戶端的作者Rui Gu做了一個(gè)訪談,Rui Gu在Redis社區(qū)國(guó)際上的影響力還有在開源上的工作給筆者留下了深刻的印象,以下是訪談的具體內(nèi)容。以上照片為阿里云夏周
    發(fā)表于 07-02 16:33

    用Delphi開發(fā)OPC客戶端工具的方法研究

    本文通過介紹OPC 技術(shù)的工作原理,結(jié)合OPC 客戶端的工作機(jī)制,給出OPC 客戶端的開發(fā)方法及在的Delphi 的具體實(shí)現(xiàn),提出了OPC 客戶端開發(fā)工具的設(shè)計(jì)方案,并實(shí)現(xiàn)了OPC 客戶端
    發(fā)表于 06-15 10:37 ?35次下載

    CoolpyCould客戶端

    一款開源的物聯(lián)網(wǎng)服務(wù)器平臺(tái),利用nodejs寫成,此文件是CoolpyCould客戶端
    發(fā)表于 11-06 17:00 ?18次下載

    CSDN博客客戶端源碼

    CSDN博客客戶端源碼CSDN博客客戶端源碼CSDN博客客戶端源碼
    發(fā)表于 11-18 10:22 ?1次下載

    JAVA教程之UDP客戶端模型

    JAVA教程之UDP客戶端模型,很好的JAVA的資料,快來學(xué)習(xí)吧
    發(fā)表于 04-11 17:28 ?4次下載

    Android 仿QQ客戶端及服務(wù)源碼

    Android 仿QQ客戶端及服務(wù)源碼
    發(fā)表于 03-19 11:23 ?3次下載

    CA根證書和服務(wù)器、客戶端證書制作及使用

    CA根證書和服務(wù)器、客戶端證書制作及使用
    發(fā)表于 09-09 08:22 ?10次下載
    CA根證書和服務(wù)器、<b class='flag-5'>客戶端</b>證書<b class='flag-5'>制作</b>及使用

    Redis的數(shù)據(jù)結(jié)構(gòu)和主要命令對(duì)Redis的基本能力進(jìn)行直觀介紹

    當(dāng)多個(gè)客戶端同時(shí)向Redis申請(qǐng)自增序列時(shí),Redis能夠確保每個(gè)客戶端得到的序列值或序列范圍都是全局唯一的,絕對(duì)不會(huì)出現(xiàn)不同客戶端得到了重
    的頭像 發(fā)表于 11-05 17:57 ?2918次閱讀

    iOS淘寶客戶端應(yīng)用名稱發(fā)生變化 Android客戶端應(yīng)用名稱尚未更改

    iOS淘寶客戶端應(yīng)用名稱發(fā)生變化 Android客戶端應(yīng)用名稱尚未更改
    發(fā)表于 04-18 15:37 ?881次閱讀

    HTTP客戶端快速入門指南

    HTTP客戶端快速入門指南
    發(fā)表于 01-12 18:45 ?0次下載
    HTTP<b class='flag-5'>客戶端</b>快速入門指南

    HTTP客戶端快速入門指南

    HTTP客戶端快速入門指南
    發(fā)表于 07-03 18:38 ?0次下載
    HTTP<b class='flag-5'>客戶端</b>快速入門指南

    MQTT中服務(wù)客戶端

    MQTT 是一種基于客戶端-服務(wù)架構(gòu)(C/S)的消息傳輸協(xié)議,所以在 MQTT 協(xié)議通信中,有兩個(gè)最為重要的角色,它們便是服務(wù)客戶端。 1)服務(wù)
    的頭像 發(fā)表于 07-30 14:55 ?2231次閱讀

    ROS是如何設(shè)計(jì)的 ROS客戶端庫(kù)

    實(shí)現(xiàn)通信的代碼在ros_comm包中,如下。 其中clients文件夾一共有127個(gè)文件,看來是最大的包了。 現(xiàn)在我們來到了ROS最核心的地帶。 客戶端這個(gè)名詞出現(xiàn)的有些突然,一個(gè)機(jī)器人操作系統(tǒng)里
    的頭像 發(fā)表于 09-14 17:29 ?761次閱讀
    ROS是如何設(shè)計(jì)的 ROS<b class='flag-5'>客戶端</b>庫(kù)