当前位置: 首页 > news >正文

Java-常见面试题收集(十三)

二十二 Redis

1 Redis 作用

  Redis,全称Remote Dictionary Server,即远程字典服务,是一个开源的使用ANSI C语言编写的、支持网络的、基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它主要用于缓存数据的计算结果、页面内容、数据库查询结果等,以提高数据访问速度和响应速度,从而提升系统性能和用户体验。

  Redis具有多种应用场景,包括但不限于:
    缓存:通过缓存热点数据,减少数据库查询次数,提高访问速度。
    消息队列:实现异步处理和解耦,提高系统的可扩展性和灵活性。
    分布式锁:作为分布式锁的存储层,通过缓存锁信息和锁状态,实现分布式锁和并发控制。
    计数器:通过原子操作实现计数器的自增和自减,支持高并发的计数操作,可用于实现各种排行榜和统计功能。

  Redis支持多种数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set),这使得Redis可以根据不同的场景选择合适的数据类型来实现各种功能。此外,Redis还提供持久化服务,使得数据在重启或崩溃后不会丢失,进一步增强了其作为缓存和数据库使用的可靠性。

2 Redis 的数据类型

1.String(字符串):这是 Redis 最基本的数据类型,一个 key 对应一个 value。Redis 的字符串是二进制安全的,这意味着你可以在一个字符串中存储任何数据,比如 JPEG 图片或者序列化的对象。2.Hash(哈希):Redis hash 是一个键值对集合。Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。3.List(列表):Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。4.Set(集合):Redis 的集合是 string 类型元素的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。5.Zset(有序集合):Redis 有序集合和集合一样也是 string 类型元素的集合,并且集合成员是唯一的。不同的是每个元素都会关联一个 double 类型的分数。Redis 正是通过分数来为集合中的元素从小到到大进行从小到大的排序。6.Streams(流):Redis StreamsRedis 5.0 版本引入的新数据类型,用于实现消息队列系统。Streams 是一个包含零个或多个消息的可持久化、可复制的日志。7.Bitmaps(位图):虽然位图不是 Redis 的一种独立数据类型,但 Redis 提供了位操作命令,允许用户将字符串键当作位数组(bit array)或位图(bitmap)来处理,实现一些高效的位运算操作。8.HyperLogLog(超对数日志):HyperLogLogRedis 的一种基数统计数据类型,它提供了在允许一定误差的情况下,使用极少的内存空间来统计大量数据的基数的功能。9.Geospatial(地理空间):Redis 的地理空间索引用于地理位置信息的查询和计算,比如获取某个位置附近的其它位置等。虽然 Redis 支持多种数据类型,但每个 key 只能对应一种数据类型。也就是说,你不能将一个 key 同时设置为字符串和哈希。此外,Redis 的数据类型并不是固定不变的,随着版本的更新,Redis 可能会引入新的数据类型或改进现有数据类型的功能。

3 Redis 如何实现消息队列功能

  1.基于 List 实现的队列Redis 的 List 数据结构可以很方便地用来实现队列。List 提供了从头部插入(LPUSH)和从尾部弹出(RPOP)或者从尾部插入(RPUSH)和从头部弹出(LPOP)元素的原语操作,这些操作都是原子性的,因此可以很容易地实现一个线程安全的队列。
  生产者:使用 LPUSH 或 RPUSH 将消息放入队列。
  消费者:使用 RPOP 或 LPOP 从队列中取出消息。
  如果需要处理多个消费者竞争同一个消息的情况,可以使用 BLPOP 或 BRPOP 命令,这些命令在队列为空时会阻塞,直到有消息可用。

  2.发布/订阅模型: Pub/Sub,Redis 的发布/订阅模式允许发送者(发布者)发送消息到频道,而接收者(订阅者)可以订阅一个或多个频道以接收消息。
  发布者:使用 PUBLISH 命令将消息发布到指定的频道。
  订阅者:使用 SUBSCRIBE 命令订阅一个或多个频道,并使用 PSUBSCRIBE 命令订阅匹配特定模式的频道。当有消息发布到这些频道时,订阅者会收到消息。
  需要注意的是,发布/订阅模式中的消息是即时发送的,如果订阅者当前不在线,那么它就不会收到这些消息。因此,这种模式更适用于实时通信或事件通知等场景。

  3.Redis 5.0 新增的队列: Stream,Redis 5.0 引入了 Stream 数据类型,它是一个持久化的、可靠的消息队列。Stream 提供了消息的持久化存储,并且支持消费者组的概念,使得多个消费者可以协作处理消息队列。
  生产者:使用 XADD 命令将消息添加到 Stream 中。每个消息都有一个唯一的 ID,并且可以按照时间顺序排列。
