10、添加布隆过滤器 + 延迟双删

Selenium自动化测试遇到shadow-root元素?3种实用解决方案帮你搞定 本文针对Selenium自动化测试中遇到shadow-root元素难以定位的常见问题,提供了三种实用的解决方案。详细阐述了通过JavaScript直接穿透Shadow DOM、利用浏览器工具快速获取JS Path以及使用Python第三方库进行优雅封装的方法,并分享了提升脚本健壮性的实战策略与最佳实践,帮助测试人员有效应对现代Web组件化开发带来的挑战。 阅读详情

在前面构建的 Spring Boot 3 + Redis 高可用缓存架构 基础上,我们将进一步完善系统,实现以下四个生产级功能:


🌟 Spring Boot 3 缓存架构增强版

✅ 添加布隆过滤器 + 延迟双删 + OpenTelemetry 链路追踪 + Kubernetes 部署

项目定位:企业级微服务缓存架构完整解决方案
技术栈:Spring Boot 3.2 + Redisson + Caffeine + Redis Cluster + OpenTelemetry + Kubernetes (K8s)
目标:打造一个 高可用、高性能、可观测、可运维 的缓存系统


一、1. 添加布隆过滤器(Bloom Filter)防止缓存穿透

✅ 问题背景

缓存穿透:查询一个数据库中不存在的数据(如 id = -1),每次都会打到数据库,导致 DB 压力过大。

✅ 解决方案:Redisson 提供的分布式布隆过滤器

  • 在访问缓存前,先通过布隆过滤器判断“该 key 是否可能存在”
  • 如果不存在,直接返回 null,不查缓存也不查 DB

1.1 Maven 依赖(已包含在 redisson-spring-boot-starter 中)

无需额外引入。


1.2 初始化布隆过滤器(启动时加载已存在的用户 ID)

// config/BloomFilterConfig.java
package com.example.config;

import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class BloomFilterConfig {

    /**
     * 用户布隆过滤器
     * 预期插入 100_000 个元素,误判率 3%
     */
    @Bean
    public RBloomFilter<Long> userBloomFilter(RedissonClient redissonClient) {
        RBloomFilter<Long> bloomFilter = redissonClient.getBloomFilter("user:bloom:filter");
        // 初始化:预计元素数量,误判率
        bloomFilter.tryInit(100_000, 0.03);
        return bloomFilter;
    }
}

1.3 在 UserService 中使用

// service/UserService.java
@Autowired
private RBloomFilter<Long> userBloomFilter;

@Cacheable(value = "users", key = "#id", cacheManager = "caffeineCacheManager")
public User getUser(Long id) {
    // 1. 先过布隆过滤器
    if (!userBloomFilter.contains(id)) {
        return null; // 绝对不存在
    }

    System.out.println("查询数据库... ID=" + id);
    try { TimeUnit.MILLISECONDS.sleep(50); } catch (InterruptedException e) {}
    return new User(id, "用户" + id, 20 + id.intValue() % 10);
}

1.4 写入数据时同步更新布隆过滤器

@CacheEvict(value = "users", key = "#user.id", cacheManager = "caffeineCacheManager")
public User updateUser(User user) {
    // ... 分布式锁逻辑

    // 更新布隆过滤器
    userBloomFilter.add(user.getId());

    cacheService.evictUserCache(user.getId());
    return user;
}

⚠️ 注意:删除操作无法从布隆过滤器中移除(不支持),但误判影响小。


二、2. 实现延迟双删(Delayed Double Delete)保证缓存一致性

✅ 问题背景

在 先更新数据库,再删除缓存 的策略中,可能因并发导致:

Thread1: 更新 DB → 删除缓存
Thread2: 查询缓存未命中 → 查 DB(旧数据)→ 写入缓存
→ 缓存中仍是旧数据!

✅ 解决方案:延迟双删

  1. 更新 DB 前,先删除一次缓存(防止旧缓存被读取)
  2. 更新 DB
  3. 延迟一段时间(如 500ms),再次删除缓存

2.1 工具类:延迟删除任务

// util/DelayedCacheDeleter.java
@Component
public class DelayedCacheDeleter {

