搜尋
首頁資料庫RedisPython Redis資料處理的方法

Python Redis資料處理的方法

Jun 02, 2023 pm 08:19 PM
pythonredis

1. 前言

Redis:Remote Dictionary Server,即:遠端字典服務,Redis 底層使用C 語言編寫,是一款開源的、基於記憶體的 NoSql 資料庫

#由於Redis效能遠超其他資料庫,並且支援叢集、分散式及主從同步等優勢,所以常用於 快取資料、高速讀寫 等場景

2. 準備

我們以在雲端伺服器Centos 7.8 安裝Redis-Server 為例

首先,安裝在雲端伺服器上Redis 資料庫

# 下载epel仓库
yum install epel-release

# 安装redis
yum install redis

然後,透過vim 指令修改Redis 設定文件,開啟遠端連接,設定連接密碼

設定檔目錄:/etc/redis.conf

  • bind 改為0.0.0.0,容許外網存取

  • requirepass設定一個存取密碼

# vim /etc/redis.conf
# 1、bing从127.0.0.1修改为:0.0.0.0,开放远程连接
bind 0.0.0.0 

# 2、设置密码
requirepass 123456

需要指出的是,為了確保雲端伺服器資料安全,Redis 開放遠端存取的時候,一定要加強密碼

接著,啟動Redis服務,開啟防火牆和端口,配置雲端伺服器安全群組

預設情況下,Redis 服務使用的連接埠號碼是 6379

另外,需要在雲端伺服器安全群組進行配置,確保Redis 資料庫能正常連線

# 启动Redis服务,默认redis端口号是6379
systemctl start redis 

# 打开防火墙
systemctl start firewalld.service

# 开放6379端口
firewall-cmd --zone=public --add-port=6379/tcp --permanent   

# 配置立即生效
firewall-cmd --reload

完成以上操作,我們就可以透過Redis-CLI 或Redis 用戶端工具進行連接了

最後,要使用Python 操作 Redis,我們需要使用pip 安裝一個依賴

# 安装依赖,便于操作redis
pip3 install redis

3. 實戰

在操作Redis 中的資料之前,我們需要利用 Host、連接埠號碼、密碼實例化一個Redis 連線物件

from redis import Redis

class RedisF(object):

    def __init__(self):
        # 实例化Redis对象
        # decode_responses=True,如果不加则写入的为字节类型
        # host:远程连接地址
        # port:Redis端口号
        # password:Redis授权密码
        self.redis_obj = Redis(host='139.199.**.**',port=6379,password='123456',decode_responses=True,charset='UTF-8', encoding='UTF-8')

接下來我們以操作字串、清單、set 集合、zset 集合、雜湊表、事務為例,講講Python 操作這些資料的方法

1、字串運算

操作字串有兩種方式,操作方法分別是:set() 和 mset()

其中:set() 一次只能儲存一個值,參數意義如下

  • name: key,代表鍵

  • value:value,待保存的值

  • ex:過期時間,以秒為單位,如果不設定,則永久不過期;否則,過期則刪除

  • px:過期時間,以毫秒為單位

  • nx/xx:set 運算是否執行與name 鍵是否存在有關

Python Redis数据处理的方法

取得值與刪除值的操作方法分別為:get(Key)、 delete(Key or Keys)

# set():单字符串操作
# 添加一个值,并设置超时时间为120s
 self.redis_obj.set('name', 'airpython', ex=120)

# get():获取这个值
print(self.redis_obj.get('name'))

# delete():删除一个值或多个值
self.redis_obj.delete('name')
print(self.redis_obj.get('name'))

對於多值資料的設置,只需要調用mset() 方法,將待插入的資料以鍵值對組成一個字典作為參數即可

同理,Redis 提供了mget()方法,可以一次獲取多個鍵的值

# mset():设置多个值
self.redis_obj.mset({"foo": "foo1", "zoo": "zoo1"})

# mget():获取多个值
result = self.redis_obj.mget("foo", "zoo")
print(result)

2、列表操作

Redis 提供了很多方法用於操作列表,其中比較常見的如下:

  • lpush/rpush:將一個值或多個值插入到列表頭部或尾部,其中,lpush 代表頭部插入;rpush 代表尾部插入資料

  • lset:透過索引,將值插入到清單對應的位置

  • linsert:在清單元素前面或後面插入資料

  • ##lindex :透過索引取得清單中的某一個元素,其中,0 代表第一個元素;-1 代表最後一個元素

  • lrange:透過制定起始位置和結束位置,從清單中取得指定區域的值

  • llen:取得清單的長度,如果Key 對應的清單不存在,回傳0

  • ##lpop:移除並傳回清單中的第一個元素
  • rpop:移除並傳回清單中的最後一個元素
  • 實例程式碼如下:
def manage_list(self):
    """
    操作列表
    :return:
    """
    # 1、新增一个列表,并左边插入一个数据
    # 注意:可以一次加入多个元素,也可以一个个元素的加入
    self.redis_obj.lpush('company', '阿里', '腾讯', '百度')

    # 2、移除第一个元素
    self.redis_obj.lpop("company")

    # 3、右边插入数据
    self.redis_obj.rpush('company', '字节跳动', '小米')

    # 4、移除最后一个元素
    self.redis_obj.rpop("company")

    # 5、获取列表的长度
    self.redis_obj.llen("company")

    # 6、通过索引,获取列表中的某一个元素(第二个元素)
    print('列表中第二个元素是:', self.redis_obj.lindex("company", 1))

    # 7、根据范围,查看列表中所有的值
    print(self.redis_obj.lrange('company', 0, -1))

3、運算Set 集合

Set 是無序的元素集合,集合中的元素不能重複,Redis 同樣提供了許多方法,以便操作Set 集合

#其中,比較常用的方法如下:

    sadd:新增元素到集合中,已經存在集合中的元素將被忽略,如果集合不存在,則新建一個集合
  • scard:傳回集合元素的數量
  • smembers:傳回集合中所有元素
  • srem :移除集合中一個或多個元素,如果元素不存在則忽略
  • sinter:傳回兩個集合的交集,結果仍然是一個集合
  • #sunion:傳回兩個集合的並集
  • sdiff:以第一個集合參數為標準,傳回兩個集合的差集
  • #sunionstore:計算兩個集合的並集,儲存到一個新的集合中
  • #sismember:判斷集合中是否存在某個元素
  • spop:隨機刪除集合中的一個元素,並傳回
  • #具體實例程式碼如下:
def manage_set(self):
    """
    操作set集合
    :return:
    """
    self.redis_obj.delete("fruit")

    # 1、sadd:新增元素到集合中
    # 添加一个元素:香蕉
    self.redis_obj.sadd('fruit', '香蕉')

    # 再添加两个元素
    self.redis_obj.sadd('fruit', '苹果', '桔子')

    # 2、集合元素的数量
    print('集合元素数量:', self.redis_obj.scard('fruit'))

    # 3、移除一个元素
    self.redis_obj.srem("fruit", "桔子")

    # 再定义一个集合
    self.redis_obj.sadd("fruit_other", "香蕉", "葡萄", "柚子")

    # 4、获取两个集合的交集
    result = self.redis_obj.sinter("fruit", "fruit_other")
    print(type(result))
    print('交集为:', result)

    # 5、获取两个集合的并集
    result = self.redis_obj.sunion("fruit", "fruit_other")
    print(type(result))
    print('并集为:', result)

    # 6、差集,以第一个集合为标准
    result = self.redis_obj.sdiff("fruit", "fruit_other")
    print(type(result))
    print('差集为:', result)

    # 7、合并保存到新的集合中
    self.redis_obj.sunionstore("fruit_new", "fruit", "fruit_other")
    print('新的集合为:', self.redis_obj.smembers('fruit_new'))

    # 8、判断元素是否存在集合中
    result = self.redis_obj.sismember("fruit", "苹果")
    print('苹果是否存在于集合中', result)

    # 9、随机从集合中删除一个元素,然后返回
    result = self.redis_obj.spop("fruit")
    print('删除的元素是:', result)

    # 3、集合中所有元素
    result = self.redis_obj.smembers('fruit')

    print("最后fruit集合包含的元素是:", result)

4、操作zset 集合

zset 集合比較普通set 集合,是有序的,zset 集合中的元素包含:值和分數,其中分數用於排序

其中,比较常用的方法如下:

  • zadd:往集合中新增元素,如果集合不存在,则新建一个集合,然后再插入数据

  • zrange:通过起始点和结束点,返回集合中的元素值(不包含分数);如果设置withscores=True,则返回结果会带上分数

  • zscore:获取某一个元素对应的分数

  • zcard:获取集合中元素个数

  • zrank:获取元素在集合中的索引

  • zrem:删除集合中的元素

  • zcount:通过最小值和最大值,判断分数在这个范围内的元素个数

实践代码如下:

def manage_zset(self):
    """
    操作zset集合
    :return:
    """
    self.redis_obj.delete("fruit")

    # 往集合中新增元素:zadd()
    # 三个元素分别是:"banana", 1/"apple", 2/"pear", 3
    self.redis_obj.zadd("fruit", "banana", 1, "apple", 2, "pear", 3)

    # 查看集合中所有元素(不带分数)
    result = self.redis_obj.zrange("fruit", 0, -1)
    # ['banana', 'apple', 'pear']
    print('集合中的元素(不带分数)有:', result)

    # 查看集合中所有元素(带分数)
    result = self.redis_obj.zrange("fruit", 0, -1, withscores=True)
    # [('banana', 1.0), ('apple', 2.0), ('pear', 3.0)]
    print('集合中的元素(带分数)有:', result)

    # 获取集合中某一个元素的分数
    result = self.redis_obj.zscore("fruit", "apple")
    print("apple对应的分数为:", result)

    # 通过最小值和最大值,判断分数在这个范围内的元素个数
    result = self.redis_obj.zcount("fruit", 1, 2)
    print("集合中分数大于1,小于2的元素个数有:", result)

    # 获取集合中元素个数
    count = self.redis_obj.zcard("fruit")
    print('集合元素格式:', count)

    # 获取元素的值获取索引号
    index = self.redis_obj.zrank("fruit", "apple")
    print('apple元素的索引为:', index)

    # 删除集合中的元素:zrem
    self.redis_obj.zrem("fruit", "apple")
    print('删除apple元素后,剩余元素为:', self.redis_obj.zrange("fruit", 0, -1))

4、操作哈希

哈希表中包含很多键值对,并且每一个键都是唯一的

Redis 操作哈希表,下面这些方法比较常用:

  • hset:往哈希表中添加一个键值对值

  • hmset:往哈希表中添加多个键值对值

  • hget:获取哈希表中单个键的值

  • hmget:获取哈希表中多个键的值列表

  • hgetall:获取哈希表中种所有的键值对

  • hkeys:获取哈希表中所有的键列表

  • hvals:获取哈表表中所有的值列表

  • hexists:判断哈希表中,某个键是否存在

  • hdel:删除哈希表中某一个键值对

  • hlen:返回哈希表中键值对个数

对应的操作代码如下:

def manage_hash(self):
    """
    操作哈希表
    哈希:一个键对应一个值,并且键不容许重复
    :return:
    """
    self.redis_obj.delete("website")

    # 1、新建一个key为website的哈希表
    # 往里面加入数据:baidu(field),www.baidu.com(value)
    self.redis_obj.hset('website', 'baidu', 'www.alibababaidu.com')
    self.redis_obj.hset('website', 'google', 'www.google.com')

    # 2、往哈希表中添加多个键值对
    self.redis_obj.hmset("website", {"tencent": "www.qq.com", "alibaba": "www.taobao.com"})

    # 3、获取某一个键的值
    result = self.redis_obj.hget("website", 'baidu')
    print("键为baidu的值为:", result)

    # 4、获取多个键的值
    result = self.redis_obj.hmget("website", "baidu", "alibaba")
    print("多个键的值为:", result)

    # 5、查看hash表中的所有值
    result = self.redis_obj.hgetall('website')
    print("哈希表中所有的键值对为:", result)

    # 6、哈希表中所有键列表
    # ['baidu', 'google', 'tencent', 'alibaba']
    result = self.redis_obj.hkeys("website")
    print("哈希表,所有的键(列表)为:", result)

    # 7、哈希表中所有的值列表
    # ['www.alibababaidu.com', 'www.google.com', 'www.qq.com', 'www.taobao.com']
    result = self.redis_obj.hvals("website")
    print("哈希表,所有的值(列表)为:", result)

    # 8、判断某一个键是否存在
    result = self.redis_obj.hexists("website", "alibaba")
    print('alibaba这个键是否存在:', result)

    # 9、删除某一个键值对
    self.redis_obj.hdel("website", 'baidu')
    print('删除baidu键值对后,哈希表的数据包含:', self.redis_obj.hgetall('website'))

    # 10、哈希表中键值对个数
    count = self.redis_obj.hlen("website")
    print('哈希表键值对一共有:', count)

5、操作事务管道

Redis 支持事务管道操作,能够将几个操作统一提交执行

操作步骤是:

  • 首先,定义一个事务管道

  • 然后通过事务对象去执行一系列操作

  • 提交事务操作,结束事务操作

下面通过一个简单的例子来说明:

def manage_steps(self):
    """
    执行事务操作
    :return:
    """
    # 1、定义一个事务管道
    self.pip = self.redis_obj.pipeline()

    # 定义一系列操作
    self.pip.set('age', 18)

    # 增加一岁
    self.pip.incr('age')

    # 减少一岁
    self.pip.decr('age')

    # 执行上面定义3个步骤的事务操作
    self.pip.execute()

    # 判断
    print('通过上面一些列操作,年龄变成:', self.redis_obj.get('age'))

以上是Python Redis資料處理的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
REDIS與SQL數據庫:關鍵差異REDIS與SQL數據庫:關鍵差異Apr 25, 2025 am 12:02 AM

Redis和SQL數據庫的主要區別在於:Redis是內存數據庫,適用於高性能和靈活性需求;SQL數據庫是關係型數據庫,適用於復雜查詢和數據一致性需求。具體來說,1)Redis提供高速數據訪問和緩存服務,支持多種數據類型,適用於緩存和實時數據處理;2)SQL數據庫通過表格結構管理數據,支持複雜查詢和事務處理,適用於電商和金融系統等需要數據一致性的場景。

REDIS:它如何充當數據存儲和服務REDIS:它如何充當數據存儲和服務Apr 24, 2025 am 12:08 AM

REDISACTSASBOTHADATASTOREANDASERVICE.1)ASADATASTORE,ITUSESIN-MEMORYSTOOGATOFORFOFFASTESITION,支持VariousDatharptructuresLikeKey-valuepairsandsortedsetsetsetsetsetsetsets.2)asaservice,ItprovidespunctionslikeItionitionslikepunikeLikePublikePublikePlikePlikePlikeAndluikeAndluAascriptingiationsmpleplepleclexplectiations

REDIS與其他數據庫:比較分析REDIS與其他數據庫:比較分析Apr 23, 2025 am 12:16 AM

Redis與其他數據庫相比,具有以下獨特優勢:1)速度極快,讀寫操作通常在微秒級別;2)支持豐富的數據結構和操作;3)靈活的使用場景,如緩存、計數器和發布訂閱。選擇Redis還是其他數據庫需根據具體需求和場景,Redis在高性能、低延遲應用中表現出色。

REDIS的角色:探索數據存儲和管理功能REDIS的角色:探索數據存儲和管理功能Apr 22, 2025 am 12:10 AM

Redis在數據存儲和管理中扮演著關鍵角色,通過其多種數據結構和持久化機製成為現代應用的核心。 1)Redis支持字符串、列表、集合、有序集合和哈希表等數據結構,適用於緩存和復雜業務邏輯。 2)通過RDB和AOF兩種持久化方式,Redis確保數據的可靠存儲和快速恢復。

REDIS:了解NOSQL概念REDIS:了解NOSQL概念Apr 21, 2025 am 12:04 AM

Redis是一種NoSQL數據庫,適用於大規模數據的高效存儲和訪問。 1.Redis是開源的內存數據結構存儲系統,支持多種數據結構。 2.它提供極快的讀寫速度,適合緩存、會話管理等。 3.Redis支持持久化,通過RDB和AOF方式確保數據安全。 4.使用示例包括基本的鍵值對操作和高級的集合去重功能。 5.常見錯誤包括連接問題、數據類型不匹配和內存溢出,需注意調試。 6.性能優化建議包括選擇合適的數據結構和設置內存淘汰策略。

REDIS:現實世界的用例和示例REDIS:現實世界的用例和示例Apr 20, 2025 am 12:06 AM

Redis在現實世界中的應用包括:1.作為緩存系統加速數據庫查詢,2.存儲Web應用的會話數據,3.實現實時排行榜,4.作為消息隊列簡化消息傳遞。 Redis的多功能性和高性能使其在這些場景中大放異彩。

REDIS:探索其功能和功能REDIS:探索其功能和功能Apr 19, 2025 am 12:04 AM

Redis脫穎而出是因為其高速、多功能性和豐富的數據結構。 1)Redis支持字符串、列表、集合、散列和有序集合等數據結構。 2)它通過內存存儲數據,支持RDB和AOF持久化。 3)從Redis6.0開始引入多線程處理I/O操作,提升了高並發場景下的性能。

Redis是SQL還是NOSQL數據庫?答案解釋了Redis是SQL還是NOSQL數據庫?答案解釋了Apr 18, 2025 am 12:11 AM

RedisisclassifiedasaNoSQLdatabasebecauseitusesakey-valuedatamodelinsteadofthetraditionalrelationaldatabasemodel.Itoffersspeedandflexibility,makingitidealforreal-timeapplicationsandcaching,butitmaynotbesuitableforscenariosrequiringstrictdataintegrityo

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器