消费者组:消费者可以加入一个或多个消费者组,并从 Stream 中读取消息。每个消费者组都有一个或多个消费者,它们共同处理 Stream 中的消息。
  消息确认:消费者处理完消息后,需要发送一个确认信号(XACK 命令),以告知 Stream 该消息已经被处理。如果消费者在处理消息时崩溃,那么未确认的消息可以被其他消费者重新处理。
  Stream 还提供了多种查询和监控功能,使得开发者可以更方便地管理和维护消息队列。

  基于 List 的实现简单直观,适用于简单的队列需求;发布/订阅模型适用于实时通信和事件通知等场景;而 Stream 则提供了更强大和灵活的消息队列功能,适用于复杂的业务场景。

4 Redis 的持久化机制

  1.RDB 持久化:RDB 持久化方式能够在指定的时间间隔能对你的数据进行快照存储。 在默认情况下, Redis 将数据库快照保存在名字为 dump.rdb 的二进制文件中。 在Redis 运行时, RDB 程序将当前内存中的数据库快照保存到磁盘文件中, 在Redis 重启动时, RDB 程序可以通过载入 RDB 文件来还原数据库的状态。

# RDB 自动持久化规则
# 当 900 秒内有至少有 1 个键被改动时,自动进行数据集保存操作
save 900 1
# 当 300 秒内有至少有 10 个键被改动时,自动进行数据集保存操作
save 300 10
# 当 60 秒内有至少有 10000 个键被改动时,自动进行数据集保存操作
save 60 10000

  RDB 的优点:与 AOF 相比,在恢复大的数据集的时候,RDB 方式会更快一些。与 AOF 相比,文件比较小。
  RDB 的缺点:但有可能会产生长时间的数据丢失。

  2.AOF 持久化:Redis 在执行命令的时候,按照配置的策略,定期把命令原本的语句记录一个appendonly.aof 的文件当中,然后通过 fsync 策略,将命令执行后的数据持久化到磁盘中」(不包括读命令)

# AOF 持久化的三种策略
always: 每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全everysec: 每秒 fsync 一次:足够快,并且在故障时只会丢失 1 秒钟的数据。推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。no: 从不 fsync :将数据交给操作系统来处理,由操作系统来决定什么时候同步数据。更快,也更不安全的选择。

  AOF 的优点:AOF 可以[更好的保护数据不丢失],一般 AOF 会以每隔 1 秒,通过后台一个线程去执行 fsync 操作,如果 Redis 进程挂了,最多丢失 1 秒的数据AOF 是将命令直接追加到文件末尾的,顺序写,写入性能非常高AOF 日志文件的命令通过非常可读的方式进行记录,这个非常适合做灾难性的误删除紧急回复,如果某人不小心用 flushall 命令清空了所有数据,那么可以将日志文件中的 flushall 删除,然后进行恢复.
  AOF 的缺点:对于同一份数据源来说,一般情况下,AOF 文件比 RDB 数据快照要大由于.aof 的每次命令都会写入,相对于 RDB 来说需要消耗性能也就更多数据恢复比较慢,不适合做冷备

  3.混合持久化:重启 Redis 时,我们很少使用 rdb 来恢复内存状态,因为会丢失大量数据。我们通常使用 AOF 日志重写,
但是 AOF 重写性能相对 rdb 来说要慢很多,这样在 Redis 实例很大的情况下,启动需要花费很长的时间。Redis 4.0 为了解决这个问题,带来了一个新的持久化选项——混合持久化。
  AOF 在进行文件重写(aof 文件里可能有太多没用指令,所以 aof 会定期根据内存的最新数据生成 aof 文件)时将重写这一刻之前的内存 rdb 快照文件的内容和增量的 AOF 修改内存数据的命令日志文件存在一起,都写入新的 aof 文件,新的文件一开始不叫 appendonly.aof,等到重写完新的AOF 文件才会进行改名,原子的覆盖原有的 AOF 文件,完成新旧两个 AOF 文件的替换。

# 混合持久化配置
aof-use-rdb-preamble yes

