<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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,就不會再遇到白名單的限制了。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內存
    +關注

    關注

    8

    文章

    2790

    瀏覽量

    72954
  • 開發
    +關注

    關注

    0

    文章

    351

    瀏覽量

    40651
  • 數據庫
    +關注

    關注

    7

    文章

    3618

    瀏覽量

    63630
  • Redis
    +關注

    關注

    0

    文章

    365

    瀏覽量

    10539
收藏 人收藏

    評論

    相關推薦

    信號處理原理-簡易版

    信號處理原理-簡易版主要內容信號的分類與定義隨機信號與確定性信號連續信號與離散信號周期信號與非周期信號確定性信號的特性時間特性頻率特性時間與頻率的聯系確定性信號分析時域分析頻域分析隨機信號特性及分析 [hide][/hide]
    發表于 11-04 10:16

    labview TCP客戶端

    最近在做一個labview 客戶端測試小程序,服務器采用MFC編寫,客戶端采用TCP偵聽函數,通信可以連接,數據也正確,但是服務器檢測發送判斷失敗,個人推測是不是客戶端建立連接后關閉
    發表于 06-30 23:15

    一個服務器,多個客戶端,怎么向指定的客戶端發數據

    我用labview做服務器,單片機做客戶端,客戶端幾百個,怎么區分客戶端,給指定的客戶發發數據
    發表于 06-01 09:26

    阿里云專訪Redisson作者Rui Gu:構建開源企業級Redis客戶端之路

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

    TCP通信時服務如何接收客戶端的數據?

    畢設采用的是TCP協議,組員做的是下位機,C編程,WiFi模塊工作處于客戶端。我負責上位機,Labview使用tcp協議時服務怎么接收客戶端的數據呢? 我找到的例程都是服務發、
    發表于 04-14 14:49

    如何使用Socket實現UDP客戶端?

    本教程介紹了如何利用socket 編程來實現一個 UDP 客戶端,與服務器進行通信。與開發 TCP 客戶端一樣,我們先將 socket 編程的流程列出來,然后給出具體的實例。
    發表于 03-30 07:39

    如何去制作一個簡易版的計算器

    小伙伴,上周參考了好多單片機計算器的文章,但是全文閱讀基本都是付費,好了幾遍參考了幾個思路,外加周末讓我老公幫忙調式,終于完成了一個簡易版的計算器;1.8位數碼管顯示2.簡單的四則運算(加減乘除
    發表于 07-15 09:01

    線程多客戶端設置

    客戶端設置,每個客戶端與服務器可視為一個線程。利用多線程在ucosiii下設置。一個線程設置服務器,一個線程創建客戶端(可多次創建),一個線程管理客戶端的連接與斷開。通訊管理還需要改
    發表于 08-24 06:08

    Labview客戶端狀態獲取

    求助,目前只有5積分,哪位大佬給點幫助:采用TCP傳輸數據,一個服務器多個客戶端,通過一個按鈕控制,點動按鈕將服務器中的一個文件發給4個客戶端,目前已實現發送文件和讀取連接客戶端數量,不過客戶
    發表于 11-15 15:02

    監控系統客戶端及服務設計

    項目開發報告1 項目簡介1.1 概述1.2 開發環境1.3 其他支持1.4 應用界面1.4.1 服務器1.4.2 客戶端1.5 程序使用2 項目開發2.1 搭建基于實驗平臺數據庫2.1.1 數據庫
    發表于 12-21 07:02

    ch579客戶端如何給設備命名?

    用CH579制作的設備,開啟DHCP后,已自動獲得了配置信息,在路由器的DHCP客戶端列表當中已經存在,只是客戶端名顯示為Unknown。請問如何給設備命名?求解答
    發表于 10-14 07:17

    客戶端初始化后是否可以從客戶端句柄中獲取客戶端配置呢?

    客戶端初始化后是否可以從客戶端句柄中獲取客戶端配置?例如:代碼:char name[] = "example";esp_http_client_config_t cfg
    發表于 03-02 06:58

    當WiFi信號變低時,服務器和客戶端之間的TCP通信丟失,如何使客戶端重新連接?

    大家好, 當 WiFi 信號變低時,服務器和客戶端之間的 TCP 通信丟失,比如超過 -80dBm。一旦客戶端斷開連接,它就無法重新連接并正常進行通信。如何讓客戶端在這里重新連接。
    發表于 05-15 07:31

    AT32基于FreeRTOS的AWS MQTT客戶端

    AT32基于FreeRTOS的AWS MQTT客戶端建立一個MQTT客戶端與 AWS IoT Core進行通訊,用戶可以基于這個范例去開發屬于自己的應用。
    發表于 10-26 06:03

    單片機實現簡易版shell的方法和原理

    單片機實現簡易版shell的方法和原理
    發表于 11-26 09:36 ?0次下載
    單片機實現<b class='flag-5'>簡易版</b>shell的方法和原理
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>