JAVA面试(六)

缓存

  • Memcached
  • redis
    • Redis常见数据类型和使用
    • Redis缓存持久化
      • RDB-快照
      • AOF-追加文件
    • Redis数据过期机制
      • 惰性删除
      • 定期删除
    • Redis缓存淘汰策略(8种)
      • 算法
        • LRU (Least Recently Used):最近最少使用
        • LFU(Least Frequently Used):最近最少频率使用
    • Redis事务
    • Redis为什么要用分布式缓存
    • Redis集群
      • 主从模式 - 最简单的
      • 哨兵模式
      • Redis Cluster
    • Redis常见问题及解决方案
      • 缓存击穿
      • 缓存穿透
      • 缓存雪崩
      • bigKey
      • 热Key
      • 慢查询命令
      • 如何保障数据库和缓存数据的一致性
        • 延时双删
        • 异步更新缓存
  • MongDB

Memcached

简洁的key-value存储系统,其实是内存中维护一张巨大的Hash表。不支持集群,Memcached彼此之间不进行通信,所以,可能会造成数据丢失。
和redis对比

MemcachedRedis
数据类型只支持key-value
数据持久化Memcached 把数据全部存在内存之中Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
集群模式支持没有原生的集群模式3.0 版本起是原生支持集群模式的
线程模型多线程,非阻塞 IO 复用的网络模型单线程的多路 IO 复用模型
特性支持Redis 支持发布订阅模型、Lua 脚本、事务等功能
过期数据删除只用了惰性删除策略惰性删除策略、定期删除策略

redis

redis是一个缓存中间件。
数据基于内存,内存的访问速度比磁盘快很多
单线程,基于I/O多路复用

  • 6.0后支持多线程,但是命令执行还是单线程

Redis 除了可以用作缓存之外,还可以用于分布式锁、限流、消息队列、延时队列等>场景

  • 延时队列:Redisson 内置了延时队列(基于 Sorted Set 实现的)
  • 消息队列:Redis 自带的 List 数据结构可以作为一个简单的队列使用。(Rpush +Lpop)
    Redis 5.0 中增加的 Stream 类型的数据结构更加适合用来做消息队列。
  • 限流: 通过 Redis + Lua 脚本的方式来实现限流。key是ip,value是访问次数
  • redis搜索引擎:借助 RediSearch
  • redis延时任务

Redis常见数据类型和使用

5 种基础数据类型
String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。

  • String,二进制安全的,可以存储图片或者序列化的对象,值最大存储为512M
    set key value
    get key
  • Hash
    hset key field value
    hget key field
  • List
    lpush key value [value ...]
    lrange key start end
  • Set(集合)
    sadd key element [element ...]
    smembers key
  • ZSet(有序集合)
    zadd key score member [score member ...]
    zrank key member

3 种特殊数据类型
HyperLogLog(基数统计)、Bitmap (位图)、Geospatial
(地理位置)。

除了上面提到的之外,还有一些其他的比如 Bloom filter(布隆过滤器)open in new
window、Bitfield(位域)。

场景应用:排行耪

选用ZSet,这是一个有序集合。根据score来排序
Zrange (从小到大排序)、 ZrevRange (从大到小排序)、ZrevRank (指定元素排名)。

Redis缓存持久化

4.0之后,RDB 和 AOF 混合使用实现持久化

RDB-快照

AOF-追加文件

Redis数据过期机制

设置expire(过期时间)后才会触发。
Redis 采用的是 定期删除+惰性/懒汉式删除 结合的策略

惰性删除

当查询key时候,先看该key是否过期,没有过期就返回数据;负责,删除该key,且不返回数据

定期删除

在一定时间,随机抽取设置过期时间的key,若这些含的key大部分过期,就删除这些过期key

  • Redis 的定期删除过程是随机的(周期性地随机从设置了过期时间的 key 中抽查一批),所以并不保证所有过期键都会被立即删除。这也就解释了为什么有的 key 过期了,并没有被删除。

  • 并且,执行时间已经超过了阈值,那么就中断这一次定期删除循环,以避免使用过多的 CPU 时间

  • 可在配置文件中设置频率
    由 hz 参数控制的。hz 默认为 10,代表每秒执行 10 次

Redis缓存淘汰策略(8种)

