为什么使用redis?
将该用户访问的数据缓存在 Redis 中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了,操作 Redis 缓存就是直接操作内存,所以速度相当快。不过这里会有 Redis 和 MySQL 双写一致性的问题。
单台设备的 Redis 的 QPS(Query Per Second,每秒钟处理完请求的次数) 是 MySQL 的 10 倍,Redis 单机的 QPS 能轻松破 10w,而 MySQL 单机的 QPS 很难破 1w。
为什么redis比mysql要快?
- Redis 是基于内存存储的 NoSQL 数据库。Redis 能够更快地读取和写入数据,而无需像 MySQL 那样频繁进行磁盘 I/O 操作。
- Redis 是基于键值对存储数据的,支持简单的数据结构。MySQL 需要定义表结构、索引等复杂的关系型数据结构。比如 Redis 用哈希表查询, 只需要O1 时间复杂度,而MySQL引擎的底层实现是B+Tree,时间复杂度是O(logn)
- Redis 采用单线程模型可以避免了多线程之间的竞争,省去了多线程切换带来的时间和性能上的开销,而且也不会导致死锁问题。
本地缓存和Redis缓存的区别?
- 本地缓存是指将数据存储在本地应用程序或服务器上,通常用于加速数据访问和提高响应速度。本地缓存通常使用内存作为存储介质,利用内存的高速读写特性来提高数据访问速度。 访问速度快、减轻网络压力、低延迟。可扩展性有限。
- 分布式缓存(Redis)是指将数据存储在多个分布式节点上,通过协同工作来提供高性能的数据访问服务。分布式缓存通常使用集群方式进行部署,利用多台服务器来分担数据存储和访问的压力。可扩展性强、数据一致性高、易于维护。访问速度相对较慢(因为数据需要从多个节点进行访问和协同)、网络开销大。
高并发场景,Redis单节点+MySQL单节点能有多大的并发量?
- 如果缓存命中的话,4 核心 8g 内存的配置,redis 可以支撑 10w 的 qps
- 如果缓存没有命中的话,4 核心 8g 内存的配置,mysql 只能支持 5000 左右的 qps
redis应用场景是什么?
- 缓存:通过将热门数据存储在内存中,可以极大地提高访问速度,减轻数据库负载
- 排行榜: Redis的有序集合结构非常适合用于实现排行榜和排名系统,可以方便地进行数据排序和排名。
- 分布式锁: Redis的特性可以用来实现分布式锁,确保多个进程或服务之间的数据操作的原子性和一致性。setnx RedLock
- 计数器 由于Redis的原子操作和高性能,它非常适合用于实现计数器和统计数据的存储,如网站访问量统计、点赞数统计等。
- 消息队列: Redis的发布订阅功能使其成为一个轻量级的消息队列,它可以用来实现发布和订阅模式,以便实时处理消息。Pub/Sub list
Redis支持并发操作吗?
Redis 的单个命令是原子性的,这意味着一个命令要么完全执行成功,要么完全不执行,确保操作的一致性。这对于并发操作非常重要。
Redis 支持事务,可以将一系列的操作放在一个事务中执行Redis 支持事务,可以将一系列的操作放在一个事务中执行。
Redis分布式锁的实现原理?什么场景下用到分布式锁?
分布式锁是用于分布式环境下并发控制的一种机制,用于控制某个资源在同一时刻只能被一个应用所使用。
- 加锁包括了读取锁变量、检查锁变量值和设置锁变量值三个操作,但需要以原子操作的方式完成,所以,我们使用 SET 命令带上 NX 选项来实现加锁;
- 锁变量需要设置过期时间,以免客户端拿到锁后发生异常,导致锁一直无法释放,在 SET 命令执行时加上 EX/PX 选项,设置其过期时间;
- 锁变量的值需要能区分来自不同客户端的加锁操作,以免在释放锁时,出现误释放操作
Redis的大Key问题是什么?
通常认为字符串类型的key对应的value值占用空间大于1M,或者集合类型的k元素数量超过1万个,就算是大key。
Redis大key问题的定义及评判准则并非一成不变,而应根据Redis的实际运用以及业务需求来综合评估。
- 内存占用过高。大Key占用过多的内存空间,可能导致可用内存不足,从而触发内存淘汰策略。在极端情况下,可能导致内存耗尽,Redis实例崩溃,影响系统的稳定性。
- 性能下降。大Key会占用大量内存空间,导致内存碎片增加,进而影响Redis的性能。对于大Key的操作,如读取、写入、删除等,都会消耗更多的CPU时间和内存资源。
- **阻塞其他操作。**某些对大Key的操作可能会导致Redis实例阻塞。例如,使用DEL命令删除一个大Key时,可能会导致Redis实例在一段时间内无法响应其他客户端请求。
- 网络拥塞。每次获取大key产生的网络流量较大,可能造成机器或局域网的带宽被打满,同时波及其他服务。例如:一个大key占用空间是1MB,每秒访问1000次,就有1000MB的流量。
- 主从同步延迟。当Redis实例配置了主从同步时,大Key可能导致主从同步延迟。由于大Key占用较多内存,同步过程中需要传输大量数据,这会导致主从之间的网络传输延迟增加,进而影响数据一致性。
- 数据倾斜。在Redis集群模式中,某个数据分片的内存使用率远超其他数据分片,无法使数据分片的内存资源达到均衡。另外也可能造成Redis内存达到maxmemory参数定义的上限导致重要的key被逐出,甚至引发内存溢出。
Redis大key如何解决?
- 对大Key进行拆分。
- 对大Key进行清理。将不适用Redis能力的数据存至其它存储,并在Redis中删除此类数据。
- 监控Redis的内存水位。
- 对过期数据进行定期清。堆积大量过期数据会造成大Key的产生。例如hash以增量形式写入
什么是热key?
QPS(每秒查询率)集中在特定的Key、带宽使用率集中在特定的Key、CPU使用时间占比集中在特定的Key。
如何解决热key问题?
- 在Redis集群架构中对热Key进行复制。在Redis集群架构中,由于热Key的迁移粒度问题,无法将请求分散至其他数据分片,导致单个数据分片的压力无法下降。此时,可以将对应热Key进行复制并迁移至其他数据分片,例如将热Key foo复制出3个内容完全一样的Key并名为foo2、foo3、foo4
- 使用读写分离架构。如果热Key的产生来自于读请求,您可以将实例改造成读写分离架构来降低每个数据分片的读请求压力,甚至可以不断地增加从节点。但是读写分离架构在增加业务代码复杂度的同时,也会增加Redis集群架构复杂度。
如何保证 redis 和 mysql 数据缓存一致性问题?
缓存雪崩、击穿、穿透是什么?怎么解决?
大量key同时过期、热点key过期、key不存在
- 雪崩:给这些数据的过期时间加上一个随机数、就加个互斥锁,保证同一时间内只有一个请求来构建缓存、让缓存“永久有效”,并将更新缓存的工作交由后台线程定时更新。
- 击穿:互斥锁、不设置过期时间
- 穿透:非法请求的限制、缓存空值或者默认值、布隆过滤器
布隆过滤器原理介绍一下
如何设计秒杀场景处理高并发以及超卖现象?
在查询商品库存时加排他锁
分布式锁
利用分布式锁+分段缓存
利用redis的incr、decr的原子性 + 异步队列