redis系列之--缓存方案(python)

缓存方案


一缓存介绍

  • 作用

    减小数据库的访问压力, 提高并发能力

  • 多级缓存
    在这里插入图片描述

二.本地缓存/一级缓存

  • flask-cache

    • 安装 pip install flask-cache
    • 选择simple类型, 可以实现对响应的内存缓存
    • https://www.cnblogs.com/cwp-bg/p/9687005.html
  • 项目中的应用

    • 一般不设置一级缓存
      • 内存缓存会影响web应用的运行效率
      • 对响应做缓存的性价比低
from flask import Flask
from flask_cache import Cache
import random

app = Flask(__name__)
# 设置配置
app.config['CACHE_TYPE'] = 'simple'  # 使用本地python字典进行存储, 一级缓存
app.config['CACHE_DEFAULT_TIMEOUT'] = 5 * 60  # 默认过期时间 5分钟

# 创建缓存对象
cache = Cache(app)


@app.route('/')
@cache.cached(timeout=60)  # 对无参数的路由响应进行缓存
def index():
    num = random.randint(0, 9)
    print(num)
    return str(num)

@app.route('/demo1/<user_id>')  # demo1/11   demo1/12 的缓存结果会做区分
@cache.memoize(timeout=30)
def demo1(user_id):
    num = random.randint(0, 9)
    print(num)
    return str(num)


# 对自定义函数设置缓存
@cache.cached(timeout=20)
def func1():
    num = random.randint(0, 9)
    print(num)
    return str(num)


@app.route('/demo2')
def demo2():
    print('demo2')
    # return func1()
    # 可以对指定的数据进行缓存
    cache.set('name', 'zs', timeout=30)
    return 'demo2'

@app.route('/demo3')
def demo3():
    # 取出缓存
    name = cache.get('name')
    print(name)
    return 'demo3'


if __name__ == '__main__':
    app.run(debug=True)

三.缓存粒度


  • 缓存某个数值
    • 一个键只保存一个值, 性价比较低, 使用率低
    • 场景 验证码

  • 缓存数据对象
    • 数据库记录对应的具体数据
    • 优点 可以多次复用
    • 场景 用户/文章数据

  • 缓存数据集合

    • 数据库查询对应的结果集

    • 场景 文章/关注列表

    • 可以和数据对象配合使用, 方便数据对象的重用


  • 缓存视图响应
    • 视图返回的响应数据
    • 缺点 复用性比较差
  • 项目中主要对 数据集合+数据对象 进行缓存, 优点 复用性强, 节省内存

四.缓存格式

  • 数值
    • 类型 string

  • 数据对象
    • hash
      • 不需要格式转换
      • 可以单独更新某一个字段
      • 占用的空间比较多
    • 结构化string (json字符串)
      • 需要进行转换 使用pickle模块提高性能
      • 无法单独更新某个字段
      • 占用的空间小
    • 头条项目中优先使用结构化string

  • 数据集合
    • article:top:30 / md5("select * from t_arcitle order by(create_time) desc limit 30;")
    • 值 list/zset/set/hash/结构化string
    • list
      • 有遍历的需要
      • 增加效率 追加数据速度很快 插入速度和插入的位置有关
      • 查询效率 和查询的区间有关
      • 如果添加顺序和不满足排序要求, 则无法排序
    • zset
      • 有排序的需要
      • 增加效率 和存储的数据量负相关, 数据量越大, 添加时间越长
      • 查询效率 和存储的数据量负相关, 并且和查询的结果集数据量有关
    • set
      • 有判断是否存在的需要
    • hash
      • 只能根据键取值, 无法遍历
      • 空间占用多
    • json字符串
      • 节省空间
    • 头条项目中主要使用了json字符串zset的形式

  • 视图响应
    • string
    • 键 请求URL
    • 值 响应结果对应的字符串 前端渲染json字符串/后端渲染html字符串

五.缓存机制


1.过期策略
  • 作用

    • 节省空间
    • 实现数据的弱一致性
  • 过期策略

    • 定时过期
      • 效率太低, 每个数据都需要设置定时器进行计数
    • 惰性过期
    • 查询时, 才去检查数据的有效期, 如果过期, 则返回nil, 并删除过期数据
      • 定期过期
        • 每隔100ms, 随机取出一部分数据进行过期校验, 如果过期, 删除数据
  • redis的选择

    • 惰性过期+定期过期(每100ms对设置了过期时间的数据随机查询并删除过期数据)

