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

关于Redis

1.列举一些项目中redis的使用场景,这些场景用到了什么类型

缓存 将经常访问的数据存储到redis中;String或Hash,用于存储键值对。

会话存储 用户的登录状态、购物车;存储会话数据。

消息队列 实现异步处理,比如发送邮件或处理日志;List

分布式锁 在分布式系统中实现互斥访问共享资源;String或bitmap,setnx命令来实现

限流 限制用户的的请求频率,防止系统被滥用;zset或List

缓存一致性 在缓存失效时,避免缓存穿透和缓存雪崩;String或bitmap,结合Expire命名设置过期时间,使用bitfield实现原子性的计数

2.redis中有哪些数据类型

String、List、Hash、Set、Zset、HyperLogLog、bitmap、

3.Redis的哪些命令可以实现分布式锁机制

SET 命令 使用带有 NX 和 EX 选项的 SET 命令可以实现一个简单的分布式锁:

NX: Only set the key if it does not already exist.

EX: Set an expire time on the key

Lua 脚本在 Redis 服务器端执行,可以确保一系列操作的原子性。

首先检查锁是否存在,如果不存在,则设置锁并设置过期时间;如果锁已存在,则返回 false。

Redlock 是一种分布式锁算法,它通过多个 Redis 实例来实现锁的获取和释放,从而提供更高的可用性和一致性。Redlock 算法不是通过单一的 Redis 命令实现的,而是需要客户端实现一定的逻辑。

锁的超时时间:为了避免死锁,锁应当设置一个合理的超时时间。

锁的唯一性:每次请求锁时,应该使用一个唯一的值作为锁的值,以防止锁的混淆。

锁的重试机制:如果获取锁失败,应该有一个合理的重试机制。

锁的释放:确保在不再需要锁时能够正确释放锁。

4.RedLock红锁的实现原理

是一种分布式锁算法,它通过多个 Redis 实例来实现锁的获取和释放,从而提供更高的可用性和一致性。Redlock 算法不是通过单一的 Redis 命令实现的,而是需要客户端实现一定的逻辑。

锁的超时时间:为了避免死锁,锁应当设置一个合理的超时时间。

锁的唯一性:每次请求锁时,应该使用一个唯一的值作为锁的值,以防止锁的混淆。

锁的重试机制:如果获取锁失败,应该有一个合理的重试机制。

锁的释放:确保在不再需要锁时能够正确释放锁。

5.你们在项目中如何保证数据库和redis缓存的一致性

延时双删:先删除缓存,为了避免更新数据库的时候,其他线程从缓存中读取不到数据,就在更新完数据库之后,再Sleep 一段时间,然后再次删除缓存

消息队列:先更新数据库,成功后往消息队列发消息,消费到消息后再删除缓存,借助消息队列的重试机制来实现,达到最终一致性的效果。

6.Redis除了常被用作应用程序的‌缓存层‌以提高数据访问速度外,‌还包括以下几个方面:‌

  • ‌数据库‌:‌Redis可以用作轻量级的数据库,‌实现会话管理、‌用户信息存储、‌排行榜、‌计数器等功能。‌
  • ‌消息代理‌:‌Redis提供了发布/订阅模式以及List数据结构,‌可以实现消息的发布和订阅功能,‌用作消息队列、‌实时通知等。‌
  • ‌分布式锁‌:‌Redis的setnx命令可以实现分布式锁的功能,‌确保在分布式系统中对共享资源的访问是安全的。‌
  • ‌实时系统‌:‌Redis的快速读写性能使其成为实时系统的理想选择,‌如实时分析、‌在线游戏、‌实时推荐等场景。‌
  • ‌限流‌:‌Redis可以通过Lua脚本结合其数据结构实现限流功能,‌防止系统在高并发场景下因流量过大而崩溃。‌‌

7、Redis 是一个开源的内存数据存储系统,因其高性能和快速响应而被广泛使用。其速度快的原因主要包括以下几个方面:

1. 内存存储

Redis 将数据存储在内存中,而不是传统的磁盘存储。内存访问速度比磁盘快得多,减少了数据的读写延迟。虽然 Redis 也可以将数据持久化到磁盘,但其主要的读写操作都是在内存中完成的。

2. 单线程模型

Redis 使用单线程事件循环模型处理所有请求。单线程模型的优点包括:

  • 避免了上下文切换:多线程模型中线程上下文切换会带来额外的开销。Redis 的单线程模型通过避免这种切换来减少延迟。
  • 简化了并发编程:单线程避免了多线程编程中的复杂性,如竞态条件和锁问题,从而减少了调试和性能调优的难度。

3. 高效的数据结构

Redis 提供了多种高效的数据结构,如字符串、列表、集合、有序集合和哈希等。每种数据结构都有经过优化的操作方法,使得常见的数据操作(如插入、删除、查找)可以在常量时间(O(1))或对数时间(O(log n))内完成。

4. 事件驱动和非阻塞I/O

Redis 使用了事件驱动的非阻塞 I/O 模型,通过 epoll(在 Linux 上)或 kqueue(在 BSD 系统上)等机制,能够处理大量并发连接而不会阻塞。这种方式允许 Redis 在高并发环境中高效地处理大量请求。

8.redis是单线程的,为什么还那么快

避免了上下文切换

高效的数据结构

内存访问速度比磁盘快得多

事件驱动和非阻塞I/O

9.Redis底层使用的高效的数据结构有哪些

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

10.redis的数据持久化方式有哪些?持久化文件中存储的是什么样的数据?

RDB,存储的所有键值对数据,比如字符串、列表、集合、有序集合和哈希等