5 Redis 过期键删除策略

  对于过期键一般有三种删除策略
  定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作;
  惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,那就返回该键;
  定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于删除多少过期键,以及要检查多少个数据库,则由算法决定。

  三种策略的优缺比较:

  定时删除策略对内存是最友好的:通过使用定时器,定时删除策略可以保证过期键会尽可能快地被删除,并释放过期键所占用的内存;但另一方面,定时删除策略的缺点是,他对 CPU 是最不友好的:在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分 CPU 时间,在内存不紧张但是 CPU 时间非常紧张的情况下,将 CPU 时间用在删除和当前任务无关的过期键上,无疑会对服务器的响应时间和吞吐量造成影响;

  惰性删除策略对 CPU 时间来说是最友好的:程序只会在取出键时才对键进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行;惰性删除策略的缺点是,它对内存是最不友好的:如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会释放;定时删除占用太多 CPU 时间,影响服务器的响应时间和吞吐量;惰性删除浪费太多内存,有内存泄漏的危险。

  定期删除策略是前两种策略的一种整合和折中:定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响;通过定期删除过期键,定期删除策略有效地减少了因为过期键而带来的内存浪费;定期删除策略的难点是确定删除操作执行的时长和频率。

  Redis 的过期键删除策略:Redis 服务器实际使用的是惰性删除和定期删除两种策略。

6 Redis 八种淘汰策略

1.noeviction(默认策略):当内存不足以容纳新写入数据时,新写入操作会报错。这个策略会保证不会删除任何数据,但是会拒绝所有的写入请求并返回错误给客户端。
2.volatile-lru:针对设置了过期时间的key,使用LRU(Least Recently Used,最近最少使用)算法进行淘汰。这意味着最久未使用的key会被优先删除。
3.volatile-lfu:同样针对设置了过期时间的key,使用LFU(Least Frequently Used,最不经常使用)算法进行淘汰。LFU算法会淘汰那些访问频率最低的key。
4.volatile-ttl:这个策略会淘汰那些设置了过期时间且剩余生存时间(TTL)最短的key。
5.volatile-random:随机淘汰设置了过期时间的key。
6.allkeys-lru:使用LRU算法淘汰所有key中最近最少使用的那些数据。这个策略不区分key是否设置了过期时间。
7.allkeys-lfu:使用LFU算法淘汰所有key中访问频率最低的那些数据。同样,这个策略也不区分key是否设置了过期时间。
8.allkeys-random:加入键的时候如果过限,从所有 key 随机删除

相关文章:

Java-常见面试题收集(十三)

二十二 Redis 1 Redis 作用 Redis,全称Remote Dictionary Server,即远程字典服务,是一个开源的使用ANSI C语言编写的、支持网络的、基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它主要用于缓存数据的计算…...

第二证券策略:股指预计维持震荡格局 关注汽车、工程机械等板块

第二证券指出,指数自今年2月份阶段低点反弹以来,3月份持续高位整理。进入4月份之后面对年报和一季报的双重财报发表期,预计指数短期保持高位整理概率比较大。前期缺乏成绩支撑的概念股或有回落的危险,主张重视成绩稳定、估值低、分…...

hcia datacom课程学习(6):路由与路由表基础

1.路由的作用 不同网段的设备互相通信需要具有路由功能的设备进行转发 具有路由功能的设备不一定是路由器,交换机可以有路由功能,同样的,路由器也可以有交换功能,像家里常用的路由器就是集路由功能和交换功能于一体的 2.路由相…...

AI PC元年,华为的一张航海图、一艘渡轮和一张船票

今天,从学术研究者到产业投资者,无不认为大模型掀起了一场人工智能的完美风暴。 所谓“完美风暴”,指的是一项新技术的各个要素,以新的方式互相影响、彼此加强,组合在一起形成了摧枯拉朽般的力量。 而我们每个人&#…...

NAT技术