当redis内存不够用的时候,当一个新key需要存放时候就会按某种规则将内存中的数据删掉,这个删除规则就是淘汰策略。

  • noeviction:默认策略。不删除任何key,新增的key也不写入,内部不足直接报错
  • volatile-ttl:对设置TTL时间的key,剩余时间越短的先删除
  • allkeys-random:对全体key随机淘汰
  • volatile-random:对设置TTL时间的key随机淘汰
  • allkeys-LRU:对全体key使用LRU短发淘汰
    有明显冷热数据区分
  • volatile-LRU: 对设置TTL时间的key使用LRU短发淘汰
    数据有置顶的需求 — 置顶数据不设置过期时间,这些数据就一直不被删除,会淘汰其他设置过期时间的数据
  • allkeys-LFU:对全体key使用LFU短发淘汰
  • volatile-LFU: 对设置TTL时间的key使用LFU短发淘汰

算法

LRU (Least Recently Used):最近最少使用

用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。

LFU(Least Frequently Used):最近最少频率使用

会统计每个key的访问频率,值越小淘汰优先级越高。

Redis的数据淘汰策略有哪些 ?- 以下回答背熟,大概用时1min。

redis有个策略叫数据淘汰策略,具体指的是当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉。这个策略redis提供了8种方案,默认的叫noeviction,就是不删除任何数据,内部不足直接报错。方案的切换是可以在redis的配置文件中进行设置的,里面有两个非常重要的概念,一个是LRU,另外一个是LFU。
LRU,即Least Recently Used,意思就是最近最少使用,我们用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
LFU,即Least Frequently Used,意思就是最近最少频率使用。我们会统计每个key的访问频率,值越小淘汰优先级越高。

Redis事务

redis提供了一种命令,可以将多个命令打包一起后按顺序执行,执行途中不会被影响
MULTI(开始事务),EXEC(执行事务)直接包着命令集

Redis为什么要用分布式缓存

Redis集群

https://segmentfault.com/a/1190000043133394

主从模式 - 最简单的

这里是引用
Redis主从复制优点: 做到读写分离,提高服务器性能;
Redis主从复制缺点: 在主从模式中,一旦Master节点由于故障不能提供服务,需要人工将Slave节点晋升为Master节点

哨兵模式

当主服务器宕机后,需要手动把一台从服务器切换为主服务器,需要人工干预费事费力,为了解决这个问题出现了哨兵模式
哨兵模式优点:最大的优点就是主从可以自动切换,系统更健壮,可用性更高;

哨兵模式缺点:最大的缺点就是还要多维护一套哨兵模式,实现起来也变的更加复杂增加维护成本;
在这里插入图片描述

Redis Cluster

主要是针对海量数据+高并发+高可用的海量数据场景,Redis集群模式的性能和高可用性均优于哨兵模式。

Redis常见问题及解决方案

缓存击穿

热key在缓存中过期了,所以不在缓存中,会导致瞬时大量的请求直接打到了数据库上,对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了。
解决方案:

  • 永不过期(不推荐):设置热点数据永不过期或者过期时间比较长。
  • 提前预热(推荐):针对热点数据提前预热,将其存入缓存中并设置合理的过期时间比如秒杀场景下的数据在秒杀结束之前不过期。
  • 加锁(看情况);:在缓存失效后,通过设置互斥锁确保只有一个请求去查询数据库并更新缓存

缓存穿透

大量请求的 key 是不合理的,根本不存在于缓存中,也不存在于数据库中 。导致这些请求直接到了数据库上对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了。
解决方案:

  • 首先做好参数校验,不合法的参数请求直接抛出异常信息返回给客户端
  • 缓存无效 key,SET key value EX 10086 设置过期时间
  • 布隆过滤器
  • 接口限流,用户或者 IP 对接口进行限流,对于异常频繁的访问行为,还可以采取黑名单机制

缓存雪崩

缓存在同一时间大面积的失效,导致大量的请求都直接落到了数据库上,对数据库造成了巨大的压力
解决方案:

  • 针对 Redis 服务不可用的情况:
    Redis 集群
    多级缓存(本地缓存+Redis 缓存的二级缓存组合)
  • 针对大量缓存同时失效的情况
    设置随机失效时间
    针对热点数据提前预热,并设置合理的时间
    对于某些关键性和变化不频繁的数据,持久缓存永不过期

bigKey

一个 key 对应的 value 所占用的内存比较大,那这个 key 就可以看作是 bigkey.

  • String 类型的 value 超过 1MB
  • 复合类型(List、Hash、Set、Sorted Set 等)的 value 包含的元素超过 5000 个

