<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          最全總結(jié) | 聊聊 Python 數(shù)據(jù)處理全家桶(Redis篇)

          共 8334字,需瀏覽 17分鐘

           ·

          2020-09-23 14:14


          點(diǎn)擊上方“AirPython”,選擇“加為星標(biāo)

          第一時(shí)間關(guān)注 Python 技術(shù)干貨!


          1. 前言

          前面兩篇文章聊到了 Python 處理 Mysql、Sqlite 數(shù)據(jù)庫常用方式,本篇文章繼續(xù)說另外一種比較常用的數(shù)據(jù)存儲(chǔ)方式:Redis

          Redis:Remote Dictionary Server,即:遠(yuǎn)程字典服務(wù),Redis 底層使用 C 語言編寫,是一款開源的、基于內(nèi)存的 NoSql 數(shù)據(jù)庫

          由于 Redis 性能遠(yuǎn)超其他數(shù)據(jù)庫,并且支持集群、分布式及主從同步等優(yōu)勢(shì),所以經(jīng)常用于?緩存數(shù)據(jù)、高速讀寫?等場(chǎng)景

          本篇文章就聊聊 Python 操作?Redis 正確的姿勢(shì)

          2. 準(zhǔn)備

          我們以在云服務(wù)器 Centos 7.8?安裝 Redis-Server 為例

          首先,安裝在云服務(wù)器上 Redis 數(shù)據(jù)庫

          #?下載epel倉庫
          yum?install?epel-release

          #?安裝redis
          yum?install?redis

          然后,通過 vim 命令修改 Redis 配置文件,打開遠(yuǎn)程連接,設(shè)置連接密碼

          配置文件目錄:/etc/redis.conf

          • bind 更改為 0.0.0.0,容許外網(wǎng)訪問

          • requirepass 設(shè)置一個(gè)訪問密碼

          #?vim?/etc/redis.conf
          #?1、bing從127.0.0.1修改為:0.0.0.0,開放遠(yuǎn)程連接
          bind?0.0.0.0?

          #?2、設(shè)置密碼
          requirepass?123456?

          需要指出的是,為了保證云服務(wù)器數(shù)據(jù)安全,Redis 開放遠(yuǎn)程訪問的時(shí)候,一定要加強(qiáng)密碼

          接著,啟動(dòng) Redis 服務(wù),開啟防火墻和端口,配置云服務(wù)器安全組

          默認(rèn)情況下,Redis 服務(wù)使用的端口號(hào)是 6379

          另外,需要在云服務(wù)器安全組進(jìn)行配置,保證 Redis 數(shù)據(jù)庫能正常連接

          #?啟動(dòng)Redis服務(wù),默認(rèn)redis端口號(hào)是6379
          systemctl?start?redis?

          #?打開防火墻
          systemctl?start?firewalld.service

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

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

          完成以上操作,我們就可以通過 Redis-CLI 或 Redis 客戶端工具進(jìn)行連接了

          最后,要使用 Python 操作?Redis,我們需要使用 pip 安裝一個(gè)依賴

          #?安裝依賴,便于操作redis
          pip3?install?redis??

          3. 實(shí)戰(zhàn)

          在操作 Redis 中的數(shù)據(jù)之前,我們需要利用?Host、端口號(hào)、密碼實(shí)例化一個(gè) Redis 連接對(duì)象

          from?redis?import?Redis

          class?RedisF(object):

          ????def?__init__(self):
          ????????#?實(shí)例化Redis對(duì)象
          ????????#?decode_responses=True,如果不加則寫入的為字節(jié)類型
          ????????# host:遠(yuǎn)程連接地址
          ????????# port:Redis端口號(hào)
          ????????# password:Redis授權(quán)密碼
          ????????self.redis_obj?=?Redis(host='139.199.**.**',port=6379,password='123456',decode_responses=True,charset='UTF-8',?encoding='UTF-8')

          接下來我們以操作字符串、列表、set 集合、zset 集合、哈希表、事務(wù)為例,講講 Python 操作這些數(shù)據(jù)的方法

          1、字符串操作

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

          其中:set() 一次只能保存一個(gè)值,參數(shù)意義如下

          • name:key,代表鍵

          • value:value,待保存的值

          • ex:過期時(shí)間,以秒為單位,如果不設(shè)置,則永久不過期;否則,過期則刪除

          • px:過期時(shí)間,以毫秒為單位

          • nx/xx:set 操作是否執(zhí)行與 name 鍵是否存在有關(guān)

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

          # set():?jiǎn)巫址僮?/span>
          #?添加一個(gè)值,并設(shè)置超時(shí)時(shí)間為120s
          ?self.redis_obj.set('name',?'airpython',?ex=120)

          # get():獲取這個(gè)值
          print(self.redis_obj.get('name'))

          # delete():刪除一個(gè)值或多個(gè)值
          self.redis_obj.delete('name')
          print(self.redis_obj.get('name'))

          對(duì)于多值數(shù)據(jù)的設(shè)置,只需要調(diào)用 mset() 方法,將待插入的數(shù)據(jù)以鍵值對(duì)組成一個(gè)字典作為參數(shù)即可

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

          # mset():設(shè)置多個(gè)值
          self.redis_obj.mset({"foo":?"foo1",?"zoo":?"zoo1"})

          # mget():獲取多個(gè)值
          result?=?self.redis_obj.mget("foo",?"zoo")
          print(result)

          2、列表操作

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

          • lpush/rpush:將一個(gè)值或多個(gè)值插入到列表頭部或尾部,其中,lpush 代表頭部插入;rpush 代表尾部插入數(shù)據(jù)

          • lset:通過索引,將值插入到列表對(duì)應(yīng)的位置

          • linsert:在列表元素前面或后面插入數(shù)據(jù)

          • lindex:通過索引獲取列表中的某一個(gè)元素,其中,0 代表第一個(gè)元素;-1 代表最后一個(gè)元素

          • lrange:通過制定起始位置和結(jié)束位置,從列表中獲取指定區(qū)域的值

          • llen:獲取列表的長(zhǎng)度,如果 Key 對(duì)應(yīng)的列表不存在,返回 0

          • lpop:移除并返回列表中的第一個(gè)元素

          • rpop:移除并返回列表中的最后一個(gè)元素

          實(shí)例代碼如下:

          def?manage_list(self):
          ????"""
          ????操作列表
          ????:return:
          ????"""

          ????#?1、新增一個(gè)列表,并左邊插入一個(gè)數(shù)據(jù)
          ????#?注意:可以一次加入多個(gè)元素,也可以一個(gè)個(gè)元素的加入
          ????self.redis_obj.lpush('company',?'阿里',?'騰訊',?'百度')

          ????#?2、移除第一個(gè)元素
          ????self.redis_obj.lpop("company")

          ????#?3、右邊插入數(shù)據(jù)
          ????self.redis_obj.rpush('company',?'字節(jié)跳動(dòng)',?'小米')

          ????#?4、移除最后一個(gè)元素
          ????self.redis_obj.rpop("company")

          ????#?5、獲取列表的長(zhǎng)度
          ????self.redis_obj.llen("company")

          ????#?6、通過索引,獲取列表中的某一個(gè)元素(第二個(gè)元素)
          ????print('列表中第二個(gè)元素是:',?self.redis_obj.lindex("company",?1))

          ????#?7、根據(jù)范圍,查看列表中所有的值
          ????print(self.redis_obj.lrange('company',?0,?-1))

          3、操作 Set?

          Set 是一個(gè)無序的元素集合,集合中的元素不能重復(fù),Redis 同樣提供了很多方法,便于操作 Set 集合

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

          • sadd:添加元素到集合中,已經(jīng)存在集合中的元素將被忽略,如果集合不存在,則新建一個(gè)集合

          • scard:返回集合元素的數(shù)量

          • smembers:返回集合中所有元素

          • srem:移除集合中一個(gè)或多個(gè)元素,如果元素不存在則忽略

          • sinter:返回兩個(gè)集合的交集,結(jié)果依然是一個(gè)集合

          • sunion:返回兩個(gè)集合的并集

          • sdiff:以第一個(gè)集合參數(shù)為標(biāo)準(zhǔn),返回兩個(gè)集合的差集

          • sunionstore:計(jì)算兩個(gè)集合的并集,保存到一個(gè)新的集合中

          • sismember:判斷集合中是否存在某個(gè)元素

          • spop:隨機(jī)刪除集合中的一個(gè)元素,并返回

          具體實(shí)例代碼如下:

          def?manage_set(self):
          ????"""
          ????操作set集合
          ????:return:
          ????"
          ""
          ????self.redis_obj.delete("fruit")

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

          ????#?再添加兩個(gè)元素
          ????self.redis_obj.sadd('fruit',?'蘋果',?'桔子')

          ????#?2、集合元素的數(shù)量
          ????print('集合元素?cái)?shù)量:',?self.redis_obj.scard('fruit'))

          ????#?3、移除一個(gè)元素
          ????self.redis_obj.srem("fruit",?"桔子")

          ????#?再定義一個(gè)集合
          ????self.redis_obj.sadd("fruit_other",?"香蕉",?"葡萄",?"柚子")

          ????#?4、獲取兩個(gè)集合的交集
          ????result?=?self.redis_obj.sinter("fruit",?"fruit_other")
          ????print(type(result))
          ????print('交集為:',?result)

          ????#?5、獲取兩個(gè)集合的并集
          ????result?=?self.redis_obj.sunion("fruit",?"fruit_other")
          ????print(type(result))
          ????print('并集為:',?result)

          ????#?6、差集,以第一個(gè)集合為標(biāo)準(zhǔn)
          ????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、隨機(jī)從集合中刪除一個(gè)元素,然后返回
          ????result?=?self.redis_obj.spop("fruit")
          ????print('刪除的元素是:',?result)

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

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

          4、操作 zset 集合

          zset 集合相比普通 set 集合,是有序的,zset 集合中的元素包含:值和分?jǐn)?shù),其中分?jǐn)?shù)用于排序

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

          • zadd:往集合中新增元素,如果集合不存在,則新建一個(gè)集合,然后再插入數(shù)據(jù)

          • zrange:通過起始點(diǎn)和結(jié)束點(diǎn),返回集合中的元素值(不包含分?jǐn)?shù));如果設(shè)置withscores=True,則返回結(jié)果會(huì)帶上分?jǐn)?shù)

          • zscore:獲取某一個(gè)元素對(duì)應(yīng)的分?jǐn)?shù)

          • zcard:獲取集合中元素個(gè)數(shù)

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

          • zrem:刪除集合中的元素

          • zcount:通過最小值和最大值,判斷分?jǐn)?shù)在這個(gè)范圍內(nèi)的元素個(gè)數(shù)

          實(shí)踐代碼如下:

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

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

          ????#?查看集合中所有元素(不帶分?jǐn)?shù))
          ????result?=?self.redis_obj.zrange("fruit",?0,?-1)
          ????#?['banana',?'apple',?'pear']
          ????print('集合中的元素(不帶分?jǐn)?shù))有:',?result)

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

          ????#?獲取集合中某一個(gè)元素的分?jǐn)?shù)
          ????result?=?self.redis_obj.zscore("fruit",?"apple")
          ????print("apple對(duì)應(yīng)的分?jǐn)?shù)為:",?result)

          ????#?通過最小值和最大值,判斷分?jǐn)?shù)在這個(gè)范圍內(nèi)的元素個(gè)數(shù)
          ????result?=?self.redis_obj.zcount("fruit",?1,?2)
          ????print("集合中分?jǐn)?shù)大于1,小于2的元素個(gè)數(shù)有:",?result)

          ????#?獲取集合中元素個(gè)數(shù)
          ????count?=?self.redis_obj.zcard("fruit")
          ????print('集合元素格式:',?count)

          ????#?獲取元素的值獲取索引號(hào)
          ????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、操作哈希

          哈希表中包含很多鍵值對(duì),并且每一個(gè)鍵都是唯一的

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

          • hset:往哈希表中添加一個(gè)鍵值對(duì)值

          • hmset:往哈希表中添加多個(gè)鍵值對(duì)值

          • hget:獲取哈希表中單個(gè)鍵的值

          • hmget:獲取哈希表中多個(gè)鍵的值列表

          • hgetall:獲取哈希表中種所有的鍵值對(duì)

          • hkeys:獲取哈希表中所有的鍵列表

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

          • hexists:判斷哈希表中,某個(gè)鍵是否存在

          • hdel:刪除哈希表中某一個(gè)鍵值對(duì)

          • hlen:返回哈希表中鍵值對(duì)個(gè)數(shù)

          對(duì)應(yīng)的操作代碼如下:

          def?manage_hash(self):
          ????"""
          ????操作哈希表
          ????哈希:一個(gè)鍵對(duì)應(yīng)一個(gè)值,并且鍵不容許重復(fù)
          ????:return:
          ????"
          ""
          ????self.redis_obj.delete("website")

          ????#?1、新建一個(gè)key為website的哈希表
          ????#?往里面加入數(shù)據(jù):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、往哈希表中添加多個(gè)鍵值對(duì)
          ????self.redis_obj.hmset("website",?{"tencent":?"www.qq.com",?"alibaba":?"www.taobao.com"})

          ????#?3、獲取某一個(gè)鍵的值
          ????result?=?self.redis_obj.hget("website",?'baidu')
          ????print("鍵為baidu的值為:",?result)

          ????#?4、獲取多個(gè)鍵的值
          ????result?=?self.redis_obj.hmget("website",?"baidu",?"alibaba")
          ????print("多個(gè)鍵的值為:",?result)

          ????#?5、查看hash表中的所有值
          ????result?=?self.redis_obj.hgetall('website')
          ????print("哈希表中所有的鍵值對(duì)為:",?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、判斷某一個(gè)鍵是否存在
          ????result?=?self.redis_obj.hexists("website",?"alibaba")
          ????print('alibaba這個(gè)鍵是否存在:',?result)

          ????#?9、刪除某一個(gè)鍵值對(duì)
          ????self.redis_obj.hdel("website",?'baidu')
          ????print('刪除baidu鍵值對(duì)后,哈希表的數(shù)據(jù)包含:',?self.redis_obj.hgetall('website'))

          ????#?10、哈希表中鍵值對(duì)個(gè)數(shù)
          ????count?=?self.redis_obj.hlen("website")
          ????print('哈希表鍵值對(duì)一共有:',?count)

          5、操作事務(wù)管道

          Redis 支持事務(wù)管道操作,能夠?qū)讉€(gè)操作統(tǒng)一提交執(zhí)行

          操作步驟是:

          • 首先,定義一個(gè)事務(wù)管道

          • 然后通過事務(wù)對(duì)象去執(zhí)行一系列操作

          • 提交事務(wù)操作,結(jié)束事務(wù)操作

          下面通過一個(gè)簡(jiǎn)單的例子來說明:

          def?manage_steps(self):
          ????"""
          ????執(zhí)行事務(wù)操作
          ????:return:
          ????"""

          ????#?1、定義一個(gè)事務(wù)管道
          ????self.pip?=?self.redis_obj.pipeline()

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

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

          ????#?減少一歲
          ????self.pip.decr('age')

          ????#?執(zhí)行上面定義3個(gè)步驟的事務(wù)操作
          ????self.pip.execute()

          ????#?判斷
          ????print('通過上面一些列操作,年齡變成:',?self.redis_obj.get('age'))

          4.最后

          本篇文章通過 Python 實(shí)現(xiàn)了對(duì) Redis 常見數(shù)據(jù)的操作,受限于篇幅,沒法對(duì) Redis 中一些不常用的方法沒法進(jìn)行展開說明

          我已經(jīng)將文中全部源碼上傳到后臺(tái),關(guān)注公眾號(hào)后回復(fù)「 dball?」即可獲得全部源碼

          如果你覺得文章還不錯(cuò),請(qǐng)大家?點(diǎn)贊、分享、留言?下,因?yàn)檫@將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力!




          推薦閱讀


          聊聊 Python 數(shù)據(jù)處理全家桶(Mysql 篇)

          聊聊 Python 數(shù)據(jù)處理全家桶(Sqlite 篇)

          Python 如何使用 HttpRunner 做接口自動(dòng)化測(cè)試



          瀏覽 38
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲色情在线播放 | 国内av免费观看 韩日精品在线观看 | www.插 | 私人玩物视频 | 麻豆精品三级 |