0%

缓存问题详解

一、缓存穿透(查不存在的数据)

问题描述:请求查询数据库中根本不存在的数据(比如ID=-1的数据),导致每次请求都绕过缓存直接访问数据库。

解决方案

  1. 缓存空对象
    • 原理:即使数据库查询为空,也把这个”空结果”缓存起来(例如存为null
    • 示例代码:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      // 伪代码示例
      Object data = cache.get(key);
      if(data == null) {
      data = db.query(key);
      if(data == null) { // 数据库也没有
      cache.set(key, "NULL", 300); // 缓存空值5分钟
      } else {
      cache.set(key, data, 3600); // 缓存真实数据1小时
      }
      }
      return data.equals("NULL") ? null : data;
    • 注意事项:要给空值设置较短的TTL(如5分钟),避免占用太多内存
阅读全文 »

Java反射入门

反射基础概念

反射(Reflection)是Java语言的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类或对象的属性、方法。

核心特点

  • 运行时获取类的完整结构信息

  • 动态创建对象实例

  • 动态调用方法和访问属性

  • 绕过访问权限检查(访问私有成员)

    阅读全文 »

索引结构详解

B树

  • 结构:B树的每个节点都存储键值和数据。

B+树

  • 结构:B+树的非叶子节点仅存储键值信息,不存储数据,叶子节点存储所有数据,并且叶子节点之间通过指针相连。
  • 性能:B+树的非叶子节点不存储数据,仅用于索引,容纳更多的键值,这使得树的高度更低,减少了磁盘I/O操作。叶子节点的链表结构使得范围查询更加高效。这使得B+树在数据库索引中更为常用,InnoDB数据引擎默认使用B+树作为索引结构。
阅读全文 »


1. RDB(Redis Database Backup)工作流程

(1)触发机制

RDB 快照的生成可以通过以下几种方式触发:

  • 自动触发
    • 根据配置文件中的 save 指令触发。例如:
      1
      2
      3
      save 900 1       # 如果900秒内至少有1个键被修改,则触发快照
      save 300 10 # 如果300秒内至少有10个键被修改,则触发快照
      save 60 10000 # 如果60秒内至少有10000个键被修改,则触发快照
      当满足上述条件之一时,Redis 会自动触发一次快照操作。
    • 在 Redis 重启时,如果配置了 save 指令,Redis 会自动加载 .rdb 文件恢复数据。
      阅读全文 »

序言:呜呼,天不生春,通用技术如万古长夜

女同学面前我春风得意,男同学面前我重拳出击

传说在开天辟地之时,诞生了一位通用技术祖先,他的名字是春。与其他通用技术老师不同,别的老师教科书里记载的是通用技术,而春的教科书里记载的却是仙术

阅读全文 »

多年以后,面对理发店,沈将军将会回想起通用技术祖先被学生批斗的那个遥远的下午。

“你被解雇了,春!”,一个领头的学生站在高台上,她的声音在操场上回荡,引起一片附和的喧嚣。

就在春老师微微愣神的瞬间,一个黄毛学生趁机跃起,灵巧地夺过了他那顶鸭舌帽,在手中把玩着。春光滑的头顶瞬间暴露在阳光下,反射出一道刺眼的光芒。顿时,欢笑声四散开来,操场上充满了快活的气息。

阅读全文 »