【系统分析师】-缓存

news/2024/9/24 20:25:22/

目录

1、常见分类

2、集群切片方式

3、Redis

3.1、分布式存储方式

3.2、数据分片方式

3.3、数据类型

3.4、持久化方案

3.5、内存淘汰机制

3.6、Redis常见问题

4、布隆过滤器


1、常见分类

1、MemCache

Memcache是一个高性能的分布式的内存对象缓存系统,用于动态Web 应用以减轻数据库负载。Memcache通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。

2、Redis

Redis 是一个开源的使用 ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的API。

3、Squid

Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher、HTTPS 和 HTTP 协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、1/0驱动的进程来处理所有的客户端请求。

2、集群切片方式

3、Redis

3.1、分布式存储方式

  1. 主从(Master/Slave)模式:-主多从,故障时手动切换。
     
  2. 哨兵((Sentinel)模式:有哨兵的一主多从,主节点故障自动选择新的主节点。
     
  3. 集群(Cluster)模式:分节点对等集群,分slots,不同slots的信息存储到不同节点。

3.2、数据分片方式

列表分片:属性的离散值,如按城市区域

3.3、数据类型

ZSet 常用命令
ZSCAN迭代有序集合中的元素(包括元素成员和元素分值),也可判断元素是否存在
ZSCORE返回有序集中,成员的分数值
ZRANK返回有序集合中指定成员的索引
ZADD向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZCARD获取有序集合的成员数

3.4、持久化方案

rdb 与 aof

3.5、内存淘汰机制

  1. volatile-lru 从设置过期时间的数据集中挑选出最近最少使用的数据淘汰。
  2. volatile-ttl 除了淘汰机制采用LRU,策略基本上与volatile-lru相似,从设置过期时间的数据集中挑选将要过期的数据淘汰,ttl值越大越优先被淘汰。
  3. volatile-random(过期随机) 从已设置过期时间的数据集中任意选择数据淘汰。
  4. allkeys-lru 从数据集中挑选最近最少使用的数据淘汰,该策略要淘汰的key面向的是全体key 集合,而非过期的key 集合。
  5. allkeys-random(全键随机):从数据集中选择任意数据淘汰。
  6. no-enviction:禁止驱逐数据,也就是当内存不足以容纳新入数据时,禁止新的写入,线上任务也不能持续进行,采用no-enviction策略可以保证数据不被丢失,这也是系统默认的一种淘汰策略。

3.6、Redis常见问题

1)缓存雪崩:大部分缓存失效 ->数据库崩溃

解决方案:

  • 使用锁或队列:保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。
  • 为 key 设置不同的缓存失效时间:在固定的一个缓存时间的基础上+随机一个时间作为缓存失效时间。
  • 二级缓存:设置一个有时间限制的缓存+一个无时间限制的缓存。避免大规模访问数据库。

2)缓存穿透:查询无数据返回->直接查数据库

解决方案:

  • 如果查询结果为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了。设置一个不超过5分钟的过期时间,以便能正常更新缓存
  • 设置布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个 bitmap拦截掉,从避免了对底层存储系统的查询压力。

3)缓存预热
解决方案:

  • 直接写个缓存刷新页面,上线时手工操作。
  • 数据量不大时,可以在项目启动的时候自动进行加载。
  • 定时刷新缓存

4)缓存更新
解决方案:

  • 除 Redis 系统自带的缓存失效策略,常见采用以下两种:定时清理过期的缓存
  • 当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存

4、布隆过滤器

布隆过滤器用于快速识别1个元素不在一个集合中。
通过一个长 二进制向量和一系列 随机映射函数来记录与识别某个数据是否在一个集合中。

http://www.ppmy.cn/news/1517689.html

相关文章

Golang 中的 String、rune 和 byte

解释 String Go语言中,string就是只读的采用utf8编码的字节切片(slice) 因此用len函数获取到的长度并不是字符个数,而是字节个数。 for循环遍历输出的也是各个字节。 rune rune是int32的别名,代表字符的Unicode编码,采用4个字…

学习bat脚本

内容包含一些简单命令或小游戏,在乐趣中学习知识。 使用方法: 新建文本文档,将任选其一代码保存到文档中并保存为ASCII编码。将文件后缀改为.bat或.cmd双击运行即可。 一. 关机脚本 1. 直接关机 echo off shutdown -s -t 00秒直接关机。 2…

停止在 AWS 中使用 SSH!原因如下!DevSecOps 视角

我们要解决什么问题?欢迎来到雲闪世界。 我见过多少次安全组从 10.0.0.0/8 或更糟的 0.0.0.0/0 开放端口 22?太多次了!但为什么,为什么在有更好的替代方案的情况下,我们在 2024 年仍在使用 SSH?作为一名安全…

YOLOv8独家改进:轻量化改进 | 高效移动应用的卷积加性自注意Vision Transformer

💡💡💡本文独家改进:轻量化改进之高效移动应用的卷积加性自注意Vision Transformer,构建了一个新颖且高效实现方式——卷积加性相似度函数,并提出了一种名为卷积加性标记混合器(CATM) 的简化方法来降低计算开销 💡💡💡性能比较:计算量参数量均有一定程度降低…

c语言编程有什么难点

C语言编程面临的难点主要有1、指针的理解和使用、2、内存管理、3、复杂的数据结构实现、4、并发和多线程编程以及5、跨平台编程。指针是C语言中最具特色也最令人头疼的部分。它直接操作内存地址,能够提供强大但复杂的数据管理方式。正确而高效地使用指针&#xff0c…

直接发文!储能优化配置!基于多目标哈里斯鹰平抑风电波动的储能优化配置程序代码!

前言 2023年,我国可再生能源新增装机容量2.4亿kW,约占全球可再生能源新增装机容量的50%以上。预计到2050年,我国风电、光伏年发电量可达全年总发电量的63.6%。大力发展可再生能源可有效缓解资源枯竭与环境污染问题,但可再生能源具…

Springsecurity中的Eureka报错:Cannot execute request on any known server

完整报错信息: com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server 报错体现: 访问eureka控制面板: 访问测试地址: 控制台报错: 可能的报错原因&#xff…

【3.5】贪心算法-解优势洗牌(类田忌赛马问题)

一、问题 给定两个 大小相等的数组 A 和 B ,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。 返回 A 的任意排列,使其相对于 B 的优势最大化。 二、解题思路 这个问题要求我们重新排列数组A,使得在相同位置上&#xf…