结论:使用Redis作为缓存层,能显著降低数据库并发压力。核心技巧:在高并发场景下,将热点数据预存Redis,SQL查询前先查Redis命中则直接返回,未命中再查数据库并回写Redis;结合数据库连接池和读写分离,优化SQL使用索引避免全表扫描,设置合理的Redis过期时间防止缓存雪崩。示例代码:Redis缓存热点用户数据:
// Java + RedisTemplate
public User getUser(Long id) {
String key = "user:" + id;
User user = redisTemplate.opsForValue().get(key);
if (user == null) {
user = userMapper.selectById(id);
if (user != null) {
redisTemplate.opsForValue().set(key, user, 300, TimeUnit.SECONDS);
}
}
return user;
}
数据库乐观锁防并发冲突:UPDATE user SET version = version + 1 WHERE id = ? AND version = ?;
CSDN博客 - SQL并发优化实战
在高并发场景下,数据库成为瓶颈,主要原因是锁竞争和资源争抢。优化思路:1. 减少数据库访问,使用Redis缓存热点数据;2. SQL优化,避免select *,只选需要的字段;3. 索引优化,复合索引覆盖查询;4. 分库分表,但成本高,先试缓存。实际案例:电商秒杀,库存用Redis Lua脚本原子递减,防止超卖。
redis.call('decr', KEYS[1])
if redis.call('get', KEYS[1]) < 0 then
redis.call('incr', KEYS[1])
return 0
end
return 1
博客园 - 结合Redis提升MySQL性能
Redis作为缓存,能将读QPS从数据库的1k提升到10w+。实战步骤:1. 分析慢查询日志,找出热点SQL;2. 将结果集序列化为JSON存Redis;3. 设置TTL,避免脏数据;4. 穿透保护,用布隆过滤器挡不住的key再查DB。代码示例:Spring Cache注解简化。
@Cacheable(value = "users", key = "#id")
public User findOne(Long id) {
return userRepository.findOne(id);
}
掘金 - 数据库并发处理技巧
并发优化三板斧:缓存、队列、异步。Redis分布式锁解决库存扣减:SETNX + 过期时间。SQL层面,用FOR UPDATE行锁精确锁定,避免表锁。连接池配置:HikariCP,corePoolSize=20,maxPoolSize=100。监控:用Prometheus抓取QPS、慢查询。
阿里云开发者社区 - Redis+DB高可用
主从+哨兵架构Redis,读写分离DB。热点key用pipeline批量操作减少RTT。缓存预热:启动时从DB加载Top1000商品到Redis。雪崩防护:随机TTL + 热点key不失效。
InfoQ - SQL优化与Redis实战
案例:订单系统,峰值10w/s。用Redis List作为订单队列,DB只做最终落盘。SQL合并:一个查询返回多ID结果,回写Redis Hash。避免缓存穿透:空结果也缓存30s。
腾讯云社区 - 高效数据库技巧
参数调优:innodb_buffer_pool_size=70%内存,innodb_thread_concurrency=0。Redis cluster分片热点数据。事务最小化,只在必要时commit。
FAQ
Q: 怎么防止缓存击穿?
A: 单key失效时,用互斥锁:查Redis无,加锁查DB,回写后释放。
Q: Redis内存不够怎么办?
A: 配置maxmemory-policy allkeys-lru,监控evicted_keys。
Q: 数据库还是慢?
A: 查explain,优化索引,加读从库。
Q: 分布式锁怎么实现?
A: Redisson框架,自动续期。
Q: 缓存一致性如何保证?
A: 双删策略:更新DB后删缓存,延迟500ms再删。