什么是Redis?

Redis是一种基于键值对NoSQL数据库。

主要的特点是把数据放在内存中,读写速度相比于磁盘会快很多。

对于性能要求很高的场景,比如缓存热点数据防止接口爆刷,都会用到Redis

Redis还支持持久化,将缓存中的数据异步落盘,以便服务器宕机时恢复数据。

Redis和MySQL的区别?

  • Redis是非关系型数据库,MySQL是关系型数据库
  • Redis的数据存储在内存,MySQL的数据主要存储在磁盘
  • Redis存储的是键值对,MySQL数据以行和列的形式存储。

实际开发中,Redis和MySQL都会使用到,查询数据先用Redis,未命中再查MySQL并写回Redis

项目里哪里用到了Redis?

用户活跃榜使用了ZSet有序集合(score字段进行排序)作者白名单里用到了Set集合结构

用户登录后的Session,使用了字符串类型

通过Lua脚本封装Redis的setnex命令来实现分布式锁,保证在高并发场景下,热点数据短时间内的高频访问不会击穿MySQL,多个线程没有从Redis中获得数据时,只有一个线程成功获取锁并重建缓存。Lua脚本保证原子性,防止在设置过期时间前崩溃造成死锁,要么都成功,要么都失败,避免锁永远不被释放。设置一个监听线程,任务未完成时自动续期

部署过Redis吗?

我有在生产环境中部署过单机版Redis,先在官网下载源码包后执行make && make install编译安装。安装后编辑redis.conf文件,配置远程访问、设置密码、限制内存、设置内存过期淘汰策略、开启AOF持久化等。

Redis的高可用方案有部署过吗?

有部署过哨兵机制,一主两从的Redis实例,再加上三个哨兵节点监控它们,哨兵节点主要设置了故障转移的判定条件超时阈值。当主节点发生故障时,哨兵节点之间能够自动协商并选出新的主节点,这个过程大概需要10-15秒。

另一个项目部署过集群方案,该项目数据量大并且增长快,需要水平扩展能力。我们部署了6个主节点,每个主节点配备一个从节点,形成了一个3主3从的初始集群。

使用集群节点的好处是能够自动进行分片映射,可以简单地增加节点来水平扩展集群容量。故障转移也很快,通常在几秒内完成。

Redis可以用来干什么?

主要用作缓存,把高频访问的数据放到Redis中,并通过设置过期时间来保证数据一致性,减轻数据库访问压力。

秒杀接口可以通过Lua脚本实现令牌桶算法实现流量控制。(HMSET)

Redis中有哪些数据类型?

字符串、哈希、列表、集合、有序集合

详细介绍下字符串?

最常见的数据类型,存储文本、数字或二进制数据,最大容量是512MB

适合存储单个对象,比如验证码、token、计数等。

详细介绍下列表?

列表是一个有序的元素集合,支持从头部/尾部插入/删除元素,常见于消息队列任务列表

LRANGE key start end范围查询

详细介绍下哈希?

key value的集合,适合存储对象,比如商品信息,用户信息。value = {name : 'zhangsan', age = 18}l

详细介绍下集合?

集合是无序不重复的,支持交集并集操作,查询效率能达到 O(1) 级别,主要用于去重、标签、共同好友等场景。

详细介绍下有序集合?

按照score排序的有序集合,支持范围查询,适合排行榜优先级队列

详细介绍下BitMap? 

BitMap可以把一组二进制位紧凑地放到一组连续的内存空间中,每一位代表一个对象的状态,比如是否签到,是否活跃等 

详细介绍下HyperLogLog?

用于估算集合中的唯一元素数量(基数)的概率性数据结构,仅用12KB的内存实现,误差范围为0.81%。

底层把每个元素哈希为一个二进制串,然后取前14位进行分组,放到16384个桶中,计算每组最大的前导0数量,最大前导0数量越多代表这个桶内的元素大概率越多,最后用一个公式近似推算总体基数,观察稀有事件的频率来推测总数。

详细介绍下GEO?

GEO存储地理位置信息,可以用来计算两点之间的距离,某位置为中心的半斤内查找其他元素等

应用场景包括:附近的人或商家、计算外卖员与商家的距离、判断用户是否进入某个区域等

底层基于ZSet有序不重复集合实现,通过特定算法把经纬度转换为score

