必知必会系列-Redis技术原理

本文探讨了Redis技术原理,包括其快速原因、单线程设计、数据结构和过期策略。还解析了缓存热点问题及其解决方案,以及缓存击穿、穿透和雪崩的概念。适合快速学习者理解Redis在高并发场景中的应用和优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章

引言

随着技术的不断演进,在不同时间阶段都会有不同的技术产物,那么如何快速的学习和掌握新的技术对于技术同学而言是非常重要的,如果我们能够带着问题去学习了解一门技术为什么存在,解决什么问题?不使用的话对我们的影响是什么?然后针对每一个技术最小化MVP是什么,思考如果自己做会怎么做,可能会面临哪些问题,然后带着问题去学习每一门是如何解决我们所面临的问题。下面是我在学习Redis的一些关键问题,大家可以尝试下解答下,下面有针对每一个提问有对应的解答提示。也欢迎沟通交流反馈你在学习过程中所遇到的问题。

  • 缓存使用的业务场景有哪些?
  • Redis为什么快?
  • 为什么采用单线程?
  • Redis 6.0之后为什么更改为多线程?
  • Redis常用的数据结构有哪些?
  • 如何解决缓存热点Key的问题?
  • 什么缓冲击穿、缓存穿透、缓存雪崩?
  • Redis数据的过期策略有哪些?

1. 缓存使用的业务场景有哪些?

存在大规模数据访问,对数据查询效率要求高且数据结构相对简单,不涉及大量的关联查询操作的业务场景下适合用缓存来提升整体的业务体验。 相比较数据库硬盘,缓存一般采用内存能够有效减少磁盘的IO操作,提高数据读写的效率,基本是高并发的互联网应用必不可少的基础服务之一。 具体应用的业务场景有:分布式Session、秒杀库存、分布式锁、会员信息等等。

2. Redis速度为什么快?

Redis的速度非常的快,单机的redis就可以支持支撑10万/秒的请求量,主要的原因有以下几点:

  • 完全基于内存操作,相比较磁盘IO更快速
  • 基于C语言实现,执行效率更高
  • 使用单线程,无上下文切换成本
  • 基于非阻塞式的IO多路复用机制

3. 为什么采用单线程?

因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

由于Redis只使用单核,而Memcached可以使用多核,所以在比较上,平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。说了这么多,结论是,无论你使用哪一个,每秒处理请求的次数都不会成为瓶颈。

4. Redis常用的数据结构有哪些?

  • String:字符串,也是比较常用的一种数据结构
  • List:链表,可以方便的进行链表的插入和删除,降低整体的成本,主要的应用场景有消息队列
  • Hash:哈希对象Map的结构,相当于key没有变化但是Value是一个Map结构
  • Set:集合对象,存储不可重复的元素集合
  • ZSet:有序集合,排好序的Set,写进去自动根据数据排序

5. 热点Key的问题如何解决?

使用缓存本身就是为了解决热点问题的,但是热点数据中还是最热的数据,比如秒杀商品,一瞬间所有流量都会命中单一的Key集中在分布式缓存集群中某一台机器,导致触发单台机器的极限,进而影响到集群其它缓存数据的访问。那么如何解决热点中的热点也是日常过程中需要去重点处理的事情。一般的处理方案有以下几种:

  • 多级缓存,针对热点Key在本地端也保存一份
  • 将热点Key进行冗余备份到集群中的多台Redis机器中

6. 什么缓冲击穿、缓存穿透、缓存雪崩?

  • 缓存击穿:缓存中的一个热点Key失效了,导致大量的请求击穿缓存直达数据库,进而对数据库性能造成较大影响。
  • 缓存穿透:与缓存击穿最为根本的区别在于,Redis查询传进来的Key值是不存在的,这将导致请求的流量均直接穿透Redis缓存直达DB,一旦被外部利用将会导致非常严重的问题,所以在日常开发过程中要做好参数的校验才能够避免此类问题的产生
  • 缓存雪崩:大量的Key同一时间失效,导致流量直接打到DB上导致系统整体奔溃

7. Redis数据的过期策略有哪些?

  • 定时过期:根据写入数据时设置的缓存失效的时间,如果到了过期时间则立即删除,该方案对内存友好能够尽早释放内存占用,但是会消耗大量的CPU去清理过期的数据
  • 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存
  • 定期删除:折中的一种方案,每隔一定的时间,默认100ms,会扫描一定数量过期的Key,并清除其中已过期的key,此处不会清理全量失效的key,否则会对Redis的整体性能造成非常大的影响
  • 内存淘汰:Redis集群一般会有固定的内存,到存入的数据超越总内存的大小,则会根据具体的策略来处理新增的数据,一般情况下是采用LRU算法,淘汰最近最不常用的数据Key
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒲春伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值