redis内存穿透,击穿,雪崩,以及各基本数据类型

本文介绍了Redis作为非关系型数据库的优势,并详细讲解了Redis的五大基本数据类型:String、Hash、List、Set和Zset及其应用场景。同时,讨论了Redis缓存中的穿透、击穿和雪崩问题,提出了解决方案,如布隆过滤器、互斥锁和设置不同的过期时间等。

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

      首先Redis作为强大的非关系形的数据库,与强大主流的MySql,Oracle关系型数据进行有效互补,通过存储在内存里,大大提高了查询效率。以及自身独有的在高并发环境中运行的优势。这里简单介绍了redis内存穿透,击穿吗,雪崩,以及各大场景对应数据类型的情况,以及各基本数据类型应用场景。

        redis基本数据类型分为String(字符串),Hash(哈希),List(列表),Set(集合),zset(sorted set,有序集合)。

   String数据类型

    String类型的数据底层采用二进制方式进行存储数据的,因此存储的数据类型范围广泛,能够有效存储任何的数据类型,例如jpg图片格式,以及序列化的对象。它的存储上限值为512M。应用场景主要为共享session,分布式锁,计数器,以及做限流操作。

    Hash数据类型

        主要采取map的格式存储,其内部编码为ziplist压缩列表,以及hashtable哈希表。哈希表元素当小于512个且字节小于64字节时,使用ziplist压缩列表,否则使用hashtable的方式。应用场景主要是缓存用户的基本信息等。

    List列表

        redis列表可以通过将元素插入到列表的头部,也可以直接将元素插入到列表的尾部,类似于链表的相关的链式的操作。主要应用于消息队列,以及文章的列表

     Set集合(无序)

        当实际开发项目中存储数据时,有些数据是不能重复反复存储的,例如网页收藏夹,收藏了一下不能反复收藏,这个时候我们需要采用set集合方式存储。依次实现达到存储的元素不能重复的效果。内部编码为:intset(整数集合),hashtable(哈希表)。当集合中的元素存储小于512个且都是整数用inset,否则用hashtable。主要应用于网页收藏夹,以及电商购物车的限购数量和单品的操作。

      Zset集合(有序)

        与set集合类似,唯一的不同zset是有序的,其可通过代码对其进行相关的排序的操作,其底层内部编码为:ziplist(压缩列表),skiplist(跳跃表)。当zset集合元素个数少于120个,且每个元素的值小于64字节时,使用ziplist,否则使用跳跃表。应用场景:微博等各大排行榜,以及助力点赞等等实时更新需要排序的场景。

        

Redis缓存穿透,击穿,雪崩

redis缓存穿透

      一般网络请求请求图如下

 

      缓存穿透主要存在如下情况下,一般实际情况下数据通过服务器在缓存redis数据库进行查找,查找发现没有,然后在硬盘非关系型数据中进行查找(例如:mysql,oracle),也没找到,这时返回给客户端空的值。当然看似这种情况对服务器没啥特别大的影响,但是倘若有恶意攻击的人,在客户端频繁不断请求系统中不存在数据,这将会给数据库造成巨大压力,频繁攻击甚至会直接将数据库直接击穿掉。

解决方案

        布隆过滤器。其可以通过hash函数将元素映射到一个位阵列中一点,这样只需判断是否为1即可知道集合中是否为它了。有效提高了查询时间以及空间效率,唯一的缺点就是有一定的识别率删除难度比较大。

        返回空

        如果当缓存未命中,查询数据库的结果也将为空,可以将返回的空对象也存到缓存之中,这样只需要从缓存中查询返回空的对象,请求将不会落如数据中。缺点:当有大量的key穿透的时候,缓存空间会占有内存空间。key过期时间之前,这段时间可能会存在缓存和数据库不一致的情景。

缓存击穿

     缓存击穿由于当某一个热点到来时,存在大量的高并发情况,穿透缓存,直接访问数据库的情况,数据库的压力骤然增加,请求大量的阻塞。

    解决方案:

    使用互斥锁:让第一个访问的一个线程回写缓存线程执行完,然后读取缓存即可

    或者设置热点数据永不过期:不建议使用

缓存雪崩

      缓存雪崩主要存在于大量的热点key到期的时间,而查询数据量巨大,请求直接落到了数据库上,数据库直接导致崩溃。与缓存击穿不同的是,缓存击穿是指同一条数据,而缓存雪崩是指不同的数据都过期了,缓存中根本查不到,从而直接查询数据库去了。

    解决方案:

        均匀过期:设置不同的过期时间,让缓存实效的时间点均匀分布

        加互斥锁:跟缓存击穿解决思路一致,同一时间只让一个线程构建缓存,其他线程只能排队等待

        缓存永不过期:在物理时间永远不要其过期

        双层缓存策略:分为主缓存和备缓存

        主缓存:按照经验值进行设置,设置主读取的缓存,主缓存失效后从数据库加载最新的值

        备份缓存:有序时长,获取锁失败时读取的缓存,主缓存更新时需要同步更新备份缓存。       

        

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值