在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    3030

    瀏覽量

    74109
  • 開發
    +關注

    關注

    0

    文章

    370

    瀏覽量

    40863
  • 數據庫
    +關注

    關注

    7

    文章

    3816

    瀏覽量

    64465
  • Redis
    +關注

    關注

    0

    文章

    376

    瀏覽量

    10884
收藏 人收藏

    評論

    相關推薦

    信號處理原理-簡易版

    信號處理原理-簡易版主要內容信號的分類與定義隨機信號與確定性信號連續信號與離散信號周期信號與非周期信號確定性信號的特性時間特性頻率特性時間與頻率的聯系確定性信號分析時域分析頻域分析隨機信號特性及分析 [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 ?2974次閱讀

    iOS淘寶客戶端應用名稱發生變化 Android客戶端應用名稱尚未更改

    iOS淘寶客戶端應用名稱發生變化 Android客戶端應用名稱尚未更改
    發表于 04-18 15:37 ?938次閱讀

    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 ?2677次閱讀

    ROS是如何設計的 ROS客戶端

    實現通信的代碼在ros_comm包中,如下。 其中clients文件夾一共有127個文件,看來是最大的包了。 現在我們來到了ROS最核心的地帶。 客戶端這個名詞出現的有些突然,一個機器人操作系統里
    的頭像 發表于 09-14 17:29 ?871次閱讀
    ROS是如何設計的 ROS<b class='flag-5'>客戶端</b>庫
    主站蜘蛛池模板: 春宵福利网站| 国产yw855.c免费视频| 夜夜se| 在线免费看黄的网站| 77788色淫视频免费观看| 日本69xxx18hd| 在线免费看影视网站| 五月婷婷激情综合| 91夜夜人人揉人人捏人人添| www一区| a天堂在线观看| 亚洲 美腿 欧美 偷拍| 日本特黄色大片| 欧美午夜大片| 激情亚洲综合网| 成年人黄色大片大全| 午夜在线免费观看视频| 色多多福利网站老司机| 99久久无色码中文字幕| 午夜大片网| 久久久久国产精品免费免费| 91网站网站网站在线| 在线观看亚洲一区| 在线免费观看一级毛片| 色亚洲色图| www.毛片网站| 2018国产一级天天弄| 日日爱网址| 男人日女人的网站| 绝色村妇的泛滥春情| 天堂综合| 久久青青成人亚洲精品| 97久久伊人精品影院| 久久久国产乱子伦精品| 亚洲欧美视频在线观看| 亚洲人成电影院| 六月婷婷视频| 天天拍夜夜添久久精品中文| 西西人体www303sw大胆高清| 99国产在线| 欧美日韩在线成人看片a|