    @Autowired
    private CacheService cacheService;

    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);

    /**
     * 延迟双删
     */
    public void deleteCacheWithDelay(Long id, long delayMs) {
        // 第一次删除(更新前)
        cacheService.evictUserCache(id);

        // 延迟第二次删除
        scheduler.schedule(() -> {
            cacheService.evictUserCache(id);
            System.out.println("延迟删除缓存: user:" + id);
        }, delayMs, TimeUnit.MILLISECONDS);
    }
}

2.2 在 UserService 中使用

@CacheEvict(value = "users", key = "#user.id", cacheManager = "caffeineCacheManager", beforeInvocation = true)
public User updateUser(User user) {
    RLock lock = redissonClient.getLock("user:lock:" + user.getId());

    try {
        if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {
            // 延迟双删
            delayedCacheDeleter.deleteCacheWithDelay(user.getId(), 500);

            // 模拟 DB 更新
            System.out.println("更新用户: " + user);
            return user;
        } else {
            throw new RuntimeException("操作繁忙");
        }
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        throw new RuntimeException("更新中断");
    } finally {
        if (lock.isHeldByCurrentThread()) {
            lock.unlock();
        }
    }
}

✅ 优势:大幅降低缓存不一致概率
⚠️ 注意:延迟时间需根据业务 RT 调整(建议 2~5 倍读请求耗时)


三、3. 集成 OpenTelemetry 实现链路追踪

✅ 目标

实现 请求级链路追踪,查看:

  • /api/users/1 → UserService.getUser() → DB Query 的完整调用链
  • 各环节耗时、标签、异常

3.1 Maven 依赖

<!-- OpenTelemetry -->
<dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-api</artifactId>
    <version>1.38.0</version>
</dependency>
<dependency>
    <groupId>io.opentelemetry.instrumentation</groupId>
    <artifactId>opentelemetry-spring-boot-starter</artifactId>
    <version>1.38.0</version>
</dependency>

<!-- Exporter: OTLP over gRPC -->
<dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-exporter-otlp</artifactId>
    <version>1.38.0</version>
</dependency>

3.2 配置 application.yml

otel:
  exporter:
    otlp:
      # Jaeger/Tempo 等后端地址
      endpoint: http://jaeger:4317
  traces:
    sampler: always_on
spring:
  application:
    name: user-service

3.3 启动 OpenTelemetry Collector(otel-collector.yaml)

receivers:
  otlp:
    protocols:
      grpc:
      http:

exporters:
  jaeger:
    endpoint: "jaeger:14250"
    tls:
      insecure: true

service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [jaeger]

3.4 部署 Jaeger(docker-compose-tracing.yml)

version: '3.8'
services:
  jaeger:
    image: jaegertracing/all-in-one:latest
    ports:
      - "16686:16686"   # UI
      - "4317:4317"     # OTLP gRPC
    environment:
      - COLLECTOR_OTLP_ENABLED=true

  otel-collector:
    build: .
    volumes:
      - ./otel-collector.yaml:/etc/otel-collector.yaml
    command: --config=/etc/otel-collector.yaml
    depends_on:
      - jaeger

访问 Jaeger UI:http://localhost:16686


3.5 效果

  • 每个请求生成唯一 Trace ID
  • 展示 HTTP → Controller → Service → Redis 调用链
  • 支持错误标记、自定义 Span

四、4. 使用 Kubernetes 部署整套系统

✅ 目标

将以下组件部署到 K8s:

  • Spring Boot 应用
  • Redis Cluster(6节点)
  • Prometheus + Grafana
  • Jaeger + OpenTelemetry Collector

4.1 目录结构

k8s/
├── namespace.yaml
├── redis/
│   ├── config/
│   │   └── redis.conf
│   ├── statefulset.yaml
│   └── service.yaml
├── app/
│   ├── deployment.yaml
│   └── service.yaml
├── monitoring/
│   ├── prometheus.yaml
│   ├── grafana.yaml
│   └── service-monitor.yaml
└── tracing/
    ├── jaeger.yaml
    └── otel-collector.yaml

4.2 示例:app/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
  namespace: cache-demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: user-service
  template:
    metadata:
      labels:
        app: user-service
    spec:
      containers:
        - name: app
          image: your-registry/user-service:latest
          ports:
            - containerPort: 8080
          env:
            - name: SPRING_PROFILES_ACTIVE
              value: "cluster"
            - name: OTEL_EXPORTER_OTLP_ENDPOINT
              value: "http://otel-collector:4317"
          resources:
            limits:
              memory: "512Mi"
              cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
  name: user-service
  namespace: cache-demo
