Redis实战——缓存穿透

什么是缓存穿透?

缓存穿透是指客户端请求的数据在缓存和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。如果这些不存在的数据被大量恶意的访问,就会增加数据库和服务器的压力。

如何解决缓存穿透

常见的解决方案有两种:

缓存空对象
  • 优点:实现简单,维护方便
  • 缺点:
    1、额外的内存消耗
    2、可能造成短期缓存和数据库数据不一致的情况
布隆过滤
  • 优点:内存占用较少,没有多余key
  • 缺点:
    1、实现复杂
    2、存在误判可能:布隆过滤是通过将每个插入数据库的值转化成对应的哈希值,在把哈希值转成对应的二进制,并在对应的二进制位上标记该数据是否存在,因存在哈希冲突,故可能出现误判,即布隆判断数据存在,其不一定存在
    在这里插入图片描述
缓存空对象的实现示例

在这里插入图片描述

@Service
public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService {
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Override
    public Result queryById(Long id) {
        String key = CACHE_SHOP_KEY + id;
        //1.从redis查询商铺缓存
        String shopJson = stringRedisTemplate.opsForValue().get(key);
        //2.判断是否存在
        if (StrUtil.isNotBlank(shopJson)) {
            //3.存在 直接返回
            Shop shop = JSONUtil.toBean(shopJson, Shop.class);
            return Result.ok(shop);
        }
        //判断命中是否是空值
        if (shopJson != null){
            return Result.fail("店铺不存在");
        }
        //4.不存在 根据id查询数据库
        Shop shop = getById(id);
        //5.数据库不存在 返回错误
        if (shop == null) {
            //解决缓存穿透1
            //将空值写入redis
            stringRedisTemplate.opsForValue().set(key,"",CACHE_NULL_TTL, TimeUnit.MINUTES);
            return Result.fail("店铺不存在");
        }
        //6.存在 写入redis
        stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop),CACHE_SHOP_TTL, TimeUnit.MINUTES);
        //7.返回
        return Result.ok(shop);
    }
   }

<think>好的,我现在需要处理用户关于Redis学习路径和资源的请求。首先,我得确认用户的需求,他们想要从入门到精通的学习路线图,以及相关资源。用户可能对Redis有一定的了解,但需要系统化的指导。 首先,我应该回忆一下Redis的基础知识,比如数据结构、持久化、高可用等。然后考虑学习路径的步骤,通常是从安装配置开始,接着是核心概念,再深入高级特性和实战应用。同时,用户可能需要资源推荐,比如官方文档、书籍、在线课程等。 接下来,我需要确保回答结构清晰,分阶段进行,每个阶段包含关键知识点和推荐资源。同时,根据系统级指令,要正确使用LaTeX格式,特别是行内数学表达式用$...$,独立公式用$$...$$,但Redis内容可能涉及较少的数学公式,不过如果有性能分析或算法部分可能需要用到。 还要注意引用用户提供的三个引用内容。引用[1]是关于启动Redis的命令,引用[2]和[3]是关于学习路线和方法论的。在回答中需要自然地融入这些引用,例如在安装配置阶段提到引用[1],在整体学习路径上参考引用[2]和[3]的建议。 然后,生成相关问题,可能需要考虑Redis的应用场景、性能优化、常见问题解决等。确保问题相关且有针对性。 最后,检查LaTeX语法是否正确,回答是否用中文,结构是否清晰,是否覆盖用户需求的所有方面,并确保引用正确无误。</think>### Redis 学习路线图(入门到精通) #### **阶段一:基础入门(1-2周)** 1. **Redis简介与安装配置** - 了解Redis的特性(内存数据库、高性能、支持多种数据结构)[^1] - 安装Redis:通过源码编译或包管理器(如`apt-get`) - 启动服务:`redis-server redis.conf`(参考引用[1]的启动命令) - 基础命令:`SET`, `GET`, `EXPIRE`, `KEYS`等 2. **核心数据结构** - 字符串(String):`$O(1)$`时间复杂度的读写操作 - 哈希(Hash):存储对象属性,如`HSET user:1 name "Alice"` - 列表(List):支持双向操作,实现队列或栈 - 集合(Set)/有序集合(Sorted Set):去重与排序场景 - 流(Stream):消息队列的实现 ```bash # 示例:使用Redis CLI操作哈希 127.0.0.1:6379> HSET user:1000 name "Bob" age 30 (integer) 2 ``` --- #### **阶段二:进阶掌握(2-4周)** 1. **持久化与高可用** - **RDB**:定时快照,适合灾难恢复 - **AOF**:日志追加,保证数据一致性 - **主从复制**:`REPLICAOF`命令配置从节点 - **哨兵(Sentinel)**:自动故障转移,实现高可用 2. **性能优化** - 内存管理:通过`maxmemory`限制内存,结合淘汰策略(如`allkeys-lru`) - 管道(Pipeline):减少网络往返时间,提升吞吐量 - 集群模式(Cluster):分片存储,支持横向扩展 $$ \text{吞吐量提升} \propto \frac{\text{命令批量处理}}{\text{网络延迟}} $$ --- #### **阶段三:实战与源码(4-8周)** 1. **应用场景实战** - 缓存设计:结合`EXPIRE`与缓存击穿/穿透/雪崩解决方案 - 分布式锁:`SETNX`或RedLock算法 - 实时排行榜:使用有序集合(如`ZADD leaderboard 1000 "PlayerA"`) 2. **源码学习与调优** - 阅读Redis核心模块源码(如`dict.c`哈希表实现) - 性能调优工具:`redis-benchmark`, `INFO`命令监控 --- #### **学习资源推荐** 1. **官方文档**:[Redis Documentation](https://redis.io/documentation)(必读) 2. **书籍**: - 《Redis设计与实现》——深入数据结构与内部机制 - 《Redis实战》——案例驱动学习 3. **在线课程**: - Udemy: [Redis Complete Guide](https://www.udemy.com/course/redis-complete-guide/) - 极客时间:《Redis核心技术与实战》 4. **社区**: - GitHub仓库:[redis/redis](https://github.com/redis/redis) - Stack Overflow的`redis`标签 > 提示:学习过程中需结合实践,如搭建个人项目或参与开源贡献(参考引用[2]的“勇于实践”建议)[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

池池水上鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值