为什么使用Hash类型而不是字符串类型序列化存储? 

Hash可以只读取或修改某一个字段,String必须全部取出来反序列化后读取

Redis为什么快? 

内存

因为读写数据都是在内存中,内存的读写速度本来就比磁盘快好几个数量级

异步持久化

即使Redis的数据需要持久化(RDB或AOF),也是异步或后台进行的,不会阻塞读写操作

I/O多路复用

Redis采用了I/O多路复用技术和事件驱动模型,一个线程就能监听成千上万个连接。I/O多路复用线程会持续监听注册的连接(文件描述符),当有请求的事件就绪后,会被放入一个事件列表。Redis主线程可以主动一次性获取所有的就绪事件,这些事件被有序地分发给预设的事件处理器,来执行相应的accept、read、write操作。

Linux下获取就绪事件一般用epoll_wait(),macos一般用kqueue等。

多线程

Redis6.0之前,连接建立,请求读取、响应发送以及命令执行都是在主线程中进行的,这样可以避免多线程情况下的锁竞争和上下文切换。网络IO和命令执行是串行的性能瓶颈主要来源于网络IO的序列化

Redis6.0之后,为了解决网络IO的性能瓶颈,Redis引入了多线程机制,把网络IO和命令执行分开,网络IO交给线程池处理,命令执行仍然在主线程中,网络IO的线程主要是负责解析请求以及序列化发送,这样可以充分利用多核CPU的性能。

底层数据结构优化

比如String的底层数据结构动态字符串支持动态扩容预分配冗余空间,能够减少内存碎片和内存分配的开销

能详细说一下IO多路复用吗?

IO 多路复用是一种允许单个进程同时监视多个文件描述符的技术,使得程序能够高效处理多个并发连接而无需创建大量线程。

主要的实现机制包含select poll epoll kqueue IOCP等。

说说select、poll、epoll、kqueue和IOCP的区别?

select的缺点是单个进程能够监控的文件描述符有限,只有1024个,并且每次调研都需要将文件描述符集合从用户空间拷贝到内核空间,然后遍历找出就绪的文件描述符后再拷贝回来,性能开销大

poll的优点是没有最大文件描述符数量的限制,不再用 BitsMap 来传入 FD,取而代之的是动态数组 pollfd。但是每次调用仍然需要将文件描述符集合从用户空间复制到内核空间,仍然需要遍历,性能较差

epoll引入了事件驱动/内核态的回调机制,将文件描述符一次性注册到内核的红黑树中,在内核中通过回调机制主动维护就绪事件列表,而不需要像之前一样请求一次维护一次,更不需要全部拷贝,而是仅返回就绪的文件描述符列表,避免了遍历和重复拷贝的开销。

kqueue是BSD/macos下的IO多路复用机制,类似于epoll,支持大规模并发连接,使用事件驱动模型

IOCP是windows系统下的IO多路复用机制,关注的是IO操作是否已经完成而非事件就绪通知,完全的异步I/O

举例说一下阻塞I/O和I/O多路复用的区别? 

传统的阻塞I/O是指线程/进程发起I/O请求后需阻塞等待内核准备就绪并且I/O操作完成后才能执行后续的代码,一个线程/进程只能负责一个I/O连接,不具有并发能力

I/O多路复用是指一个线程通过文件描述符监听多个socket连接, 通过一个系统调用就可以知晓所有就绪的事件,只要有一个事件就绪就可以开始执行,可以处理大量并发的I/O请求

Redis早期为什么要使用单线程?

  • 为了避免上下文频繁切换和锁竞争,避免并发控制的复杂性
  • Redis是I/O密集型而不是CPU密集型,主要受内存和网络I/O的限制,而不是CPU的计算能力限制,多线程收益不明显
  • 单线程可以保证命令执行的原子性,无需额外的同步机制

所以单线程 + I/O多路复用机制已经足够了

Redis6.0为什么要引入多线程?

Redis 6.0引入的多线程并不是指数据操作的命令执行是多线程的,而是指网络I/O操作是在一个线程池中并发执行的。这是因为,虽然IO多路复用机制可以监控成千上万个就绪事件,但是epoll_wait()获取就绪事件列表之后还需要执行实际的网络I/O操作,实际的read()和write()系统调用是非常耗时的,所以Redis 6.0之后就将IO线程从主线程中剥离了出来,可以并发执行请求的解析和数据的响应,大大解决单线程下网络I/O操作的瓶颈问题