网络技术深似海呀,一段时间不用又忘。 是什么 NAT技术是网络防火墙技术的一部分,可以作用在linux防火墙或者设备防火墙,NAT技术可以实现地址和端口的转换,主要还是为了网络连通性。 作用 存在以下三个IP,A(10.234.…...

新能源汽车“价格战”之后,充电桩主板市场将会怎样?

2024年2月底,国内新能源汽车市场开启了一场前所未有的“价格战”↓ 比亚迪率先抛出“王炸”车型——秦PLUS荣耀版和驱逐舰05荣耀版,起售价低至7.98万元,打响了价格战的“第一枪”,引爆了平静的汽车市场。 “电比油低”就此拉开序…...

appium driver install uiautomator2 安装失败

报错 Installing ‘uiautomator2’ using NPM install spec ‘appium-uiautomator2-driver’ Error: Encountered an error when installing package: npm command ‘install --save-dev --no-progress --no-audit --omitpeer --save-exact --global-style --no-package-lock…...

学浪已购买视频怎么下载到本地?

许多学习者在学浪购买了丰富的课程,然而,一些课程存在时间限制,使得学习者希望将其下载并永久保存。在这里,我们将介绍一款名为小浪助手的工具,它能够帮助你轻松将学浪已购买的视频下载到本地,让学习变得更…...

k8s-pod设置执行优先级

Pod的优先级管理是Kubernetes调度中的一个重要特性,通过PriorityClass(优先级类)的设置,我们可以为Pod指定不同的优先级,从而在资源有限的情况下更精细地调整调度顺序 什么是PriorityClass? PriorityClass是…...

const修饰指针

const修饰指针 常量指针 特点为指针的指向可以改,但是指针指向的值不可以修改 int a 10; int b 20; const int *p &a; *p 20; //错误,指针的指向的值不可更改 p &b; //正确 指针常量 特点是指针的指向不可以改,指针指向的值…...

php关于序列化r的指向

在PHP中,序列化字符串的索引是根据序列化过程中值的出现顺序来确定的。每个值(包括数组的键和值)在序列化字符串中都会被赋予一个顺序索引。为了理解这个顺序,我们需要知道以下几点: 序列化时,数组的键和值…...

从0到1实现RPC | 11 丰富测试案例

测试案例主要针对服务消费者consumer,复杂逻辑都在consumer端。 常规int类型,返回User对象 参数类型转换,主要实现逻辑都在TypeUtils工具类中。 测试方法重载,同名方法,参数不同 方法签名的实现,主要逻辑…...

在前端开发中用到了哪些设计模式?

在前端开发中用到了哪些设计模式? 1.单例模式2.观察者模式3.工厂模式4.适配器模式5.装饰器模式6.命令模式7.迭代器模式8.组合模式9.策略模式10.发布订阅模式 1.单例模式 确保一个类只有一个实例,提供一个全局访问点,vue就是一个单例模式&…...

ES6 的解构赋值

解构赋值(Destructuring assignment)是一种方便快捷的方式,可以从对象或数组中提取数据,并将数据赋值给变量。解构赋值是ES6中一项强大且常用的特性. 1. 基本数组解构 首先,让我们看看如何对数组进行解构赋值。假设我…...

蓝桥杯物联网竞赛_STM32L071KBU6_全部工程及国赛省赛真题及代码

包含stm32L071kbu6全部实验工程、源码、原理图、官方提供参考代码及国、省赛真题及代码 链接:https://pan.baidu.com/s/1pXnsMHE0t4RLCeluFhFpAg?pwdq497 提取码:q497...

关于UCG游戏平台的一些思考

UCG游戏平台,全称User Generated Content,即用户生成内容。它涵盖了所有玩家可以自主编辑的部分,包含并不限于换装、捏脸、关卡摆放等内容。 UCG概念在最近又火了起来,但这个模式出现的并不早。早在10多年前,war3编辑器…...

一起学习python——基础篇(20)

前言,之前经常从网上找一些免费的接口来测试,有点受制于人的感觉。想了想还不如直接写一个接口,这样方便自己测试。自己想返回什么格式就返回什么样子,不用担心服务报错,因为自己就可以完全掌控。然后宿舍二哥告诉我py…...

云服务器安装Mysql、MariaDB、Redis、tomcat

前置工作 进入根目录 cd / 创建java文件夹 mkdir java 进入java文件夹 cd java 上传压缩包 rz 压缩包 Mysql 1.下载并安装MySQL官方的 Yum Repository wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noa…...

Android笔记--MediaCodec(二)

这一节主要了解MediaCodec处理音频,MediaCodec直译媒体解码器,用于访问媒体编解码器,即编码器/解码器组件,它是 Android 多媒体支持基础设施的一部分;从广义上讲,编解码器处理输入数据以生成输出数据。它异…...

【Java探索之旅】方法重载 递归

🎥 屿小夏 : 个人主页 🔥个人专栏 : Java编程秘籍 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、方法重载1.1 为什么要有方法重载1.2 方法重载的概念与使用1.3 方法签名 二、递归2…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

【HTTP三个基础问题】

面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 ​二、实现思路 总体思路: 用户通过Gradio界面上…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...