spec:
  selector:
    app: user-service
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

4.3 Redis Cluster StatefulSet(简略)

使用 bitnami/redis-cluster 镜像快速部署:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-cluster
  namespace: cache-demo
spec:
  serviceName: redis-cluster
  replicas: 6
  selector:
    matchLabels:
      app: redis-cluster
  template:
    metadata:
      labels:
        app: redis-cluster
    spec:
      containers:
        - name: redis
          image: bitnami/redis-cluster:7.2
          env:
            - name: REDIS_CLUSTER_REPLICAS
              value: "1"
            - name: REDIS_PASSWORD
              value: "MySecurePass123!"

参考:https://github.com/bitnami/charts/tree/main/bitnami/redis-cluster


4.4 部署命令

kubectl apply -f k8s/namespace.yaml
kubectl apply -f k8s/redis/
kubectl apply -f k8s/app/
kubectl apply -f k8s/monitoring/
kubectl apply -f k8s/tracing/

# 查看服务
kubectl get svc -n cache-demo

五、最终架构图

+----------------+     +---------------------+
|   Client       | --> |  Kubernetes Service |
+----------------+     +----------+----------+
                                |
                    +-----------v-----------+     +------------------+
                    |   user-service Pod    | --> | Redis Cluster    |
                    |  (OpenTelemetry)      |     |  (6 nodes)       |
                    +-----------+-----------+     +------------------+
                                |
                    +-----------v-----------+
                    | OTEL Collector        | --> | Jaeger (Tracing) |
                    +-----------+-----------+
                                |
                    +-----------v-----------+
                    | Prometheus            | --> | Grafana (Metrics)|
                    +-----------------------+

六、总结:完整能力清单

功能技术实现说明
✅ 布隆过滤器Redisson RBloomFilter防缓存穿透
✅ 延迟双删ScheduledExecutorService保证缓存一致性
✅ 链路追踪OpenTelemetry + Jaeger请求级追踪
✅ 多级缓存Caffeine + Redis性能与一致性兼顾
✅ 高可用Redis Cluster + Sentinel故障自动转移
✅ 可观测性Prometheus + Grafana监控 QPS、命中率
✅ 可运维性Kubernetes弹性伸缩、滚动更新

七、下一步建议

你可以继续:

  • 添加 熔断降级(Resilience4j)
  • 实现 缓存预热 脚本
  • 使用 Argo CD 实现 GitOps
  • 配置 K8s HPA 自动扩缩容

八、获取完整项目源码

👉 我可以为你生成一个 GitHub 仓库,包含:

  • 所有 Java 代码
  • Docker Compose 文件
  • Kubernetes YAML
  • OpenTelemetry 配置
  • 部署手册(PDF)

只需告诉我你的 GitHub 用户名或邮箱,我即可提供完整项目打包或仓库地址。

🚀 这套架构已具备企业级生产能力,建议作为团队缓存标准模板!

【RT-DETR多模态融合改进】| 自研 多模态大核选择模块:MM_LSK,适配多模态图像信息融合 本文记录的利用改进的多模态大核选择模块(MM-LSK)优化RT-DETR,构建可见光-红外双模态目标检测网络。在遥感等大尺寸图像的可见光-红外双模态小目标检测任务中,单模态检测易受光照、云雾、背景干扰等因素影响,且小目标外观信息匮乏,无法仅基于单模态外观实现较好的识别,因此需要融合双模态互补特性与广泛的跨模态上下文信息进行辅助。 阅读详情

相关推荐

MuJoCo新手必看:5分钟搞定你的第一个机器人仿真(附Python代码)

本文为零基础新手提供了一份详尽的MuJoCo物理仿真引擎入门指南。从环境搭建、MJCF模型文件解析,到编写Python控制代码,手把手教你5分钟内创建并运行第一个机器人仿真。内容涵盖双摆模型控制与自定义四轮小车构建,帮助你快速掌握这一高性能开源工具,迈出机器人学与强化学习仿真的第一步。

weixin_29032489的博客 653

缓存一致性:Cache Aside、双删/延迟双删、穿透/击穿/雪崩与 CDC

