什么时候该加缓存而不是索引?
当查询是主键精确查找或高频读多写少的场景时,优先考虑加缓存;而范围查询、复杂条件过滤或需要强一致性的数据则应使用索引。缓存适合解决读取性能瓶颈,通过内存空间换取时间,减少数据库压力;索引适合优化sql执行计划,加速磁盘数据的定位。如果数据访问呈现明显的局部性热点,且允许一定的最终一致性,加缓存的收益远高于单纯建立索引。

import time
import hashlib
class SimpleCache:
def __init__(self, max_size=100):
self.cache = {}
self.max_size = max_size
def get(self, key):
if key in self.cache:
return self.cache[key]['value'], True
return None, False
def set(self, key, value):
if len(self.cache) >= self.max_size:
# 简单LRU模拟:删除第一个插入的(实际应维护顺序)
oldest_key = next(iter(self.cache))
del self.cache[oldest_key]
self.cache[key] = {
'value': value,
'timestamp': time.time()
}
# 模拟热点数据判断逻辑
def is_hot_data(key, access_count_threshold=100):
# 假设有一个全局计数器
global access_counts
count = access_counts.get(key, 0)
return count > access_threshold
access_counts = {}
# 模拟高并发读取
for i in range(1000):
key = f"user_{i % 10}" # 只有10个用户ID被反复访问
access_counts[key] = access_counts.get(key, 0) + 1
hot_keys = [k for k, v in access_counts.items() if v > 100]
print(f"Hot keys: {hot_keys}")
上述代码展示了如何统计访问频率并识别热点Key。在实际系统中,通常结合Redis的INCR命令或本地计数器等手段实时维护热度。对于非热点数据,直接走数据库索引查询即可,避免缓存污染和内存浪费。
热点数据怎么判断?
热点数据通常指在单位时间内被访问次数远超平均水平的数据项。判断方法包括基于访问频率阈值、基于时间窗口内的滑动计数、以及基于数据变更频率的低频特征。例如,商品详情页、新闻头条等属于典型热点,而用户订单详情、日志记录等则相对冷门。通过监控QPS分布,可以动态调整缓存策略。

// Java示例:使用Guava Cache判断热点
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.Cache;
import java.util.concurrent.TimeUnit;
public class HotDataDetector {
private final Cache<string integer> accessCountCache = Caffeine.newBuilder()
.maximumSize(10000)
.expireAfterWrite(1, TimeUnit.MINUTES)
.build();
public void recordAccess(String key) {
accessCountCache.get(key, k -> 0);
int count = accessCountCache.getIfPresent(key);
if (count != null) {
accessCountCache.put(key, count + 1);
} else {
accessCountCache.put(key, 1);
}
}
public boolean isHot(String key) {
Integer count = accessCountCache.getIfPresent(key);
return count != null && count > 100; // 阈值可配置
}
}</string>
该Java示例利用Caffeine缓存自动过期特性,实现了一个简单的滑动窗口计数器。每分钟重置一次计数,超过100次即视为热点。这种方式轻量且高效,适用于大多数微服务架构中的热点检测需求。
基于程序中某个输入、条件或结果的具体问题
当缓存命中率为零且数据库负载极高时,说明未正确识别热点或未启用缓存。此时应检查是否所有高频查询都经过了热点判断逻辑,并确保缓存预热机制已生效。若发现大量冷数据进入缓存导致驱逐频繁,需优化淘汰策略或增大缓存容量。











