python使用redis在实际场景使用_用python操作redis及redis的一些应用场景
redis安裝
網上很多windows、Linux的安裝教程,可根據自己的需要尋找對應教程安裝
redis-py安裝
pip install redis
redis可視化工具
API的使用
redis-py 的API的使用可以分類為:
連接方式
直接連接
連接池
操作
String 操作
Hash 操作
List 操作
Set 操作
Sort Set 操作
管道
發布訂閱
連接方式
操作模式
redis-py提供兩個類Redis和StrictRedis用于實現Redis的命令,StrictRedis用于實現大部分官方的命令,并使用官方的語法和命令,Redis是StrictRedis的子類,用于向后兼容舊版本的redis-py。官方推薦使用StrictRedis方法
import redis
r = redis.StrictRedis(host='127.0.0.1', port=6379, db=0) r.set('name', 'longofo')
r.get('name')
連接池
redis-py使用connection pool來管理對一個redis server的所有連接,避免每次建立、釋放連接的開銷。默認,每個Redis實例都會維護一個自己的連接池??梢灾苯咏⒁粋€連接池,然后作為參數Redis,這樣就可以實現多個Redis實例共享一個連接池
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379,db=0)
r = redis.StrictRedis(connection_pool=pool)
r.set('wu', 'longe')
print r.get('wu')
操作
應用場景
緩存
作為Key-Value形態的內存數據庫,Redis 最先會被想到的應用場景便是作為數據緩存。而使用 Redis 緩存數據非常簡單,只需要通過string類型將序列化后的對象存起來即可,不過也有一些需要注意的地方:
必須保證不同對象的 key 不會重復,并且使 key 盡量短,一般使用類名(表名)加主鍵拼接而成。
選擇一個優秀的序列化方式也很重要,目的是提高序列化的效率和減少內存占用。
緩存內容與數據庫的一致性,這里一般有兩種做法:只在數據庫查詢后將對象放入緩存,如果對象發生了修改或刪除操作,直接清除對應緩存(或設為過期)。
在數據庫新增和查詢后將對象放入緩存,修改后更新緩存,刪除后清除對應緩存(或設為過期)。
消息隊列
Redis 中list的數據結構實現是雙向鏈表,所以可以非常便捷的應用于消息隊列(生產者 / 消費者模型)。消息的生產者只需要通過lpush將消息放入 list,消費者便可以通過rpop取出該消息,并且可以保證消息的有序性。如果需要實現帶有優先級的消息隊列也可以選擇sorted set。而pub/sub功能也可以用作發布者 / 訂閱者模型的消息。無論使用何種方式,由于 Redis 擁有持久化功能,也不需要擔心由于服務器故障導致消息丟失的情況。
時間軸(Timeline)
list作為雙向鏈表,不光可以作為隊列使用。如果將它用作棧便可以成為一個公用的時間軸。當用戶發完微博后,都通過lpush將它存放在一個 key 為LATEST_WEIBO的list中,之后便可以通過lrange取出當前最新的微博。
排行榜
使用sorted set和一個計算熱度的算法便可以輕松打造一個熱度排行榜,zrevrangebyscore可以得到以分數倒序排列的序列,zrank可以得到一個成員在該排行榜的位置(是分數正序排列時的位置,如果要獲取倒序排列時的位置需要用zcard-zrank)。
計數器
計數功能應該是最適合 Redis 的使用場景之一了,因為它高頻率讀寫的特征可以完全發揮 Redis 作為內存數據庫的高效。在 Redis 的數據結構中,string、hash和sorted set都提供了incr方法用于原子性的自增操作,下面舉例說明一下它們各自的使用場景:
如果應用需要顯示每天的注冊用戶數,便可以使用string作為計數器,設定一個名為REGISTERED_COUNT_TODAY的 key,并在初始化時給它設置一個到凌晨 0 點的過期時間,每當用戶注冊成功后便使用incr命令使該 key 增長 1,同時當每天凌晨 0 點后,這個計數器都會因為 key 過期使值清零。
每條微博都有點贊數、評論數、轉發數和瀏覽數四條屬性,這時用hash進行計數會更好,將該計數器的 key 設為weibo:weibo_id,hash的 field 為like_number、comment_number、forward_number和view_number,在對應操作后通過hincrby使hash 中的 field 自增。
如果應用有一個發帖排行榜的功能,便選擇sorted set吧,將集合的 key 設為POST_RANK。當用戶發帖后,使用zincrby將該用戶 id 的 score 增長 1。sorted set會重新進行排序,用戶所在排行榜的位置也就會得到實時的更新。
好友關系
這個場景最開始是是一篇介紹微博 Redis 應用的 PPT 中看到的,其中提到微博的 Redis 主要是用在在計數和好友關系兩方面上,當時對好友關系方面的用法不太了解,后來看到《Redis 設計與實現》中介紹到作者最開始去使用 Redis 便是希望能通過set解決傳統數據庫無法快速計算集合中交集這個功能。后來聯想到微博當前的業務場景,確實能夠以這種方式實現,所以姑且猜測一下:
對于一個用戶 A,將它的關注和粉絲的用戶 id 都存放在兩個 set 中:
A:follow:存放 A 所有關注的用戶 id
A:follower:存放 A 所有粉絲的用戶 id
那么通過sinter命令便可以根據A:follow和A:follower的交集得到與 A 互相關注的用戶。當 A 進入另一個用戶 B 的主頁后,A:follow和B:follow的交集便是 A 和 B 的共同專注,A:follow和B:follower的交集便是 A 關注的人也關注了 B。
分布式鎖
在 Redis 2.6.12 版本開始,string的set命令增加了三個參數:
EX:設置鍵的過期時間(單位為秒)
PX:設置鍵的過期時間(單位為毫秒)
NX?|?XX:當設置為NX時,僅當 key 存在時才進行操作,設置為XX時,僅當 key 不存在才會進行操作
由于這個操作是原子性的,可以簡單地以此實現一個分布式的鎖,例如:
set key "lock" EX 1 XX
如果這個操作返回false,說明 key 的添加不成功,也就是當前有人在占用這把鎖。而如果返回true,則說明得了鎖,便可以繼續進行操作,并且在操作后通過del命令釋放掉鎖。并且即使程序因為某些原因并沒有釋放鎖,由于設置了過期時間,該鎖也會在 1 秒后自動釋放,不會影響到其他程序的運行。
倒排索引
倒排索引是構造搜索功能的最常見方式,在 Redis 中也可以通過set進行建立倒排索引,這里以簡單的拼音 + 前綴搜索城市功能舉例:
假設一個城市北京,通過拼音詞庫將北京轉為beijing,再通過前綴分詞將這兩個詞分為若干個前綴索引,有:北、北京、b、be…beijin和beijing。將這些索引分別作為set的 key(例如:index:北)并存儲北京的 id,倒排索引便建立好了。接下來只需要在搜索時通過關鍵詞取出對應的set并得到其中的 id 即可。
總結
以上是生活随笔為你收集整理的python使用redis在实际场景使用_用python操作redis及redis的一些应用场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python发送文件到钉钉群_iOS p
- 下一篇: 双拼输入法键位图_教你在Windows自