Redis相关概念
绪论
偶然间看到有关redis的⼀些讲解,才明⽩相关术语是怎么回事,所以记录⼀下。
Redis为什么这么快
Redis将数据储存在内存⾥⾯,读写数据的时候都不会受到硬盘I/O速度的限制,所以速度极快。
⽽且Redis采⽤的是基于内存的,采⽤的是单进程单线程模型的KV数据库,由C语⾔编写。
1. 完全基于内存,绝⼤部分请求是纯粹的内存操作,⾮常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查和操作
的时间复杂度都是O(1);
2. 数据结构简单,对数据操作也简单,Redis中的数据结构是专门进⾏设计的;
3. 采⽤单线程,避免了不必要的上下⽂切换和竞争条件,也不存在多进程或者多线程导致的切换⽽消耗 CPU,不⽤去考虑各种锁的问
题,不存在加锁释放锁操作,没有因为可能出现死锁⽽导致的性能消耗;
4. 使⽤多路I/O复⽤模型,⾮阻塞IO;
redis支持的数据结构5. 使⽤底层模型不同,它们之间底层实现⽅式以及与客户端之间通信的应⽤协议不⼀样,Redis直接⾃⼰构建了VM 机制 ,因为⼀般的
系统调⽤系统函数的话,会浪费⼀定的时间去移动和请求;
Redis缓存穿透
是指查询数据库⼀定不存在的数据,缓存的正常使⽤流程是:第⼀次去数据库查询获取结果,定义好键值对,把结果放⼊到缓存中。第⼆次查询直接在缓存中获取。但是当查询数据库结果为空时,是不会在缓存中放⼊结果的。假如有恶意攻击⼀直访问此接⼝,必然会对数据库造成压⼒。
解决⽅法:可以把空对象也放⼊到缓存中,设置好过期事件,⽐如30秒。这样会极⼤的降低恶意攻击对数据库造成的压⼒。
Redis缓存雪崩
是指在某⼀个时间段缓存集中过期失效。就像雪崩⼀样多个接⼝同时冲向数据库进⾏访问,必然会对服务器造成压⼒,⽽且还会周期性的出现。还有⼀种⽐较致命的⽅式,就是缓存服务器宕机了,所有请求都冲向数据库。
解决⽅法:对于常⽤到的数据设置缓存时间长⼀些,不常⽤的设置缓存时间短⼀些。对于每个访问缓存时长加上⼀个随机因⼦。由于随机因⼦的存在会极⼤降低缓存会在同⼀时间失效的概率。
Redis缓存击穿
是指某个请求在进⾏⾼并发访问缓存,当这个缓存失效后,请求直接访问数据库。这就像有⼈⼀直拿拳头打你,你某⼀次躲开了,就打到你⾝后的⼈。
解决⽅法:
简单点的⽅法,让缓存不失效就好了。缺点:是不能保持⼀致性。
还有就是使⽤mutex key(互斥锁),可以保持数据的⼀致性。缺点:是存在死锁的风险。
写在最后
我⽼是把缓存穿透和缓存击穿搞混,
相同点:对单⼀接⼝访问,都会出现⾼并发(即使是恶意的)
不同点:缓存穿透是对请求没有获取到数据库数据的⼀种处理,属于事先不知道那种(⼤量请求直接 攻击 数据库)。⽽缓存击穿是事先知道某个接⼝有⾼并发,但是未作很好的处理(⼤量请求先 攻击 缓存,缓存失效后,再 攻击 数据库)。
(若有什么错误,请留⾔指正,3Q)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。