5、Redis 缓存设计相关知识点

news/2024/7/8 3:24:22 标签: 缓存, redis, 数据库
redis-缓存设计相关知识点">1. 多级缓存架构

多级缓存架构是一种通过在应用层和数据库层之间添加多个缓存层来提高系统性能和可用性的架构设计。这种设计能够有效减少数据库负载,并提高数据访问速度。常见的多级缓存包括本地缓存、分布式缓存数据库缓存

  • 本地缓存:本地缓存位于应用服务器本地,响应速度最快,但容易出现缓存不一致问题。适用于频繁访问且变动较小的数据,如配置文件和常量数据。本地缓存可以使用如Ehcache、Guava Cache等实现。
  • 分布式缓存:分布式缓存如Redis和Memcached,适用于需要跨多个服务器共享的缓存数据。它们具有高可用性和可扩展性,能够支持大量并发访问。分布式缓存通过数据分片和复制机制确保数据的高可用性。
  • 数据库缓存:一些数据库如MySQL和PostgreSQL内置缓存机制,用于减少磁盘I/O,提高查询效率。数据库缓存适用于需要频繁查询且数据变化较少的场景。

多级缓存架构的主要优点在于能够充分利用不同缓存层的优势,实现数据访问的快速响应和高可用性。

缓存穿透">2. 缓存穿透

缓存穿透是指查询一个根本不存在的数据,由于缓存层和存储层都不会命中,导致每次请求都必须直接查询数据库缓存穿透的主要原因包括业务代码问题和恶意攻击。

  • 缓存空对象:在查询不到数据时,将空结果也缓存起来,并设置一个短暂的过期时间。这样后续对同一数据的查询可以直接返回空结果,减少数据库查询。例如,当查询一个不存在的用户时,可以将查询结果(空对象)缓存,并设置一个较短的过期时间,如5分钟。
  • 布隆过滤器:布隆过滤器是一种占用较小空间的概率型数据结构,可以快速判断某数据是否可能存在。在查询缓存之前,通过布隆过滤器判断数据是否存在,减少无效的数据库查询。布隆过滤器由一个位数组和多个无偏哈希函数组成,能够高效过滤不存在的数据。

示例代码:

// 布隆过滤器示例
RBloomFilter<String> bloomFilter = redisson.getBloomFilter("nameList");
bloomFilter.tryInit(100000000L, 0.03);

// 添加数据到布隆过滤器
bloomFilter.add("exampleKey");

// 查询时先判断布隆过滤器
if (!bloomFilter.contains("exampleKey")) {
    // 该key不存在,直接返回
    return null;
}

通过缓存空对象和布隆过滤器,可以有效减少缓存穿透问题,保护数据库免受大量无效查询的压力。

缓存击穿">3. 缓存击穿

缓存击穿是指缓存中的某个热点数据在失效的瞬间,大量请求同时查询该数据,导致数据库压力骤增。缓存击穿问题通常发生在高并发场景下,当某个热点数据的缓存突然失效,所有请求都直达数据库,可能导致数据库宕机。

  • 设置不同的过期时间:在批量增加缓存时,设置不同的过期时间,避免大批量缓存同时失效。例如,可以将缓存的过期时间设置为300秒到600秒之间的随机值,这样可以分散缓存失效的时间点,避免缓存击穿。
  • 互斥锁机制:在缓存失效时,通过互斥锁机制只允许一个线程重建缓存,其他线程等待缓存重建完成后再读取缓存。互斥锁机制可以防止多个线程同时访问数据库重建缓存,从而减少数据库压力。

示例代码:

String get(String key) {
    // 从缓存中获取数据
    String cacheValue = cache.get(key);
    if (cacheValue == null) {
        // 只允许一个

http://www.niftyadmin.cn/n/5536152.html

相关文章

梧桐数据库:存算分离和存算一体架构的分布式数据库技术分析

摘要&#xff1a; 随着数据量的不断增长和对数据处理性能的要求越来越高&#xff0c;分布式数据库技术成为了数据存储和处理的重要解决方案。存算分离和存算一体是两种常见的分布式数据库架构&#xff0c;它们在数据存储和计算方面有着不同的特点和优势。本文将对存算分离和存算…

bcc python开发示例

文章目录 1. hello_world.py2. hello_fields.py3. sync_timing.py4. disksnoop.py5. hello_perf_output.py6. bitehist.py7. vfsreadlat.py8. urandomread.py9. strlen_count.py10. nodejs_http_server.py11. task_switch.c12. 监视 do_execve 1. hello_world.py from bcc imp…

【Oracle】Oracle常用语句大全

目录 创建/删除数据库创建/删除表其他表操作增加字段修改字段重命名字段删除字段 主键/索引/视图相关数据插入数据更新数据删除字段拼接merge into语法案例素材同时更新和插入记录同步错误 分页查询分组查询/筛选排序连接查询1. 内连接&#xff08;INNER JOIN&#xff09;&…

嵌入式Linux:ARM体系简介

目录 1. 体系结构 2. 指令集 3. 工作状态 4. 工作模式 5. 寄存器 6. 异常与中断 其他 DOS命令 Linux 命令 1. 体系结构 冯-诺依曼体系结构是把数据与指令都 存放在同一存储区域,取数据与取指令利用同一数据总线,结构简单,但速度较慢,取址不能同时取数据。 哈弗结构…

JavaScript如何声明json对象

在JavaScript中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;对象实际上是以JavaScript对象的形式表示的。JSON是一种轻量级的数据交换格式&#xff0c;它基于ECMAScript&#xff08;欧洲计算机协会制定的js规范&#xff09;的一个子集&#xff0c;采用…

vue 组件el-tree添加结构指示线条

效果展示: 注意&#xff1a;组件中需要添加:indent"0" 进行子级缩进处理&#xff0c;否则会出现子级缩进逐级递增 :expand-on-click-node"false" 设置点击箭头图标才会展开或者收起 代码&#xff1a; <el-tree class"tree filter-tree" :da…

elementUI中table组件固定列时会渲染两次模板内容问题

今天在使用elementUI的table组件时&#xff0c;由于业务需要固定表格的前几项列&#xff0c;然后获取表格对象时发现竟然有两个对象。 查阅资料发现&#xff0c;elementUI的固定列的实现原理是将两个表格拼装而成&#xff0c;因此获取的对象也是两个。对于需要使用对象的方法的…

Modbus通信协议学习——调试软件

Modbus通信协议是一种广泛应用于工业自动化领域的串行通信协议&#xff0c;由Modicon公司&#xff08;现为施耐德电气Schneider Electric&#xff09;于1979年开发。该协议已成为工业电子设备之间通信的通用标准&#xff0c;支持多种设备和系统之间的数据交换。以下是对Modbus通…