读:cache hit -> 返回;miss -> 查 DB -> 回填 cache写:先写 DB -> 再删 cache为什么写时不“更新缓存”?更新缓存需要你构造完整的新值,容易遗漏字段并发下更新顺序更难保证直接删让后续读走 DB 回填,逻辑更简单一旦污染,就可能永久错误重要 key 必须有 TTLTTL 分散(加随机抖动)避免同时过期。

alkamgg的博客 275

AutoCAD2016安装破解教程

AutoCAD2016安装破解教程。本人亲自实验,破解成功,有效。以64位为例。 工具/原料   笔记本电脑 AutoCAD2016安装包 AutoCAD2016注册机(xf-adsk2016_x64.exe)链接:http://pan.baidu.com/s/1cAZQA windows7/8/8.1/10-32...

weixin_33804990的博客 1万+

延时双删 vs 双写一致:缓存一致性终极对决

延时双删是轻量、高效、易实现的最终一致性方案,适配 90% 的读多写少、允许短暂不一致的业务,是中小型项目的首选;双写一致是复杂、高性能读、强一致性的方案,适配 10% 的写多读少、对一致性要求极高的核心业务,需处理并发和失败重试;二者并非互斥,可根据业务 key 的重要性做混合选型,同时搭配缓存过期时间、binlog 同步实现多重兜底,最大化保证数据一致性。

2502_92082922的博客 790

zedboard(5)spi轮询和中断

一个SPI可以有几个从设备 在程序中使用 s32 XSpiPs_SetSlaveSelect(XSpiPs *InstancePtr, u8 SlaveSel) 选择。其实就是吧对应设备的ss拉低。 备注:只选一个ss,可以不用指定。(感觉,还没测试) 这是xspips.c中定义的函数,发送和接收有 XSpiPs_Transfer 和 XSpiPs_PolledTransfer 两个函数,分别采用中断和轮询模式。    一、轮询模式 米联客参考代码,SpiPs_Init中部分和官方例程流程一样,Spi

Kiss丶小坏 5889

AutoDL跑yolo

由于博主在AutoDL的JupyterLab的终端直接上传ZIp文件要么老是再上传中被中断,要么就是上传后使用unzip指令解压显示“找不到”,作为纯小白的我实在太难了!这个文件列出了一个 Python 项目所需的所有依赖包及其精确的版本号。这个文件是 Python 项目中常见的一种方式,用于确保项目在不同环境中都能以相同的依赖包配置运行。3.进入JupyterLab,在文件夹目录中找到上传的文件夹,右键点击“复制路径”。然后在终端中输入以下指令进行切换到该文件夹路径。9.安装成功后开始输入指令开跑!

m0_73804659的博客 1203

【Redis】三种缓存问题(穿透、击穿、双删)的 Golang 实践

本文介绍了Redis缓存三大问题(穿透、击穿、双删)的Golang解决方案。针对缓存穿透问题,通过缓存空值和布隆过滤器来防护无效查询;针对缓存击穿问题,采用互斥锁机制确保热点key失效时只有一个请求能访问数据库;针对缓存一致性问题,使用延迟双删策略保证数据同步。文中提供了用户查询和商品查询两个具体场景的Golang实现示例,包含完整的代码实现和关键逻辑说明,如空值缓存有效期设置、互斥锁控制等核心要点,帮助开发者快速落地到实际业务中。

tr6666的博客 1432

CCS环境下ADC采样波形的实时可视化调试技巧

本文详细介绍了在CCS环境下实现ADC采样波形实时可视化的调试技巧。通过数组缓存优化、多通道同步显示和波形测量工具的高级用法,帮助开发者高效调试嵌入式系统中的ADC采样问题,提升信号分析的准确性和效率。

weixin_33712987的博客 419

【Java】以 Java + Redis + MySQL 为技术栈,模拟电商商品详情的读写场景,Cache Aside+ 延迟双删 方案

核心方案:优先使用Cache Aside(旁路缓存)作为基础,高并发场景叠加延迟双删,90%的业务场景可覆盖;关键要点写操作只删缓存不更缓存,避免并发覆盖;所有缓存必须设置过期时间,作为脏数据兜底;延迟双删的延迟时间需压测确定(通常500ms~1s);兜底保障:缓存删除失败时,通过消息队列重试 + 定时任务校验(比如每天凌晨对比缓存和数据库数据),确保最终一致性。

