伊人成色综合人夜夜久久
你的位置:伊人成色综合人夜夜久久 > av漫画 > 一日一技:带落伍手艺的缓存、全文搜索、频率限度若何做?
一日一技:带落伍手艺的缓存、全文搜索、频率限度若何做?
发布日期:2022-06-18 17:08    点击次数:107

一日一技:带落伍手艺的缓存、全文搜索、频率限度若何做?

在曩昔的著作里面,我给大家先容了使用Python自带的LRU缓存已毕带有落伍手艺的缓存:一日一技:已毕存落伍手艺的LRU缓存。也讲过倒排索引:使用倒排索引极速进步字符串搜索效力。但这些代码对入门者来说比拟难,写起来可能会出错。

本体上,这些功能其实都不错使用Redis来已毕,而且每个功能只需要1分钟就能做出来。全文搜索功能在搜索英文的时候,以至不错智能识别拼写过失的问题。

要已毕这些功能,只需要做两件事:

安设Redis

Python安设第三方库:walrus

安设完成以后,咱们来望望它有多大概:

带落伍手艺的缓存守密器

咱们想已毕一个守密器,它守密一个函数。让我在1分钟内屡次探听函数的时候,使用缓存的数据;向上1分钟以后才再行奉行函数的里面代码:

import time import datetime from walrus import Database  db = Database() cache = db.cache()  @cache.cached(timeout=60) def test():     print('函数实在运行起来')     now = datetime.datetime.now()     return now  now = test() print('函数复返的数据是:', now) time.sleep(10) # 恭候10秒,此时会使用缓存 print('函数复返的数据是:', test()) time.sleep(5) # 恭候5秒,此时还是使用缓存 print('函数复返的数据是:', test())  time.sleep(50)  # 让手艺向上缓存的手艺 print('函数复返的数据是:', test()) 

运行后果如下图所示:

全文搜索

咱们再来望望全文搜索功能,已毕起来也很大概:

from walrus import Database  db = Database() search = db.Index('xxx')  # 这个名字敷衍取 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.' poem2 = 'Had I the heavens’ embroidered cloths,Enwrought with golden and silver light' poem3 = 'to be or not to be, that is a question.'  search.add('docid1', poem1) # 第一个参数不可重迭 search.add('docid2', poem2) search.add('docid3',
色综合色天天久久婷婷基地 poem3)   for doc in search.search('end'):     print(doc['content']) 

运行后果如下图所示:

淌若你想让他兼容拼写过失,那么不错把search = db.Index('xxx')改成search = db.Index('xxx’, metaphone=True),运行后果如下图所示:

不外缺憾的是,这个全文搜索功能只支撑英文。

频率限度

咱们偶然候要限度调用某个函数的频率,或者网站的某个接口要限度IP的探听频率。这个时候,使用walrus也不错落拓已毕:

import time from walrus import Database  db = Database() rate = db.rate_limit('xxx', limit=5, per=60) # 每分钟只可调用5次  for _ in range(35):     if rate.limit('xxx'):         print('探听频率太高!')     else:         print('还莫得触发探听频率限度')     time.sleep(2) 

运行后果如下图所示:

其中参数limit暗示能出现若干次,per暗示在多长手艺内。

rate.limit惟有传入疏通的参数,那么就会运行查验这个参数在设定的手艺内出现的频率。

你可能合计这个例子并不可施展什么问题,av漫画那么咱们跟FastAPI联结一下,用来限度IP探听接口的频率。编写如下代码:

from walrus import Database, RateLimitException from fastapi import FastAPI, Request from fastapi.responses import JSONResponse  db = Database() rate = db.rate_limit('xxx', limit=5, per=60) # 每分钟只可调用5次  app = FastAPI()   @app.exception_handler(RateLimitException) def parse_rate_litmit_exception(request: Request, exc: RateLimitException):     msg = {'success': False, 'msg': f'请喝杯茶,休息一下,你的ip: {request.client.host}探听太快了!'}     return JSONResponse(status_code=429, content=msg)  @app.get('/') def index():     return {'success': True}   @app.get('/important_api') @rate.rate_limited(lambda request: request.client.host) def query_important_data(request: Request):     data = '首要数据'     return {'success': True, 'data': data} 

上头代码界说了一个全局的极度遏止器:

@app.exception_handler(RateLimitException) def parse_rate_litmit_exception(request: Request, exc: RateLimitException):     msg = {'success': False, 'msg': f'请喝杯茶,休息一下,你的ip: {request.client.host}探听太快了!'}     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公众号。

 



上一篇:泛型版 Singleflight:Go 中怎样防患缓存击穿?
下一篇:澈底意会内存败露,Memory leak

友情链接:
  • 曰批全过程免费视频播放
  • 国产美女裸无遮挡裸体免费观网站
  • 国产精品国产一区二区三区
  • 日韩毛片
  • 欧美人与拘牲交大全视频