产生原因:

  • 设计不当---- 使用string存储较大文件的二进制流
  • 数据规模考虑不到位---- 使用集合类型没有考虑到数据量的快速增长

带来什么问题 — 阻塞

  • 客户端超时阻塞:redis是单线程的,操作大key时候耗时

如果解决

  • bigkeys 命令去扫描(redis-cli -p 6379 --bigkeys -i 3 表示扫描过程中每次扫描后休息的时间间隔为 3 秒)
  • 找到后,手动清理;用合适的数据结构

热Key

访问频率较高的Key。
会出现的问题

  • 某个热点数据访问量暴增 占用大量的 CPU 和带宽,影响redis的其他请求处理;严重情况下,导致宕机

如果查看

  • 可以通过hotkeys 参数来查找

如果解决

  • 读写分离:主节点处理写请求,从节点处理读请求。
  • 使用 Redis Cluster:将热点数据分散存储在多个 Redis 节点上
  • 二级缓存:hotkey 采用二级缓存的方式进行处理,将 hotkey 存放一份到 JVM 本地内存中(可以用 Caffeine)。

慢查询命令

为什么会有慢

如何保障数据库和缓存数据的一致性

延时双删

写入库的前后,都删除缓存【redis.del(key)操作】
步骤
先删除缓存 —> 再写数据库 —> 休眠 500 毫秒 —> 再次删除缓存
缺点:
最差的情况就是在超时时间内数据存在不一 致,而且又增加了写请求的耗时。

异步更新缓存

MySQL binlog 增量订阅消费+消息队列+增量数据更新到 redis
步骤

MongDB

分布式文件储存的数据库

  • 存储数据:数据库中存储的对象设计BSON,一种类似json的二进制文件,由键值对组成
  • 链接方式(默认为27017)
    mongodb://[username:password@]host1[:port1][,host2[:port2]
  • 库简单认识
    文档 - row
    集合 - table
    数据库 - database
  • 复制工作
    MongoDB的复制工作是基于主从复制实现的。其中一个节点被定义为主节点,其他的节点被定义为备份节点,数据会进行实时同步。在某些情况下,主节点可能会失效或消失,这时候从节点将被提升为主节点继续工作。
  • 支持存储过程吗
    支持,它是javascript写的,保存在db.system.js表中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/718186.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

宕机了, redis如何保证数据不丢?

前言 如果有人问你:"你会把 Redis 用在什么业务场景下?" 我想你大概率会说:"我会把它当作缓存使用,因为它把后端数据库中的数据存储在内存中,然后直接从内存中读取数据,响应速度会非常快。…

手机录屏怎么操作?3个小技巧,轻松录屏

在数字化时代,手机录屏功能已逐渐成为我们日常生活和工作中不可或缺的工具。无论是为了记录游戏过程、制作教程,还是为了留存重要的视频通话,手机录屏都能发挥巨大的作用。本文将详细介绍手机录屏的3个功能、录屏小技巧等,帮助您更…

【Qt】chartView设置橡皮筋效果(RubberBand)

1. 效果 2. 代码 QChartView* chartView new QChartView();chartView->setRubberBand(QChartView::RectangleRubberBand);

大模型应用开发技术:Multi-Agent框架流程、源码及案例实战(二)

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…

Mac 开发vscode常用命令

1 打开vscode settting配置 commandshiftp 输入:Open User Setting 2

短信群发平台众多,如何挑选一家靠谱的合作伙伴?

随着通信技术的不断发展和智能手机的普及,短信群发平台在企业营销、客户通知、活动推广等领域的应用越来越广泛。然而,市场上的短信群发平台琳琅满目,如何从中挑选出一家靠谱、高效、安全的合作伙伴,成为了许多企业和个人关注的焦…

两台电脑如何建立局域网?三种简便方法推荐

方法一:使用网线直接连接 1、准备一根网线,长度不宜过长(建议不要超过80米,否则信号会衰减),确保两台电脑相邻或距离较近。 2、将网线的一头插入一台电脑的网口,另一头插入另一台电脑的网口。 …

算法基础精选题单 模拟 (个人题解)

前言: 从今天开始刷牛客上的这份题单,为暑假的牛客多校集训做准备,题单上一共有237道题,要想在集训开始前刷完难度还是很大的,但我一定会坚持下来,希望在这段时间内我能真正入门算法竞赛。接下来这三道题都…