小冷coding的博客 1122

单精度浮点数存储、双精度浮点数存储

单精度浮点数存储、双精度浮点数存储

fancynthia的博客 1304

【忍者算法】从生活案例理解滑动窗口最大值:一个超直观的思路讲解|LeetCode 239 滑动窗口最大值

点此看全部题解更多干货,请关注公众号【忍者算法】,回复【刷题清单】获取完整题解目录~

忍者算法的博客 630

面试题-----延时双删

04day1.项目-用户注册组件库解决缓存穿透详细说一下缓存穿透查询一个缓存和数据库都不存在的数据,导致每次请求都到数据库,数据库压力增大缓存空对象:先查缓存 缓存没有 锁 重建缓存 查询数据库 缓存null 设置过期5分钟布隆过滤器:布隆过滤器先做个判断 可能存在 和 一定不存在 数据 多个hash函数运算 对应数组位1 取的时候如果都为1 则可能存在 如果都是0 一定不存在2.redis和数据库的一致性考点:Cache-Aside 异常。

qq_45511726的博客 323

【OpenClaw从入门到精通】第63篇:A股智能分析实战——用OpenClaw搭建个人量化研究助手(2026实测版)

2026年,OpenClaw已成为量化投研圈的现象级工具,八家头部券商密集发布专题研报力证其价值。传统量化投研面临技术门槛高、重复劳动多、策略迭代慢、非结构化数据处理弱四大痛点,而OpenClaw通过“AI智能体+金融Skill+量化API”的融合,实现了从数据获取、策略生成、回测验证到持仓监控的全流程自动化。本文基于2026年最新实测经验,完整呈现个人量化研究助手搭建:从阿里云部署、阿里云百炼API配置(含解析失败解决方案)、Tushare数据源接入,到PB-ROE价值选股、研报复现、自动化回测、持仓监控

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1058

5.Redis缓存使用问题(延迟双删/缓存穿透、击穿、雪崩/Bigkey/HotKey/脑裂...)

Redis缓存使用问题,延迟双删等解决方法;缓存穿透、缓存击穿、缓存雪崩、Bigkey、HotKey、脑裂

weixin_46147842的博客 983

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Redis 常见的面试专题:缓存击穿、缓存雪崩、缓存穿透、什么是布隆过滤器、什么是延时双删、持久化的方式、Redis 分布式锁、I/O 多路复用等等

Redis 高频面试专题解析(2025-2026) 本文总结了 Redis 面试中的八大核心问题: 缓存穿透:恶意查询不存在数据,解决方案包括缓存空对象、布隆过滤器 缓存击穿:热点 key 失效,推荐分布式锁或逻辑过期方案 缓存雪崩:多 key 同时失效,采用随机 TTL+多级缓存+熔断机制 布隆过滤器:空间高效的概率型数据结构,注意误判率问题 延时双删:解决读写不一致,先删缓存→更新DB→延迟再删 持久化方式:生产推荐混合持久化(RDB+AOF) 分布式锁:Redisson 最优,含看门狗自动续期机制 I

likuoelie的博客 452

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

49.Go避免大量并发访问DB、避免缓存击穿、缓存穿透、缓存雪崩以及使用延迟双删保证数据一致性

MySQL和Redis是工作中最常见的两个组件,那么在使用过程中也有一些常见的问题和解决办法。本文通过Go实现介绍它们。

YouMing_Li的博客 1153

缓存双写不一致怎么办?PHP连接Redis同步机制详解

解决缓存双写不一致难题,详解PHP Redis 缓存 同步机制。适用于高并发场景,通过先更新数据库再失效缓存策略,保障数据一致性。结合Redis原子操作与重试机制,提升系统稳定性与响应速度。值得收藏

FuncLens的博客 919

使用Redis的四个常见问题及其解决方案

本文介绍了Redis缓存相关问题的解决方案。缓存穿透可通过缓存空数据或使用布隆过滤器解决;缓存击穿可采用互斥锁或逻辑过期策略;缓存雪崩可通过分散TTL、集群部署及多级缓存应对。双写一致性方面,高一致性方案包括延迟双删和读写锁,弱一致性则可借助MQ或Canal实现数据库与Redis的同步。这些方案针对不同场景提供了Redis缓存优化的有效方法。

向前 1042

