cache贯穿读出和旁路读出
时间: 2025-05-14 09:21:47 浏览: 17
### Cache穿透读取与旁路读取机制
#### Cache穿透读取
Cache穿透是指查询一个不存在的数据,由于缓存中没有该数据记录,请求会直接到达数据库层。如果频繁发生这种情况,可能会给数据库带来较大压力。
为了防止这种现象的发生,通常采取以下措施:
- **布隆过滤器**:在访问缓存之前先经过布隆过滤器判断是否存在此键值对。即使误判率极低的情况下也不会存在假阴性问题[^2]。
- **空对象缓存**:当发现某个key对应的value为空时,则将null或者自定义的对象存储到缓存里一段时间,从而避免相同key再次触发db查询。
```python
def get_data_with_cache_piercing(cache, db, key):
value = cache.get(key)
if value is None:
value = db.query(key)
if not value:
# 设置空对象缓存
cache.set(key, "NULL", timeout=60)
else:
cache.set(key, value)
return value or "Data does not exist"
```
#### 旁路读取(Cache Aside)
旁路读取是一种常见的缓存管理策略,在获取数据前优先尝试从缓存中查找所需资源;若未命中则继续向下游服务发起请求并更新缓存以便后续调用能够快速响应。这种方式使得应用逻辑更加清晰简单,并且易于维护扩展[^1]。
流程如下:
1. 应用程序接收到客户端发来的GET请求;
2. 尝试从缓存系统检索指定ID对应的信息;
3. 如果找到匹配项即刻返回结果给前端展示;
4. 否则转而询问持久化存储设备获得最新版本的内容;
5. 把新取得的结果集塞入临时记忆体供下次查阅使用;
6. 完成整个过程后反馈最终答案至用户界面显示出来。
```python
def fetch_item(item_id):
item = redis_client.get(f'item:{item_id}')
if item is None:
item = database.fetch_by_id(item_id)
if item:
redis_client.setex(f'item:{item_id}', timedelta(hours=1), json.dumps(item))
return item
```
阅读全文
相关推荐