机械臂抓取物体整体的开发流程

开发一个机械臂抓取物体的系统涉及多个步骤和不同领域的知识,包括机械设计、控制系统、传感器集成、软件开发等。以下是一个全面的开发流程概述: 1. 需求分析与系统设计 需求分析: 明确机械臂需要抓取的物体类型(大小、重量、材…

实用技巧,用lsof命令监控tar文件解压进度,简单有效!

在Linux系统中,tar命令是一个非常常用的工具,用于创建和解压缩归档文件。尽管tar命令本身没有提供直接查看解压进度的功能,但我们可以借助lsof(List Open Files)命令来间接监控解压进度。本文将详细介绍如何使用lsof命…

Drake 机器人仿真

sudo apt-get install,pip3 install,sudo apt install这些命令是在Linux系统中用于安装软件包或Python库的不同方法,它们分别属于不同的包管理系统和工具。 sudo apt-get install: 这是在Debian、Ubuntu等基于Debian的系统上用于从…

Android Studio 2024.1.1(Koloa)版本 Profiler 工具变动

在 Android Studio 2024.1.1 (Koloa) 版本当中,Profiler 工具终于迎来了重大 UI 更新(太感动了,因为之前的 Profiler 工具连接得慢,收集 Trace 信息还很卡,步骤繁琐等,这次更新有了很大的优化) …

低代码组件扩展方案在复杂业务场景下的设计与实践

组件是爱速搭的前端页面可视化模块的核心能力之一,它将前端研发人员从无休止的页面样式微调和分辨率兼容工作中解放了出来。 目前,爱速搭通过内置的上百种功能组件(120),基本可以覆盖大部分中后台页面的可视化设计场景…

Windows10笔记本如何系统重装?64位电脑重装系统需小心!一键安装超详细步骤!

在日常生活和工作中,我们有时会遇到Windows 10笔记本系统运行缓慢、频繁出现错误或受到病毒攻击等问题。这时,重装系统就成了解决这些问题的最佳选择。然而,对于许多用户来说,尤其是64位电脑用户,重装系统可能是一项既…

小程序开发平台源码系统商业运营版 带完整的安装代码包以及搭建教程

系统概述 小程序开发平台源码系统商业运营版 是一套基于现代技术栈开发的,专为中小企业及个人开发者设计的小程序快速开发与运营管理解决方案。该系统采用模块化架构设计,集成了代码生成器、可视化拖拽编辑器、多端适配引擎、云端部署、数据统计分析等多…

【JAVA】SpringBoot + skywalking 将接口的入参、出参、异常等信息上报到skywalking 链路追踪服务器上

【JAVA】SpringBoot skywalking 将接口的入参、出参、异常等信息上报到skywalking 链路追踪服务器上 1.下载SkyWalking APM https://skywalking.apache.org/downloads/ jdk8 不支持 SkyWalking APM 9.3.0以上版本,所以这里我们下载 9.3.0版本 2.下载 Java Agent …

网站的图片都是怎么处理的

我们平常见到的很多网站里面都有很多地图片,那么这些图片的文件是怎么处理的呢。图片是一个网站的重要元素之一,图片可以给用户直接的视觉冲击,好的图片则可以迎来不少的流量。图片有大有小,都是根据网站的局部需要而确定图片的尺…

清远mes管理系统助力企业降本增效

清远MES管理系统可以帮助企业降本增效的方式包括但不限于以下几个方面: 生产过程优化:清远MES系统可以实时监控生产过程中的各个环节,包括设备状态、生产进度、质量指标等,帮助企业管理人员及时了解生产情况并做出相应的调整和控制…

Redis作者长文总结LLMs, 能够取代99%的程序员

引言 这篇文章并不是对大型语言模型(LLMs)的全面回顾。很明显,2023年对人工智能而言是特别的一年,但再次强调这一点似乎毫无意义。相反,这篇文章旨在作为一个程序员个人的见证。自从ChatGPT问世,以及后来使…

10+分享:适合外包的开源后台管理系统【送源码】

1. D2admin 开源地址:https://github.com/d2-projects/d2-admin 文档地址:https://d2.pub/zh/doc/d2-admin/ 效果预览:https://d2.pub/d2-admin/preview/ 开源协议:MIT 2. vue-element-admin 开源地址:https://gi…