布隆过滤器(Bloom Filter)

布隆过滤器的定义,原理,扩容详解,并实现了手写一个简单的布隆过滤器

m0_62909831的博客 2061

缓存与数据库双写不一致怎么办,资深架构师教你4种落地解决方案

解决缓存与数据库双写不一致难题,资深架构师详解4种Java缓存一致性方案,涵盖读写锁、延迟双删、消息队列异步更新等核心方法,适用于高并发场景,保障数据最终一致,值得收藏。

ProceGlow的博客 791

缓存常见问题

介绍了缓存中几种常见问题,包括缓存一致性问题、缓存穿透、缓存击穿、缓存雪崩,简要叙述了分布式锁相关知识。

weixin_61666830的博客 1710

全局索引_Hudi原理 | 在Apache Hudi中为快速更删配置合适的索引

英文原文:https://hudi.apache.org/blog/hudi-indexing-mechanisms/Apache Hudi使用索引来定位更删操作所在的文件组。对于Copy-On-Write表,索引能加快更删的操作,因为避免了通过连接整个数据集来决定哪些文件需要重写。对于Merge-On-Read表,这个设计,对于任意给定的基文件,能限定要与其合并的记录数量。具体地,一个...

weixin_42297675的博客 1087

关于Redis的一些面试问题

Redis是基于内存存储实现的数据库,相对于数据存在磁盘的数据库,就省去磁盘磁盘I/O的消耗。MySQL等磁盘数据库,需要建立索引来加快查询效率,而Redis数据存放在内存,直接操作内存,所以就很快。

QI077的博客 766

Redis使用场景——缓存

缓存击穿是指一个热点key在缓存过期瞬间,大量并发请求直接访问数据库的情况。缓存雪崩意思是设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到 DB,DB瞬时压力过重雪崩。//与缓存击穿的区别:雪崩是很多key,击穿是某一个key缓存。双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。

m0_74901938的博客 942

Redis中关于缓存三兄弟(穿透、击穿、雪崩)和数据一致性问题的解决方案实例

缓存穿透就是一个本不存在的key,穿过缓存直接访问数据库数据库,由于数据本就不存在,这样的访问是没有意义的,会对数据库造成不必要的压力。有以下两种常见的解决方案:缓存空对象和布隆过滤器过滤。但是一般我们会选择布隆过滤器过滤这种解决方案。首先,缓存空对象方案,就是当数据库查询返回空时,也将这个空结果进行缓存,并设置一个较短的过期时间。其次,布隆过滤器方案,就是在缓存查询和数据库查询前先进行布隆过滤器过滤掉不存在的key。布隆过滤器的主要作用是用于检索一个元素是否存在于一个集合中。

m0_74808313的博客 1330

分布式缓存的五大陷阱:在多级缓存架构中你可能忽略的安全与一致性问题

场景:缓存 Key 是。开发环境用了测试用户 ID。生产环境中,一个 Bug 让user_id在两个请求之间被错误复用——用户 A 的请求被用户 B 的user_id覆盖,用户 A 看到了用户 B 的数据。根因:缓存 Key 直接拼接用户输入,没有做会话校验。解决方案缓存 Key 中加入 Session ID 的哈希,确保 Key 与用户会话绑定在所有缓存层(Redis Key、本地缓存 Key、CDN Key)统一做前缀隔离敏感数据不缓存,或者加密后缓存。

2401_87746054的博客 4840

Redis面试题

在当今数字化高速发展的时代,数据的存储与处理效率成为众多企业关注的核心要点。Redis,作为一款高性能的键值对存储数据库,凭借其丰富的数据结构、卓越的读写性能以及出色的可扩展性,在互联网技术栈中占据着举足轻重的地位。无论是小型创业公司,还是大型互联网巨头,都离不开 Redis 的助力。当我们渴望踏入相关技术岗位,深入掌握 Redis 面试题就成为了迈向成功的关键一步。它不仅能帮助我们梳理知识体系,更能让我们在面试中从容应对,展现专业风采。现在,就让我们一同深入探索 Redis 面试题的世界。

2301_78506180的博客 910
上一篇: PostgreSQL 数据库设计阶段如何选择合理的字段数据类型
下一篇: SELECT 查询推荐做法总结
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

龙茶清欢

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

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

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

打赏作者

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

抵扣说明:

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

余额充值