MST

星途 面试题库

面试题:Python的Flask构建RESTful API如何实现高效的缓存机制

在基于Flask构建的RESTful API项目里,为了提升性能,需要实现缓存机制。请说明你会选择哪些缓存工具(如Redis等),并详细描述如何结合Flask进行缓存的设置、获取与更新操作,以优化API响应速度,同时要考虑缓存一致性问题。
41.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

缓存工具选择

  1. Redis
    • 优势
      • 速度极快,基于内存存储,读写性能高,能快速响应缓存查询。
      • 支持多种数据结构,如字符串、哈希、列表、集合等,适合不同类型数据的缓存。
      • 具备高可用性和分布式特性,可通过集群模式部署,满足大规模应用需求。
  2. Memcached
    • 优势
      • 简单高效,专注于缓存,在高并发场景下性能卓越。
      • 轻量级,资源消耗少,适合对资源要求较高的应用场景。但它仅支持简单的键值对存储,相比Redis功能稍显单一。

结合Flask使用Redis实现缓存

  1. 安装依赖
    pip install flask redis
    
  2. 设置缓存
    from flask import Flask
    import redis
    
    app = Flask(__name__)
    r = redis.Redis(host='localhost', port=6379, db = 0)
    
    @app.route('/cache - set/<key>/<value>')
    def set_cache(key, value):
        r.set(key, value)
        return 'Cache set successfully'
    
  3. 获取缓存
    @app.route('/cache - get/<key>')
    def get_cache(key):
        data = r.get(key)
        if data:
            return data.decode('utf - 8')
        else:
            return 'Cache not found'
    
  4. 更新缓存
    @app.route('/cache - update/<key>/<value>')
    def update_cache(key, value):
        if r.exists(key):
            r.set(key, value)
            return 'Cache updated successfully'
        else:
            return 'Cache not found, cannot update'
    

缓存一致性问题处理

  1. 缓存过期策略
    • 设置合理的过期时间:对于一些变化频率较低的数据,可以设置较长的过期时间,如24小时或更长。例如,一些配置信息或很少更新的基础数据。对于变化频繁的数据,设置较短的过期时间,如几分钟甚至几十秒。例如,实时的股票价格数据。
    • 使用定时任务:可以使用Flask - APScheduler等扩展来定期刷新缓存数据,确保数据的一致性。比如,每小时重新获取一次重要的业务数据并更新到缓存中。
  2. 写后失效策略
    • 在数据更新操作完成后,立即删除对应的缓存数据。例如,当用户在数据库中更新了个人信息后,马上删除缓存中存储的该用户信息,这样下次请求该用户信息时,会从数据库中重新获取并更新缓存。
    @app.route('/update - user - info/<user_id>/<new_info>')
    def update_user_info(user_id, new_info):
        # 假设这里有更新数据库的操作
        # 更新数据库后删除缓存
        r.delete(f'user:{user_id}')
        return 'User info updated and cache invalidated'
    
  3. 读写锁
    • 如果缓存数据的读写操作非常频繁,且一致性要求极高,可以考虑使用读写锁。在写操作时,获取写锁,禁止其他读写操作,确保数据更新的原子性。读操作时,获取读锁,可以允许多个读操作同时进行。在Python中,可以使用threading.Lock(适用于单进程多线程场景)或基于Redis的分布式锁(如redlock - py库,适用于分布式场景)来实现读写锁机制。