说说Redis的常用命令

  • 操作字符串GET/SET/INCR
  • 操作哈希HGET/HSET/HGETALL
  • 操作列表LPUSH/LPOP/LRANGE
  • 操作集合SADD/SISMEMBER
  • 操作有序集合ZADD/ZRANGE/ZINCRBY

详细说说set命令?

用于设置字符串的key,一般会覆盖原的值,支持过期时间条件写入,一般用来实现分布式锁,存储token延长Session时间

SETNX仅不存在的时候设置,SETXX仅存在的时候覆盖

sadd命令的时间复杂度是多少?

一次性添加N个元素就是O(N),只添加一个元素就是O(1)

incr命令了解吗?

用于将指定键的值加一,是一个原子的命令。如果key不存在,先将值设置为0再加1。常用于网站访问量,文章点赞数等场景

单线程的Redis QPS能达到多少?

10w

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86778.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86778.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/86778.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

权限提升-工作流

一、Windows 权限提升 操作阶段 对应工具 说明 系统补丁与漏洞查询 systeminfo、WindowsVulnScan、wesng 提取 KB 补丁号,匹配 CVE 漏洞(如 CVE-2020-1054) 内核漏洞提权 MSF(local_exploit_suggester)、CVE 对…

c++手撕线程池

C手撕线程池 #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <time.h>#define LL_ADD(item, list) do{ \item->prev NULL; \item->next list; \if…

cocos creator 3.8 - 精品源码 - 六边形消消乐(六边形叠叠乐、六边形堆叠战士)

cocos creator 3.8 - 精品源码 - 六边形消消乐 游戏介绍功能介绍免费体验下载开发环境游戏截图免费体验 游戏介绍 六边形堆叠战士(六边形消消消)是一款脱胎于2048、1010&#xff0c;基于俄罗斯方块的魔性方块达人小游戏&#xff0c;可以多方向多造型消除哦&#xff01; 功能介…

3ds Max高效运行配置核心要素

要保障3ds Max流畅运行&#xff0c;需围绕计算性能、图形处理、数据吞吐三大维度构建硬件体系。不同工作环节对硬件需求存在显著差异&#xff1a; 一、核心组件配置原则 CPU&#xff1a;线程与频率双优化 建模/视口操作&#xff1a;依赖高主频&#xff08;建议≥4.0GHz&#…

实变与泛函题解-心得笔记【16】

文章目录 集合参考文献 集合 参考文献 《实变函数论与泛函分析》

道路交通标志检测数据集-智能地图与导航 交通监控与执法 智慧城市交通管理-2,000 张图像

道路交通标志检测数据集 &#x1f4e6; 已发布目标检测数据集合集&#xff08;持续更新&#xff09;&#x1f6a7; 道路交通标志检测数据集介绍&#x1f4cc; 数据集概览包含类别 &#x1f3af; 应用场景&#x1f5bc; 数据样本展示 YOLOv8 训练实战&#x1f4e6; 1. 环境配置 …

一、jenkins介绍和gitlab部署

一、jenkins介绍 jenkins和持续集成的关系 Jenkins 是实现持续集成&#xff08;CI&#xff09;最流行的自动化工具&#xff0c;它负责自动构建、测试和部署代码&#xff0c;确保团队能频繁且可靠地集成代码变更。 持续集成和敏捷开发的关系 敏捷开发是一种"快速迭代、…

k3s or kubesphere helm安装报错dial tcp 127.0.0.1:8080: connect: connection refused

在安装kubesphere时报错 Error: Kubernetes cluster unreachable: Get "http://localhost:8080/version": dial tcp 127.0.0.1:8080: connect: connection refused helm.go:92: 2025-06-27 15:14:43.30908177 0000 UTC m0.033127135 [debug] Get "http://localh…

使用datafusion和tpchgen-rs进行完整的TPCH 22个查询的基准测试

1.从源码编译bench二进制文件。 下载datafusion源码, 解压到目录&#xff0c;比如/par/dafu&#xff0c; cd /par/dafu/benchmarks export CARGO_INCREMENTAL1 export PATH/par:/par/mold240/bin:$PATH因为mold默认使用并行编译&#xff0c;而这些二进制文件很大&#xff0c;如…

