最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python3與redis交互,保存的是字符串,取出來是bytes類型問題

 更新時(shí)間:2023年09月07日 09:15:01   作者:樂事原味~  
這篇文章主要介紹了Python3與redis交互,保存的是字符串,取出來是bytes類型問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,

Python3與redis交互,保存的是字符串,取出來是bytes

原因

在python3中redis連接包讀取數(shù)據(jù)默認(rèn)返回byte類型。

存進(jìn)去的是字符串類型的數(shù)據(jù),取出來卻是字節(jié)類型的。

Python2取出來的就是字符串類型的。

import platform
import redis
if "inux" in platform.system():
    print("檢測到是服務(wù)器環(huán)境,啟動(dòng)redis內(nèi)網(wǎng)鏈接")
    IP = "xxx.xx.x.xx"
    PORT = 6379
else:
    IP = "xxx.xxx.xxx.xx"
    PORT = 6379
# 存進(jìn)去的是字符串類型的數(shù)據(jù),取出來卻是字節(jié)類型的
redisPool1 = redis.ConnectionPool(host=IP, port=PORT, db=1, password="xxxxxxx")
if __name__ == '__main__':
    client = redis.Redis(connection_pool=redisPool1 )
    client.set("ACCESS_TOKEN", "ABC123456", 60 * 60)
    token = client.get("ACCESS_TOKEN")
    print(token)  # b'ABC123456'
    print(type(token))  # <class 'bytes'>

解決方法

連接redis的時(shí)候,加上decode_responses=True或者每次取出來都decode一下(太麻煩,不推薦)

import platform
import redis
if "inux" in platform.system():
    print("檢測到是服務(wù)器環(huán)境,啟動(dòng)redis內(nèi)網(wǎng)鏈接")
    IP = "xxx.xx.x.xx"
    PORT = 6379
else:
    IP = "xxx.xxx.xxx.xx"
    PORT = 6379
# 存進(jìn)去的是字符串類型的數(shù)據(jù),取出來也是字符型
redisPool1 = redis.ConnectionPool(host=IP, port=PORT, db=1, password="xxxxxxx", decode_responses=True)
if __name__ == '__main__':
    client = redis.Redis(connection_pool=redisPool1 )
    client.set("ACCESS_TOKEN", "ABC123456", 60 * 60)
    token = client.get("ACCESS_TOKEN")
    print(token)  # ABC123456
    print(type(token))  # <class 'str'>

Redis-Python交互:編碼、連接、基本命令

在redis-py 3.0之后就不在支持使用傳統(tǒng)的‘Redis’客戶端類了。

StrictRedis 現(xiàn)在只是 Redis 的一個(gè)別名,現(xiàn)在這個(gè)連接更加python化。

例如,使用redis的字符串操作 setbit 和 getbit 來統(tǒng)計(jì)用戶活躍天數(shù):

'''
用Redis統(tǒng)計(jì)用戶上線次數(shù)
理解:
A用戶 100010001000001  //活躍了4天
B用戶 111111111111111  //每日必到
'''
import redis
from ..password import redis_passwd
# 連接Redis,選擇 db0
r = redis.Redis(host='localhost', port=6379, password=redis_passwd, db=0)
# A用戶,一年中,每3天上線一次
for i in range(0, 365, 3):
    r.setbit('usera', i, 1)
# B用戶 每10天上線一次
for i in range(0, 365, 10):
    r.setbit('userb', i, 1)
# 用戶列表
# "Returns a list of keys matching ``pattern``"
userList = r.keys('user*')
print(userList)
Au = []
Nau = []
# 判斷是否為活躍用戶,(用戶,登錄天數(shù))
for u in userList:
    logincount = r.bitcount(u)
    if logincount > 100:
        Au.append((u, logincount))
    else:
        Nau.append((u, logincount))
for u in Au:
    print(f'用戶{u[0]}: 活躍用戶, 共登錄{u[1]}天')
for u in Nau:
    print(f'用戶{u[0]}: 非活躍用戶, 共登錄{u[1]}天')

編碼

