redis简述

2022-10-27 16:13:59 浏览数 (2)

什么是Redis

Redis是支持分布式的可持久化的内存缓存的以kay-value形式存储的nosql的非关系型数据库

相关解释
代码语言:javascript复制
nosql:
not only structured query langguage 
redis可以大量存储非结构化数据
结构化数据:属性固定的 例如学生信息 建筑信息。
非结构化数据:网页 日志文件。
代码语言:javascript复制
key-value :
处理非结构化数据的常见结构,key值是自定义的代表业务的信息,
value存储的是真正的数据
代码语言:javascript复制
非关系型数据库:
存储处理非关系型的数据
代码语言:javascript复制
可持久化:
redis采用内存为介质来提高访问速度。
优点:对数据库的访问绕过了磁盘的io所以很快。
缺点:a.内存容量小(数据库可以存储万条数据,
		内存可能只能存储万条)
      b.断电内存数据丢失,容易造成内存数据的雪崩
缺点这么明显,我们为什么还要用redis,当然就是因为redis提供了可持久化
redis会使用配置的策略将内存中的数据存储到磁盘中,数据丢失,重新启动读取
磁盘数据即可恢复。虽然一台服务器内存容量小,但是redis支持分布式,可以组成
redis集群。
代码语言:javascript复制
分布式:redis支持网络通信,就可以通过搭建多个服务器分担压力。每个redis在集群中
都可以处理不同的数据,整体处理的更多。相当于整体将数据分到了不同的节点去处理,实现
了高可用的分布式结构(哨兵集群,hash一致性,redis-cluster结构)
代码语言:javascript复制
什么是雪崩。
不可抗力倒置的数据来源丢失(数据库,缓存),造成了大量的数据丢失(缓存未命中)
海量请求涌入,倒置系统宕机,这是选择将系统重启,如果数据恢复还好,可以继续使用
如果数据未恢复将会造成宕机,重启的死循环,最后导致整个系统不可用,解决雪崩的最重要的
手段就是缓存技术支持可持久化。

缓存穿透

对于系统A,假设一秒 5000 个请求,结果其中 4000 个请求是黑客发出的恶意攻击。

黑客发出的那 4000 个攻击,缓存中查不到,每次你去数据库里查,也查不到。

举个栗子。数据库 id 是从 1 开始的,结果黑客发过来的请求 id 全部都是负数。这样的话,缓存中不会有,请求每次都“视缓存于无物”,直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给打死。

解决方式很简单,每次系统 A 从数据库中只要没查到,就写一个空值到缓存里去,比如 set -999 UNKNOWN。然后设置一个过期时间,这样的话,下次有相同的 key 来访问的时候,在缓存失效之前,都可以直接从缓存中取数据。

缓存击穿

缓存击穿,就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。

解决方式也很简单,可以将热点数据设置为永远不过期;或者基于 redis or zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据。

0 人点赞