色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    3019

    瀏覽量

    74005
  • 開發
    +關注

    關注

    0

    文章

    370

    瀏覽量

    40836
  • 數據庫
    +關注

    關注

    7

    文章

    3794

    瀏覽量

    64362
  • Redis
    +關注

    關注

    0

    文章

    374

    瀏覽量

    10871
收藏 人收藏

    評論

    相關推薦

    信號處理原理-簡易版

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

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

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

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

    ROS是如何設計的 ROS客戶端

    實現通信的代碼在ros_comm包中,如下。 其中clients文件夾一共有127個文件,看來是最大的包了。 現在我們來到了ROS最核心的地帶。 客戶端這個名詞出現的有些突然,一個機器人操作系統里
    的頭像 發表于 09-14 17:29 ?862次閱讀
    ROS是如何設計的 ROS<b class='flag-5'>客戶端</b>庫
    主站蜘蛛池模板: 国产亚洲精品久久久999密臂 | 成人免费观看国产高清| 中文有码中文字幕免费视频 | 玄幻全黄h全肉后宫| 色99蜜臀AV无码| 色偷偷网址| 特黄大片aaaaa毛片| 婷婷六月激情综合一区| 午夜理论片日本中文在线| 午夜十八岁禁| 一区一区三区产品| 18和谐综合色区| 99riav9 精品香蕉免费大视频| A级超碰视频在线观看| xnxx18美女| 国产特级毛片AAAAAAA高清| 火影忍者高清无码黄漫| 久久精品美女久久| 欧美无码专区| 亚洲成av人影院| 99久久就热视频精品草| 国产精品久久久久婷婷五月色| 国产亚洲精品黑人粗大精选| 久久久久999| 日本不卡三卡四卡| 亚洲欧洲日韩天堂无吗| av天堂电影网在线观看| 国产精品观看视频免费完整版 | 九九免费的视频| 欧美九十老太另类| 亚洲人成在线播放网站岛国| 97精品视频在线观看| 国产美女影院| 欧美日韩亚洲中字二区| 亚洲欧美综合乱码精品成人网| 99麻豆精品国产人妻无码| 国色精品VA在线观看免费视频| 美女撒尿无遮挡免费中国| 亚洲AV无码乱码国产麻豆穿越| 99久久99久久久99精品齐| 国产亚洲精品久久久999无毒|