PubSub對(duì)象遵循與其創(chuàng)建的客戶端實(shí)例相同的編碼方式。在發(fā)送到Redis之前,將使用客戶端上指定的字符集對(duì)任何使用unicode編碼的通道或模式進(jìn)行編碼。

如果客戶端的decode_responses標(biāo)志設(shè)置為False(默認(rèn)值),則消息字典中的channel,pattern和data值將是字節(jié)字符串(Python2的str,Python3的bytes)。

如果客戶端的decode_responses為True,則它們值將使用客戶端的字符集自動(dòng)解碼為unicode字符串。

默認(rèn),bytes類型:

>>> import redis
>>> r = redis.Redis(host='localhost', port=6379, password='***')
>>> r.set('str', 'time')
True
>>> ret = r.get('name')
>>> print(ret, type(ret))
b'Redis' <class 'bytes'>
>>> 

修改為str:

>>> import redis
>>> r = redis.Redis(host='localhost', port=6379, password='***', decode_responses=True)
>>> r.set('str', 'time')
True
>>> ret = r.get('name')
>>> print(ret, type(ret))
Redis <class 'str'>

默認(rèn)redis入庫編碼是utf-8,如果要修改的話,需要指明 charset和 decode_responsers 為True。

使用GBK編碼:

>>> r2 = redis.Redis(host='localhost', port=6379, password='***', charset='GBK' ,decode_responses=True)
>>> r2.set('greet', '你好')
True
>>> r2.get('greet')
'你好'

連接池

redis使用connection pool來管理對(duì)一個(gè)redis server 的所有連接,避免每次建立、釋放連接的開銷。

默認(rèn),每個(gè)Redis實(shí)例都會(huì)維護(hù)一個(gè)自己的連接池。

可以直接建立一個(gè)連接池,然后作為參數(shù)創(chuàng)建Redis實(shí)例,這樣就可以實(shí)現(xiàn)多個(gè)Redis實(shí)例共享一個(gè)連接池。

"""
連接池
"""
import redis
from ..password import redis_passwd
pool = redis.ConnectionPool(host='localhost', port=6379, db=0, password=redis_passwd)
r = redis.Redis(connection_pool=pool)
r.set('name', 'Redis')
print(r.get('name'))
# 輸出結(jié)果
b'Redis'

連接方式

ConnectionPools管理一組Connection實(shí)例。

redis-py有兩種類型的連接。默認(rèn)值連接方式是基于TCP套接字的常規(guī)連接。

UnixDomainSocketConnection允許在與服務(wù)器相同的設(shè)備上運(yùn)行的客戶端通過unix域套接字進(jìn)行連接。

要使用UnixDomainSocketConnection連接,只需將unix_socket_path參數(shù)傳遞給unix域套接字文件,該參數(shù)是一個(gè)字符串。

此外,請(qǐng)確保在redis.conf文件中定義了unixsocket參數(shù),默認(rèn)注釋掉了。

# Unix socket.
#
# Specify the path for the Unix socket that will be used to listen for
# incoming connections. There is no default, so Redis will not listen
# on a unix socket when not specified.
#
# unixsocket /var/run/redis/redis-server.sock
# unixsocketperm 700
>>> r = redis.Redis(unix_socket_path='/tmp/redis.sock')

操作

key操作

  • delete(self, *names):刪除鍵
  • dump(self, name):序列化給定 key ,并返回被序列化的值
  • exists(self, *names):檢查給定 key 是否存在。
  • expire(self, name, time):為給定 key 設(shè)置過期時(shí)間,以秒計(jì),time為整數(shù)Python timedelta 對(duì)象。
  • expireat(self, name, when):EXPIREAT 的作用和 EXPIRE 類似,都用于為 key 設(shè)置過期時(shí)間。 不同在于 EXPIREAT 命令接受的時(shí)間參數(shù)是 UNIX 時(shí)間戳(unix timestamp)或python datetime對(duì)象
  • pexpire(self, name, time):類似expire, 時(shí)間以毫秒計(jì)
  • pexpireat(self, name, when):類似expireat, 時(shí)間以毫秒計(jì)
  • keys(self, pattern=’*’):查找所有符合給定模式( pattern)的 key
  • move(self, name, db):將當(dāng)前數(shù)據(jù)庫的 key 移動(dòng)到給定的數(shù)據(jù)庫 db 當(dāng)中
  • persist(self, name):移除 key 的過期時(shí)間,key 將持久保持。
  • pttl(self, name):以毫秒為單位返回 key 的剩余的過期時(shí)間
  • ttl(self, name):以秒為單位,返回給定 key 的剩余生存時(shí)間(TTL, time to live)
  • randomkey(self):從當(dāng)前數(shù)據(jù)庫中隨機(jī)返回一個(gè) key
  • rename(self, src, dst):修改 key 的名稱
  • renamenx(self, src, dst):當(dāng)dst不存在時(shí),可以使用它作為src的名字
  • type(self, name):返回 key 所儲(chǔ)存的值的類型

