成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一日一技:帶過期時間的緩存、全文搜索、頻率限制怎么做?

存儲
walrus對redis-py進行了很好的二次封裝,用起來非常順手。除了上面我提到的三個功能外,它還可以實現幾行代碼生成布隆過濾器,實現自動補全功能,實現簡易圖數據庫等等。

[[442671]]

在以前的文章里面,我給大家介紹了使用Python自帶的LRU緩存實現帶有過期時間的緩存:一日一技:實現有過期時間的LRU緩存。也講過倒排索引:使用倒排索引極速提高字符串搜索效率。但這些代碼對初學者來說比較難,寫起來可能會出錯。

實際上,這些功能其實都可以使用Redis來實現,而且每個功能只需要1分鐘就能做出來。全文搜索功能在搜索英文的時候,甚至可以智能識別拼寫錯誤的問題。

要實現這些功能,只需要做兩件事:

安裝Redis

Python安裝第三方庫:walrus

安裝完成以后,我們來看看它有多簡單:

帶過期時間的緩存裝飾器

我們想實現一個裝飾器,它裝飾一個函數。讓我在1分鐘內多次訪問函數的時候,使用緩存的數據;超過1分鐘以后才重新執行函數的內部代碼:

  1. import time 
  2. import datetime 
  3. from walrus import Database 
  4.  
  5. db = Database() 
  6. cache = db.cache() 
  7.  
  8. @cache.cached(timeout=60) 
  9. def test(): 
  10.     print('函數真正運行起來'
  11.     now = datetime.datetime.now() 
  12.     return now 
  13.  
  14. now = test() 
  15. print('函數返回的數據是:', now) 
  16. time.sleep(10) # 等待10秒,此時會使用緩存 
  17. print('函數返回的數據是:', test()) 
  18. time.sleep(5) # 等待5秒,此時依然使用緩存 
  19. print('函數返回的數據是:', test()) 
  20.  
  21. time.sleep(50)  # 讓時間超過緩存的時間 
  22. print('函數返回的數據是:', test()) 

運行效果如下圖所示:

全文搜索

我們再來看看全文搜索功能,實現起來也很簡單:

  1. from walrus import Database 
  2.  
  3. db = Database() 
  4. search = db.Index('xxx')  # 這個名字隨便取 
  5. poem1 = 'Early in the day it was whispered that we should sail in a boat, only thou and I, and never a soul in the world would know of this our pilgrimage to no country and to no end.' 
  6. poem2 = 'Had I the heavens’ embroidered cloths,Enwrought with golden and silver light' 
  7. poem3 = 'to be or not to be, that is a question.' 
  8.  
  9. search.add('docid1', poem1) # 第一個參數不能重復 
  10. search.add('docid2', poem2) 
  11. search.add('docid3', poem3) 
  12.  
  13.  
  14. for doc in search.search('end'): 
  15.     print(doc['content']) 

運行效果如下圖所示:

如果你想讓他兼容拼寫錯誤,那么可以把search = db.Index('xxx')改成search = db.Index('xxx’, metaphone=True),運行效果如下圖所示:

不過遺憾的是,這個全文搜索功能只支持英文。

頻率限制

我們有時候要限制調用某個函數的頻率,或者網站的某個接口要限制IP的訪問頻率。這個時候,使用walrus也可以輕松實現:

  1. import time 
  2. from walrus import Database 
  3.  
  4. db = Database() 
  5. rate = db.rate_limit('xxx', limit=5, per=60) # 每分鐘只能調用5次 
  6.  
  7. for _ in range(35): 
  8.     if rate.limit('xxx'): 
  9.         print('訪問頻率太高!'
  10.     else
  11.         print('還沒有觸發訪問頻率限制'
  12.     time.sleep(2) 

運行效果如下圖所示:

其中參數limit表示能出現多少次,per表示在多長時間內。

rate.limit只要傳入相同的參數,那么就會開始檢查這個參數在設定的時間內出現的頻率。

你可能覺得這個例子并不能說明什么問題,那么我們跟FastAPI結合一下,用來限制IP訪問接口的頻率。編寫如下代碼:

  1. from walrus import Database, RateLimitException 
  2. from fastapi import FastAPI, Request 
  3. from fastapi.responses import JSONResponse 
  4.  
  5. db = Database() 
  6. rate = db.rate_limit('xxx', limit=5, per=60) # 每分鐘只能調用5次 
  7.  
  8. app = FastAPI() 
  9.  
  10.  
  11. @app.exception_handler(RateLimitException) 
  12. def parse_rate_litmit_exception(request: Request, exc: RateLimitException): 
  13.     msg = {'success'False'msg': f'請喝杯茶,休息一下,你的ip: {request.client.host}訪問太快了!'
  14.     return JSONResponse(status_code=429, content=msg) 
  15.  
  16. @app.get('/'
  17. def index(): 
  18.     return {'success'True
  19.  
  20.  
  21. @app.get('/important_api'
  22. @rate.rate_limited(lambda request: request.client.host) 
  23. def query_important_data(request: Request): 
  24.     data = '重要數據' 
  25.     return {'success'True'data': data} 

上面代碼定義了一個全局的異常攔截器:

  1. @app.exception_handler(RateLimitException) 
  2. def parse_rate_litmit_exception(request: Request, exc: RateLimitException): 
  3.     msg = {'success'False'msg': f'請喝杯茶,休息一下,你的ip: {request.client.host}訪問太快了!'
  4.     return JSONResponse(status_code=429, content=msg) 

在整個代碼的任何地方拋出了RateLimitException異常,就會進入這里的邏輯中。

使用裝飾器@rate.rate_limited裝飾一個路由函數,并且這個裝飾器要更靠近函數。路由函數接收什么參數,它就接收什么參數。在上面的例子中,我們只接收了request參數,用于獲取訪問者的IP。發現這個IP的訪問頻率超過了限制,就拋出一個RateLimitException。于是前面定義好的全局攔截器就會攔截RateLimitException異常,攔截到以后返回我們定義好的報錯信息。

在頻率范圍內訪問頁面,返回正常的JSON數據:

頻率超過設定的值以后,訪問頁面就會報錯,如下圖所示:

總結

walrus對redis-py進行了很好的二次封裝,用起來非常順手。除了上面我提到的三個功能外,它還可以實現幾行代碼生成布隆過濾器,實現自動補全功能,實現簡易圖數據庫等等。大家可以訪問它的官方文檔了解詳細使用說明[1]。

參考文獻

[1] 官方文檔了解詳細使用說明: https://walrus.readthedocs.io/en/latest/getting-started.html

本文轉載自微信公眾號「未聞Code」,可以通過以下二維碼關注。轉載本文請聯系未聞Code公眾號。

 

責任編輯:武曉燕 來源: 未聞Code
相關推薦

2021-07-26 21:15:10

LRU緩存MongoDB

2021-04-27 22:15:02

Selenium瀏覽器爬蟲

2021-08-01 15:26:59

協程Asyncio并發數

2022-05-02 16:27:01

JavaScriptHTMLPython

2021-10-15 21:08:31

PandasExcel對象

2022-06-28 09:31:44

LinuxmacOS系統

2024-11-13 09:18:09

2021-04-05 14:47:55

Python多線程事件監控

2022-03-12 20:38:14

網頁Python測試

2025-05-28 03:15:00

Scrapy數據sleep

2021-04-12 21:19:01

PythonMakefile項目

2021-07-08 21:49:13

前端后端Cookies

2021-03-18 23:28:45

Python反斜杠字符串

2023-10-28 12:14:35

爬蟲JavaScriptObject

2021-09-13 20:38:47

Python鏈式調用

2021-03-12 21:19:15

Python鏈式調用

2024-07-30 08:16:18

Python代碼工具

2021-04-19 23:29:44

MakefilemacOSLinux

2024-07-30 08:11:16

2024-11-11 00:38:13

Mypy靜態類型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 人人干超碰 | 成人免费视频网站在线看 | 免费av一区二区三区 | 欧美日韩高清 | 黑人一级黄色大片 | 成人av在线播放 | 国产精品国产三级国产播12软件 | 狠狠干狠狠操 | 欧美日韩成人在线 | 天堂久久天堂综合色 | 午夜在线电影网 | 欧美黄色网 | av激情在线 | 99亚洲精品视频 | 日韩播放 | 欧美 日韩 亚洲91麻豆精品 | av色站 | 人妖videosex高潮另类 | 一区二区在线 | 国产精品免费在线 | 国产欧美一区二区久久性色99 | 久久久久久国产精品 | 欧美性生交大片免费 | 九九九国产 | 人干人人 | 欧美日韩国产免费 | 亚洲精品一区在线 | av黄色国产| 国产一区二区三区免费 | 人操人免费视频 | 久久99精品国产99久久6男男 | 国产一级片精品 | 国产成人免费视频网站高清观看视频 | 国产一区高清 | 1级黄色大片 | 精品日韩欧美一区二区 | 天天干在线播放 | 午夜黄色影院 | 中文字幕国产一区 | 免费一级做a爰片久久毛片潮喷 | 老外黄色一级片 |