面试题答案
一键面试缓存工具选择
- Redis:
- 优势:
- 速度极快,基于内存存储,读写性能高,能快速响应缓存查询。
- 支持多种数据结构,如字符串、哈希、列表、集合等,适合不同类型数据的缓存。
- 具备高可用性和分布式特性,可通过集群模式部署,满足大规模应用需求。
- 优势:
- Memcached:
- 优势:
- 简单高效,专注于缓存,在高并发场景下性能卓越。
- 轻量级,资源消耗少,适合对资源要求较高的应用场景。但它仅支持简单的键值对存储,相比Redis功能稍显单一。
- 优势:
结合Flask使用Redis实现缓存
- 安装依赖:
pip install flask redis
- 设置缓存:
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'
- 获取缓存:
@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'
- 更新缓存:
@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'
缓存一致性问题处理
- 缓存过期策略:
- 设置合理的过期时间:对于一些变化频率较低的数据,可以设置较长的过期时间,如24小时或更长。例如,一些配置信息或很少更新的基础数据。对于变化频繁的数据,设置较短的过期时间,如几分钟甚至几十秒。例如,实时的股票价格数据。
- 使用定时任务:可以使用Flask - APScheduler等扩展来定期刷新缓存数据,确保数据的一致性。比如,每小时重新获取一次重要的业务数据并更新到缓存中。
- 写后失效策略:
- 在数据更新操作完成后,立即删除对应的缓存数据。例如,当用户在数据库中更新了个人信息后,马上删除缓存中存储的该用户信息,这样下次请求该用户信息时,会从数据库中重新获取并更新缓存。
@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'
- 读写锁:
- 如果缓存数据的读写操作非常频繁,且一致性要求极高,可以考虑使用读写锁。在写操作时,获取写锁,禁止其他读写操作,确保数据更新的原子性。读操作时,获取读锁,可以允许多个读操作同时进行。在Python中,可以使用
threading.Lock
(适用于单进程多线程场景)或基于Redis的分布式锁(如redlock - py
库,适用于分布式场景)来实现读写锁机制。
- 如果缓存数据的读写操作非常频繁,且一致性要求极高,可以考虑使用读写锁。在写操作时,获取写锁,禁止其他读写操作,确保数据更新的原子性。读操作时,获取读锁,可以允许多个读操作同时进行。在Python中,可以使用