服務(wù)器操作

  • bgrewriteaof(self):異步執(zhí)行一個(gè) AOF(AppendOnly File) 文件重寫操作
  • bgsave(self):在后臺(tái)異步保存當(dāng)前數(shù)據(jù)庫的數(shù)據(jù)到磁盤
  • client_kill(self, address):關(guān)閉客戶端連接
  • client_list(self, _type=None):獲取連接到服務(wù)器的客戶端連接列表
  • client_getname(self):獲取連接的名稱
  • client_id(self):獲取當(dāng)前連接的id
  • client_setname(self, name):設(shè)置當(dāng)前連接的名稱
  • client_pause(self, timeout):在指定時(shí)間內(nèi)終止運(yùn)行來自客戶端的命令(毫秒)
  • client_unblock(self, client_id, error=False):解除指定連接id的客戶端阻塞
  • config_get, config_set,config_rewrite:讀寫redis.conf配置文件
  • config_resetstat(self):重置 INFO 命令中的某些統(tǒng)計(jì)數(shù)據(jù)
  • dbsize(self):返回當(dāng)前數(shù)據(jù)庫的 key 的數(shù)量
  • debug_object(self, key):獲取 key 的調(diào)試信息
  • echo(self, value):打印字符串
  • flushall(self, asynchronous=False):清空所有數(shù)據(jù)庫
  • flushdb(self, asynchronous=False):清空當(dāng)前數(shù)據(jù)庫
  • info(self, section=None):獲取 Redis 服務(wù)器的各種信息和統(tǒng)計(jì)數(shù)值
  • lastsave(self):返回最近一次 Redis 成功將數(shù)據(jù)保存到磁盤上的時(shí)間,以 UNIX 時(shí)間戳格式表示