AOF,存储的Redis执行过的所有写入命令,如set,hset,Lpush等

RDB 更适合需要快速恢复数据的场景,而 AOF 更适合需要更高数据完整性的场景

11.什么是缓存穿透、缓存击穿、缓存雪崩?如何解决

缓存穿透:查询一个不存在的数据,由于缓存中没有该数据,导致每次请求都会去数据库查询,数据库压力增大;

解决方案:采用布隆过滤器进行判断数据是否存在

缓存击穿:本来缓存中有对应的数据,但是缓存的数据 因为到期,需要去数据库中再次查询数据;

解决方案:可以使用分布式锁(如 Redis 的 SETNX 命令)来保证只有一个线程去加载数据并更新缓存,其他线程等待数据加载完成后再从缓存中读取。

或缓存预热:在系统启动时或数据更新时,预先加载一些热点数据到缓存中,避免缓存刚启动时突然出现大量数据库请求。

缓存雪崩:当大量缓存数据同时过期或被删除时,大量请求会直接访问数据库,导致数据库压力骤增;

解决方案:对缓存数据设置随机的过期时间,避免所有缓存数据同时过期

12.Redis的key过期处理策略

①惰性删除:当一个键过期后,Redis 并不立即删除它,而是等到真正访问该键时才进行删除。

②定期删除:为了防止惰性删除导致大量过期键积累,Redis 还会在后台定期检查并删除过期的键。

13.Redis的内存淘汰策略

noeviction(不淘汰)

这是默认的内存淘汰策略。如果 Redis 达到了最大内存限制,它不会自动删除任何键,而是直接返回客户端一个错误(OOM command),拒绝执行会导致内存增长的操作。

allkeys-lru(所有键的 LRU 淘汰)

根据最近最少使用(Least Recently Used, LRU)原则来删除键,直到内存释放到最大内存限制之下

allkeys-random(随机删除所有键)

Redis 会随机删除键,直到内存释放到最大内存限制之下。

volatile-lru(易失键的 LRU 淘汰)

只会删除设置了过期时间(TTL)的键,并根据 LRU 原则来删除

volatile-random(随机删除易失键)

会随机删除设置了过期时间的键,直到内存释放到最大内存限制之下。

volatile-ttl(删除 TTL 最短的易失键)

会删除设置了过期时间的键,并优先删除 TTL(Time To Live)最短的键。

14.Redis的集群策略

数据分片(Data Sharding)

Redis 集群通过哈希槽(Hash Slot)来实现数据分片。集群中的数据被分割成 16384 个哈希槽,每个键都会被映射到一个哈希槽上,进而分配到一个节点上。

复制(Replication)

Redis 集群支持主从复制(Master-Slave Replication),每个主节点可以有一个或多个从节点。从节点用于读取操作,可以提高读取性能和可用性。

故障检测与自动故障转移(Fault Detection and Automatic Failover)

Redis 集群内置了故障检测机制,可以自动检测节点的故障,并进行故障转移

客户端分区感知(Client Partition Awareness)

客户端需要知道集群的拓扑结构,以便能够正确地将请求发送到相应的节点。

数据一致性(Data Consistency)

尽管 Redis 集群通过数据分片和复制来提高可用性和扩展性,但由于数据分布在多个节点上,因此需要解决数据一致性问题。

方案:读取一致性,写入一致性,分区容忍性

配置与管理

Redis 集群的配置和管理涉及到多个方面,包括节点配置、分片策略、复制配置等


http://www.kler.cn/news/311174.html

相关文章:

  • Mamba YOLO World
  • 集合是什么
  • 金手指设计
  • CefSharp_Vue交互(Element UI)_WinFormWeb应用(3)---通过页面锁屏和关机(含示例代码)
  • 新的突破,如何让AI与人类对话变得“顺滑”:Moshi背后的黑科技
  • 【Webpack--011】配置开发和生产模式的webpack.config.js
  • 【算法】滑动窗口—找所有字母异位词
  • 解决使用nvm ls命令没有出现*的问题
  • 华为OD机试 - 打印机队列 - 优先队列(Python/JS/C/C++ 2024 E卷 200分)
  • 【分立元件】案例:新人加了个TVS管为什么可能导致系统不能正常工作
  • 【Unity】URP Rendering总结
  • 【C++STL简介】——我与C++的不解之缘(八)
  • 【PyTorch】深入浅出PyTorch
  • 模版进阶(template)
  • Java项目: 基于SpringBoot+mybatis+maven洗衣店订单管理系统(含源码+数据库+开题报告+任务书+毕业论文)
  • 【Flink Flick CDC】学习笔记
  • 架构设计 - 常用日志收集方案选型对比与推荐
  • 【java面试每日五题之基础篇一】(仅个人理解)
  • ACL 2024:交叉领域情感分析——论文阅读笔记
  • Kotlin cancel CoroutineScope.launch的任务后仍运行
  • PDF标准详解(五)——图形状态
  • 104. 二叉树的最大深度【 力扣(LeetCode) 】
  • VIM使用技巧
  • 从openAI最新模型GPT-o1再谈思维链(Cot)技术,大模型该怎么提升其逻辑推理能力?
  • 在 pika.SelectConnection 和 gevent 中实现高效异步:事件驱动与协程模型的冲突与优化
  • linux入门到实操-2 linux桌面、终端基本操作,文件系统、目录结构、挂载点
  • [数据集][目标检测]车窗状态检测车窗开关检测数据集VOC+YOLO格式299张3类别
  • CSS入门笔记
  • 【AI大模型-提示词的技巧】
  • python解析ip范围,拆分为所有ip数组