【软考高项论文】论信息系统项目的干系人管理

摘要 在信息系统项目管理里&#xff0c;干系人管理极为关键&#xff0c;它不仅决定项目成败&#xff0c;还对项目进度、质量和成本有着直接影响。本文结合作者2024年6月参与管理的信息系统项目&#xff0c;详细阐述了项目干系人管理的过程&#xff0c;分析了干系人管理与沟通管…

PB应用变为Rust语言方案

从PB(PowerBuilder)迁移到现代开发软件 PowerBuilder(PB)作为早期的快速应用开发工具,曾广泛应用于企业级数据库应用开发。随着技术发展,PB逐渐面临以下挑战,促使企业转向现代开发工具: 技术陈旧与维护困难 PB的架构基于较老的客户端-服务器模式,难以适应云原生、微…

【大模型】Query 改写常见Prompt 模板

下面对常见的几种“Query 改写”Prompt 模板进行中英文对照&#xff0c;并在注释中给出中文说明&#xff0c;帮助中国用户快速理解与使用。 根据调研&#xff0c;企业级 Query 改写模块需要覆盖多种常见场景&#xff0c;包括拼写纠错、中英混合、省略上下文、多义词扩展、专业术…

西门子S7-200 SMART PLC:小型自动化领域的高效之选

在工业自动化领域&#xff0c;小型PLC作为设备控制的核心组件&#xff0c;其性能、灵活性和性价比始终是用户关注的重点。西门子推出的S7-200 SMART可编程控制器&#xff0c;凭借对中国市场需求的精准把握&#xff0c;成为了小型自动化解决方案的标杆产品。本文将从产品亮点、技…

使用iperf3测试网络的方法

深入掌握网络性能测试&#xff1a;iperf3全指南 在网络优化、故障排查和带宽验证中&#xff0c;iperf 是工程师必备的利器。这款开源工具通过模拟数据流&#xff0c;精准测量​​带宽、抖动、丢包率​​等核心指标。本文将结合实战经验&#xff0c;详解iperf的安装、参数配置和…

Level2.11继承

一、继承 #动物# #老虎、狮子、大象 #动物有共性 ##定义一个动物&#xff1a;1.有4条腿&#xff1b;2.陆地上跑&#xff1b;3.需要进食&#xff08;属性能力&#xff09; ##猫&#xff1a;同上&#xff08;继承了动物的属性和能力&#xff09; ##老鼠&#xff1a;同上#Python…

Class3Softmax回归

Class3Softmax回归 回归VS分类 回归是估计一个连续值 分类是预测一个离散类别 回归分类单连续值输出通常为多个输出自然区间R输出i是预测为第i类的置信度跟真实值的区别作为损失 生活中的分类问题 1.垃圾分类 类别&#xff1a; 可回收物 湿垃圾&#xff08;厨余垃圾&#xff0…

day042-负载均衡与web集群搭建

文章目录 0. 老男孩思想-面试官问&#xff1a;你对加班的看法?1. 负载均衡2. 搭建负载均衡的WordPress集群2.1 负载均衡服务器2.2 配置web服务器2.3 测试 踩坑记录1. /var/cache/nginx权限问题 0. 老男孩思想-面试官问&#xff1a;你对加班的看法? 互联网公司没有不加班的&a…

40岁技术人用AI寻找突破路线

年近40&#xff0c;坐标重庆&#xff0c;从事医疗器械行业多年&#xff0c;遇到发展瓶颈。刚好遇到AI技术浪潮。最近一年在不断尝试把AI应用于工作生活的方方面面。 总结一下我是如何利用AI来做职业规划的&#xff1a; 整理好自己的简历&#xff0c;越详细越好。这个可以利用…

kde截图工具报错

An error occurred while taking a screenshot. KWin screenshot request failed: The process is not authorized to take a screenshot Potentially relevant information: - Method: CaptureScreen - Method specific arguments: "eDP-2"好的&#xff0c;感谢您提…

有理函数积分——分式分解时设分解式的规则

目录 一、设前处理 1. 假式化真式 2. 分母因式分解 3. 判断可约不可约 二、一次分母 1. 多项一次分母​ 2. 单项一次重复分母​ 三、二次分母(当然是分母不可约的&#xff0c;如果可约就因式分解然后对应一次分母) 1. 多项二次分母​ 2. 单项二次重复分母​ 四、混…