2.缓存淘汰
  • LRU

    • least recently use 优先淘汰不是最近使用的数据
  • LFU

    • least frequently use 优先淘汰不是频繁使用的数据
    • 采用了定期衰减的机制, 防止旧数据始终无法删除
  • 缺点
    - 需要每条数据维护一个使用计数
    - 还需要定期衰减

    • 面试问题
      • mysql中有100万数据, 要求redis中保留20万热点数据
      • 设置内存最大存储空间, 并且设置缓存策略为LFU
  • 淘汰配置

maxmemory 最大使用内存数量  如服务器内存10G, 最多给redis分配9G
maxmemory-policy volatile-lru 淘汰策略

3. 缓存的模式
  • 读缓存

    • 先读取缓存中的数据, 没有才会读取数据库中的数据

    • 解决数据库读取压力

    • 方式

      • cache aside 具体读写操作交给应用完成
      • read through 具体读写操作交给缓存层完成, 即使后期修改存储方案, 业务代码不需要修改, 有利于项目的重构和架构升级
  • 写缓存

    • 先写入缓存, 再写入数据库
    • 解决数据库的写入压力
    • 方式
      • write through 具体写操作交给缓存层完成, 立即更新数据库
      • write behind caching 具体读操作交给缓存层完成, 定时异步更新数据库

六.缓存问题

1 缓存更新
  • 问题
    • mysql和redis是两个独立的系统, 在并发环境下, 无法保证更新的一致性
  • 解决办法
    • 更新数据时, 先写入mysql, 再删除缓存 facebook
    • 设计分布式锁/使用消息队列串行处理
2 缓存穿透
  • 问题
    • 黑客会主动访问数据库不存在的数据, 缓存会被穿透, 直接访问数据库, 导致数据库的的访问压力变大
  • 解决办法
    • 对于数据库中不存在的数据, 也对其在缓存中设置默认值 一般过期时间会比较短
    • 可以设置一些过滤规则, 如布隆过滤器(算法, 用于判断数据是否包含在集合中), 将所有可能的值录入过滤器, 如果不包含直接返回None, 有误杀概率
3 缓存雪崩
  • 问题

    • 如果大量缓存数据都在同一个时间过期, 那么很可能出现缓存集体失效, 会导致所有的请求都直接访问数据库, 导致数据库压力过大
  • 解决办法

    • 设置过期时间时, 添加随机值, 让过期时间进行一定程度分散
    • 多级缓存的方式来处理
    • 利用锁/队列的形式

七.缓存层实现

1 缓存类设计
class UserProfileCache(object):
    """用户基本信息缓存类   每个缓存对象 对应 一条用户缓存数据"""
    def __init__(self, user_id):
        self.user_id = user_id   # 用户id
        self.key = 'user:{}:profile'.format(self.user_id)  # redis键

    def get(self):
        """获取缓存数据"""
        pass

    def clear(self):
        """清空缓存"""
        pass
2 获取缓存
class UserProfileCache(object):
    """用户基本信息缓存类   每个缓存对象 对应 一条用户缓存数据

    user:<用户id>:profile    string  '{"name": "zs", "age": 20}'
    """
    def __init__