save(self):同步保存數(shù)據(jù)到硬盤

  • ping(self):查看服務(wù)是否運(yùn)行
  • migrate(self, host, port, keys, destination_db, timeout,copy=False, replace=False, auth=None): 數(shù)據(jù)庫遷移
  • shutdown(self, save=False, nosave=False):異步保存數(shù)據(jù)到硬盤,并關(guān)閉服務(wù)器
  • slaveof(self, host=None, port=None):將當(dāng)前服務(wù)器轉(zhuǎn)變?yōu)橹付ǚ?wù)器的從屬服務(wù)器(slave server)
  • slowlog_get(self, num=None):管理 redis 的慢日志
  • wait(self, num_replicas, timeout):Redis同步復(fù)制

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何原位刪除python字典的key簡單示例

    如何原位刪除python字典的key簡單示例

    這篇文章主要介紹了如何原位刪除python字典的key的相關(guān)資料,為了避免在遍歷字典時(shí)修改其結(jié)構(gòu)導(dǎo)致的運(yùn)行時(shí)錯(cuò)誤,可以使用list(dic.items())創(chuàng)建鍵的副本,然后遍歷這個(gè)副本進(jìn)行刪除操作,需要的朋友可以參考下
    2025-05-05
  • Python自動(dòng)化操控鼠標(biāo)的零基礎(chǔ)完全指南

    Python自動(dòng)化操控鼠標(biāo)的零基礎(chǔ)完全指南

    在日常的電腦使用中,我們經(jīng)常會(huì)遇到大量重復(fù)性的鼠標(biāo)操作,通過使用?Python?腳本,你可以讓電腦自動(dòng)、精準(zhǔn)地移動(dòng)鼠標(biāo)、執(zhí)行點(diǎn)擊甚至滾動(dòng)頁面,本篇指南將帶你從零開始,系統(tǒng)地學(xué)習(xí)如何使用?Python?操控你的鼠標(biāo),開啟桌面自動(dòng)化的第一步
    2026-04-04
  • 使用Python實(shí)現(xiàn)屏幕截圖的兩種方法

    使用Python實(shí)現(xiàn)屏幕截圖的兩種方法

    Python作為一種高效的編程語言,可以通過一些庫來實(shí)現(xiàn)對(duì)屏幕的截圖操作,本文主要介紹了使用Python實(shí)現(xiàn)屏幕截圖的兩種方法,具有一定的 參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • Python 實(shí)現(xiàn)自動(dòng)完成A4標(biāo)簽排版打印功能

    Python 實(shí)現(xiàn)自動(dòng)完成A4標(biāo)簽排版打印功能

    這篇文章主要介紹了Python 實(shí)現(xiàn)自動(dòng)完成A4標(biāo)簽排版打印功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python中selenium操作下拉滾動(dòng)條的幾種方法匯總

    python中selenium操作下拉滾動(dòng)條的幾種方法匯總

    這篇文章主要介紹了python中selenium操作下拉滾動(dòng)條的幾種方法匯總,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python中自定義with的具體使用

    python中自定義with的具體使用

    在 Python 中,with?語句用于簡化資源管理,它保證在執(zhí)行完代碼塊后正確地釋放資源,通過__enter__和__exit__魔術(shù)方法實(shí)現(xiàn),本文就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2024-09-09
  • Python使用tkinter編寫一個(gè)高效倒計(jì)時(shí)番茄鐘

    Python使用tkinter編寫一個(gè)高效倒計(jì)時(shí)番茄鐘

    這篇文章主要為大家詳細(xì)介紹了如何使用Python的tkinter庫實(shí)現(xiàn)一個(gè)可視化番茄鐘,包含倒計(jì)時(shí)顯示以及工作,休息狀態(tài)切換等功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2026-01-01
  • 使用python實(shí)現(xiàn)讀取文件夾中所有excel

    使用python實(shí)現(xiàn)讀取文件夾中所有excel

    相信很多坐在辦公室上班的朋友每天都需要處理大量的數(shù)據(jù),本文我們就來看看如何使用Openpyxl讀取文件夾下所有Excel文檔中的數(shù)據(jù),文中示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2025-12-12
  • 使用Python對(duì)Dicom文件進(jìn)行讀取與寫入的實(shí)現(xiàn)

    使用Python對(duì)Dicom文件進(jìn)行讀取與寫入的實(shí)現(xiàn)

    這篇文章主要介紹了使用Python對(duì)Dicom文件進(jìn)行讀取與寫入的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Python打印異常信息的方法示例詳解

    Python打印異常信息的方法示例詳解

    在 Python 編程中,異常是指程序執(zhí)行過程中出現(xiàn)的錯(cuò)誤或異常情況,當(dāng)程序遇到異常時(shí),為了更好地調(diào)試和定位問題,我們需要打印異常信息,本文將詳細(xì)介紹如何在 Python 中打印異常,并提供一些示例和注意事項(xiàng),需要的朋友可以參考下
    2023-12-12

最新評(píng)論

军事| 枝江市| 台前县| 沁源县| 文安县| 石景山区| 凤冈县| 乐安县| 康平县| 宿迁市| 西乡县| 隆化县| 沅江市| 康定县| 沿河| 兴和县| 平阳县| 丽江市| 榕江县| 高台县| 绥宁县| 旅游| 湖南省| 鞍山市| 化州市| 葫芦岛市| 天峻县| 杭州市| 蕲春县| 堆龙德庆县| 探索| 乾安县| 钟山县| 彩票| 东光县| 瓦房店市| 嵊州市| 洛阳市| 武陟县| 调兵山市| 新建县|