编辑
2024-03-16
数据库
00
请注意,本文编写于 63 天前,最后修改于 63 天前,其中某些信息可能已经过时。

目录

基本数据类型
Redis为什么这么快?
缓存穿透
缓存雪崩
缓存击穿
redis架构
事物
持久化

基本数据类型

  • String(字符串)
  • Hash(哈希)
  • List(列表)
  • Set(集合)
  • zset(有序集合)

它还有三种特殊的数据结构类型

  • Geospatial:地理位置定位,用于存储地理位置信息,并对存储的信息进行操作
  • Hyperloglog:用来做基数统计算法的数据结构,如统计网站的UV。
  • Bitmap:用一个比特位来映射某个元素的状态,在Redis中,它的底层是基于字符串类型实现的,可以把bitmaps成作一个以比特位为单位的数组

image-20240316221443619


Redis为什么这么快?

  1. 基于内存存储实现:内存读写是比在磁盘快很多的,Redis基于内存存储实现的数据库,相对于数据存在磁盘的MySQL数据库,省去磁盘I/O的消耗。


  2. 合理的线程模型:多路I/O复用技术可以让单个线程高效的处理多个连接请求,而Redis使用用epoll作为I/O多路复用技术的实现。并且,Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间。


  3. 合理的数据编码:Redis 支持多种数据数据类型,每种基本类型,可能对多种数据结构。什么时候,使用什么样数据结构,使用什么样编码,是redis设计者总结优化的结果。


image-20240316221905657


缓存穿透

缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。


image-20240316222125600


缓存穿透一般都是这几种情况产生的:

  • 业务不合理的设计,比如大多数用户都没开守护,但是你的每个请求都去缓存,查询某个userid查询有没有守护。
  • 业务/运维/开发失误的操作,比如缓存和数据库的数据都被误删除了。
  • 黑客非法请求攻击,比如黑客故意捏造大量非法请求,以读取不存在的业务数据。

  1. 如果是非法请求,我们在API入口,对参数进行校验,过滤非法值。

  2. 如果查询数据库为空,我们可以给缓存设置个空值,或者默认值。但是如有有写请求进来的话,需要更新缓存哈,以保证缓存一致性,同时,最后给缓存设置适当的过期时间。(业务上比较常用,简单有效)

  3. 使用布隆过滤器快速判断数据是否存在。即一个查询请求过来时,先通过布隆过滤器判断值是否存在,存在才继续往下查。


布隆过滤器原理:它由初始值为0的位图数组和N个哈希函数组成。一个对一个key进行N个hash算法获取N个值,在比特数组中将这N个值散列后设定为1,然后查的时候如果特定的这几个位置都为1,那么布隆过滤器判断该key存在。


缓存雪崩

缓存雪奔: 指缓存中数据大批量到过期时间,而查询数据量巨大,请求都直接访问数据库,引起数据库压力过大甚至down机。


  • 缓存雪奔一般是由于大量数据同时过期造成的,对于这个原因,可通过均匀设置过期时间解决,即让过期时间相对离散一点。如采用一个较大固定值+一个较小的随机值,5小时+0到1800秒酱紫。
  • Redis 故障宕机也可能引起缓存雪奔。这就需要构造Redis高可用集群啦。

缓存击穿

缓存击穿: 指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到db。

缓存击穿看着有点像,其实它两区别是,缓存雪奔是指数据库压力过大甚至down机,缓存击穿只是大量并发请求到了DB数据库层面。可


解决方案就有两种:

  1. 使用互斥锁方案。缓存失效时,不是立即去加载db数据,而是先使用某些带成功返回的原子操作命令,如(Redis的setnx)去操作,成功的时候,再去加载db数据库数据和设置缓存。否则就去重试获取缓存。

  2. “永不过期”,是指没有设置过期时间,但是热点数据快要过期时,异步线程去更新和设置过期时间。


redis架构

  • 主从复制
  • 哨兵
  • proxy集群

主从原理

主(master)和 从(slave)部署在不同的服务器上,当主节点服务器写入数据时,会同步到从节点的服务器上,一般主节点负责写,从节点负责读


作用:读写分离,提高效率 数据热备份,提供多个副本


主从同步分类: 全量同步 从开启后,会向主发送sync命令 主收到命令后,开始生成rdb文件并使用缓冲区记录所有写的命令 完成后将快照文件和缓冲区发送给从 从收到后,会载入快照文件和执行命令


增量同步 主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令


redis哨兵

哨兵的话主要是三个功能,监控,提醒,自动故障迁移【高可用】


监控的话就是sentinel会不断的检查master和salve运作是否正常


提醒的话,当某个redis出现问题时,sentinel会向管理者发送通知


自动故障迁移是当master故障宕机时,sentinel发送通告消息,将其中一个slave升级为新的master,发布订阅模式通知其他slave,修改配置文件,保持服务连续性


事物

  • 单独的隔离操作:事务中命令会按顺序去执行,在过程中,不会被其他客户端打断

  • 原子操作:事务中的命令要么全部被执行,要么全部都不执行


持久化

方式区别如何做
RDB(默认)体积小,恢复速度快,安全性低(全备易故障丢失,持久性不如AOF),快照方式保存会单独创建一个子进程【fork】来做持久化,先将数据写进一个临时文件,等持久化过程结束,用临时文件替换之前的持久化文件
AOF体积大,恢复速度慢,安全性根据策略决定,文件方式保存将数据变更都写入指定目录下,保存数据完整性,持久化效果好

本文作者:春天y

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!