最低0.47元/天 解锁文章
python-redis-cache:用于Python函数的简单Redis缓存
05-15
用于Python函数的简单Redis缓存 要求 Redis 5+ Python 3.6+ 如何安装 pip install python-redis-cache 如何使用 from redis import StrictRedis from redis_cache import RedisCache client = StrictRedis ( ...
一个Redis Cache实现
猛禽的编程艺术
06-29 5057
这次的目标是需要实现一个比较通用的cache,支持各种数据类型,有超时更新机制,超时更新需要有锁
python使用redis缓存_Python中的Redis客户端缓存(二)
weixin_39835178的博客
12-05 134
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。处理失效无效消息如何发送到被追踪的客户端取决于客户端正在使用的Redis序列化协议(RESP)。早期版本的Redis使用RESP2,但是它的后续版本RESP3已经存在于Redis 6中,并且Redis 7将完全不支持旧协议。RESP3包含许多新功能,包括服务器在客户端现有连接上“推送”除了实际回复内容的附加...
python-redis缓存装饰器
最新发布
关注网络安全、云原生安全
03-17 662
key生成:用户不指定key时需要自动生成,统一前缀方便后序更新、删除指定key:用户可以指定key(redis_decorator无法指定key)缓存和获取功能常见类型的缓存支持用户自定义类型可以继承抽象类,实现序列化和反序列化方法(redis_decorator没有)指定key的更新(包没有)指定或批量key的删除(redis_decorators只有删除指定key)支持协程(包没有)
Python 操作 Redis 数据库:高效数据存储与缓存
m0_62153576的博客
10-11 120
通过这篇博客,你学会了如何使用 Python 操作 Redis 数据库,包括连接到 Redis、基本数据操作、使用不同数据结构、处理过期时间和事务等高级操作。Redis 是一个功能强大的工具,通过合理使用它,可以在你的应用程序中实现高效的数据存储和缓存功能。希望这篇博客对你在使用 Redis 时提供了一些有用的指导。
python redis教程_django使用redis缓存,及python操作redis
weixin_39932611的博客
12-03 196
django中使用redis1.直接使用import redis# 默认连接6379,没有密码设置,所以不用填面参数(填了报错),可以自己以配置文件启动(不要配置文件后台启动,启动连得还是6379端口),在配置文件可以修改host,port,password等,r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=T...
python 基于 Redis 实现缓存系统
Shallow的博客
12-28 2313
Redis 服务器用途非常广泛,例如我们可以基于 Redis 服务器实现缓存系统。缓存系统可以缓解客户端访问压力,当缓存有效时只需直接将缓存结果返回给客户端而不用执行真正的后端逻辑。尝试在 Python 中实现一个简单的缓存系统。 要求条件: 假设缓存的结果都是 Python 字典,通过 json 进行序列化和反序列化 确保实验环境的 Redis 服务器已经启动 cache.py 文件中实现一个缓存系统类,类名称为 RedisCache ,可以通过 RedisCache.cache 方法装饰一个函数并缓
Python库 | python-redis-orm-0.4.1.tar.gz
04-13
资源分类:Python库 所属语言:Python 资源全名:python-redis-orm-0.4.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Python库 | fastapi-redis-session-0.1.5.tar.gz
04-08
资源分类:Python库 所属语言:Python 资源全名:fastapi-redis-session-0.1.5.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Python库 | redis-benchmarks-specification-0.1.8.tar.gz
03-11
python库。 资源全名:redis-benchmarks-specification-0.1.8.tar.gz
Python-rediscache一个Redis缓存装饰器
08-10
redis_cache:一个Redis缓存装饰器
Python库 | config_redis-0.2.6-py3-none-any.whl
03-28
资源分类:Python库 所属语言:Python 资源全名:config_redis-0.2.6-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
python操作Redis缓存
weixin_30402343的博客
04-01 108
一、Redis的安装   xshell连上服务器,依次输入以下代码: wget http://download.redis.io/releases/redis-3.0.6.tar.gz tar xzf redis-3.0.6.tar.gz cd redis-3.0.6 make   如果不巧发生以下截图中的错误:   说明未安装gcc,如果是centos系统...
python使用redis缓存_Python的Flask框架使用Redis做数据缓存的配置方法
weixin_39682940的博客
12-05 158
Redis是一款依据BSD开源协议发行的高性能Key-Value存储系统。会把数据读入内存中提高存取效率。Redis性能极高能支持超过100K+每秒的读写频率,还支持通知key过期等等特性,所以及其适合做缓存。下载安装根据redis中文网使用wget下载压缩包$ wget http://download.redis.io/releases/redis-3.0.5.tar.gz$ tar xzf r...
python使用redis缓存_Python操作Redis缓存数据库
weixin_39983383的博客
12-05 208
首先我们需要使用到一个redis库,使用之前先安装一下,使用pip进行安装:pip install redis安装好了redis库之后,我们只需使用import redis导入即可使用了,大部分都是通过这两个步骤使用的;接下来讲解如何操作Redis数据库,介绍一下Redis的五大数据类型:分别是字符串类型string、列表类型list、集合类型set、哈希类型hash、有序集合类型 sorted ...
redis 缓存python 实现
weixin_40222385的博客
08-23 210
搭建redis,mysql,用python实现redis缓存mysql数据
python使用redis缓存_python实现类redis缓存
weixin_40007668的博客
12-11 1503
越来越觉得的缓存是计算机科学里最NB的发明(没有之一), 现在项目用的是redis做的缓存, 它的两个特性用的蛮顺手的:键值查找功能缓存可设置过期时间突突然的,觉得用python也可以简单的模拟一下,做一个本地的轻量级缓存.(不过, 注意一点:redis缓存可以用于分布式, python模拟的则不行, 但是如果把本地缓存的过期时间设的短一点,比如10s, 在大并发下还是有不错表现的)对于键值查找...
踩坑 python使用redis缓存 redis 做临时缓存、数据库
菜猫小六的博客
12-15 3077
title: 踩坑 redis 做临时缓存、数据库使用 tags: ['redis','缓存','python'] date: 2021-12-15 categories: "磨刀不误砍柴工" 环境 window10 redis前言 使用到redis的原因,一是之前做的业务逻辑有需要对用户操作连续几个操作的逻辑判断和做一个时间上的有效性,二十做一下热数据的临时缓存redis的使用体验是很舒服,简单而又高效。 一点简介 安装就不说了.
pandas-DataFrame运算
汪云辉的博客
08-15 3361
DataFrame运算 1 算术运算 add(other) 比如进行数学运算加上具体的一个数字 data['open'].add(1) 2018-02-27 24.53 2018-02-26 23.80 2018-02-23 23.88 2018-02-22 23.25 2018-02-14 22.49 sub(other) 2 逻辑运算 2.1 逻辑...
python使用Redis缓存
04-05
1. 安装Redis 在官网上下载Redis,并安装到本地。 2. 安装redis-py 使用pip命令安装redis-py: ``` pip install redis ``` 3. 连接RedisPython文件中,需要使用redis-py库连接到Redis: ```python import redis redis_client = redis.Redis(host='localhost', port=6379, db=0) ``` 其中,host为Redis服务器的地址,port为端口号,db为Redis数据库的编号。 4. 设置缓存 使用set方法设置缓存: ```python redis_client.set('key', 'value') ``` 其中,key为键名,value为键值。 5. 获取缓存 使用get方法获取缓存: ```python value = redis_client.get('key') ``` 其中,key为键名,value为键值。 6. 设置缓存过期时间 使用expire方法设置缓存过期时间: ```python redis_client.expire('key', 60) ``` 其中,key为键名,60为过期时间(单位为秒)。 7. 判断缓存是否存在 使用exists方法判断缓存是否存在: ```python if redis_client.exists('key'): value = redis_client.get('key') else: value = some_function() redis_client.set('key', value) ``` 其中,key为键名,some_function()为缓存不存在时需要执行的函数。 8. 删除缓存 使用delete方法删除缓存: ```python redis_client.delete('key') ``` 其中,key为键名。 9. 清空缓存 使用flushdb方法清空缓存: ```python redis_client.flushdb() ``` 注意:该方法会删除Redis中所有的键值对,慎用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 推荐算法-基于矩阵分解的CF算法实现(二):BiasSvd 3463
  • pandas-DataFrame运算 3361
  • redis系列之-更新问题解决方案(数据一致性校正) 3148
  • 推荐系统-基于内容的推荐算法(Content-Based) 3078
  • 即时通讯之Socket.IO协程解决方案(eventlet) 1974

分类专栏

  • python驿站 32篇
  • Linux 6篇
  • 数据库 16篇
  • python 46篇
  • Java
  • 网络编程 13篇
  • web开发 20篇
  • 数据采集
  • 数据分析 18篇
  • 算法和数据结构 11篇
  • 数据挖掘 28篇
  • 深度学习
  • 机器学习 24篇

最新评论

  • 推荐系统算法-基于回归模型的协同过滤推荐

    m_cy: 为啥有同样的版本?

  • pandas-高级处理-分组与聚合

    「已注销」: 博主这个从文件中读取星巴克店铺数据是要先下载数据保存到自己电脑上吗

最新文章

  • 数仓-集群环境搭建
  • Hive-基本操作
  • Hive-基本概念
2019年71篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源姓 马 起名大全团队怎么起名颜姓女儿怎么起名宝宝起名大全免费网站大全奥特曼动画片全集姓李的女孩起名字大全相信自己零点乐队莫氏男孩起名龙凤婴儿起名三青年殴打13岁男孩唯爱侦查山河恋美人无泪演员表空间日志图片岳风柳萱小说父子老爷车怎么起英语名字男孩的英文名字我们的心近了上古卷轴ol黄连厚朴重生之明星模拟游戏草字头的字男孩起名字属牛沈婉宋恒小说全文免费阅读中国起名按照笔画起名有点舍不得的鼠起名禁忌周易取名起名大全测分豪门未婚夫失忆了程姓女宝宝取名起名大全备中的伊达独眼龙淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化