为什么要用缓存?
常见的sql数据库(如mysql,oracle等)的数据是存在磁盘中的,虽然数据库本身会有缓存技术来减少数据库IO的压力,但是由于数据库的缓存一般是针对于查询内容,并且粒度较小,一般只有表中数据没变化时,数据库中的缓存才会发产生作用。这并不能减轻数据库增删改的IO压力,因此缓存技术应运而生,该技术实现了对热点数据的高速缓存,缓解数据库压力。
数据库本身缓存技术?(mysql/oracle)
主流应用架构:

什么样的数据适合缓存?

什么是缓存击穿?
使用不存在的key频繁大量的进行高并发查询,导致缓存无法命中,每次请求都要击穿到后端数据库查询,最终可能导致数据库服务崩溃。
可以将空值缓存,并且设置较短的过期时间以应对恶意攻击,设置较短的时间能避免缓存空间的浪费。
避免恶意攻击方猜到我们使用这种策略,进而选择使用不同的key来攻击,可以进行数据拦截校验,如果key不符合我们的规则,直接返回,能拦截一部分的恶意请求。
什么是缓存并发?
当缓存失效时,高并发场景下,可能有大量请求同时访问同一个key,并且要写入数据到缓存,会增加应用和数据库的压力,违背了缓存的设计初衷,可能导致应用崩溃或者数据库崩溃。
1.加锁(分布式锁/本地锁):
使用分布式锁(本地锁),保证同一个key只有一个线程去访问数据库,其他线程等待数据写入缓存后,从缓存读取数据即可。
.png)
图示双重检查锁
2.不设置缓存过期时间,由后端定时任务控制刷新缓存数据,这样就不需要担心缓存过期,但要考虑数据量大的话,分批刷新缓存数据
什么是缓存雪崩?
缓存雪崩,是指在同一时刻,缓存集体失效,会导致数据库在这个时刻承受巨大压力。
什么时候使用redis?什么时候使用memcache?
主要有以下方面:(详见链接)
内存结构
持久化
高可用
内存分配
https://www.cnblogs.com/wangzepu/p/9777662.html
为什么redis这么快?
redis效率很高,官方给出的数据是100000+QPS(每秒查询率)
1.redis完全基于内存
2.redis是使用单进程单线程的(k,v)数据库,数据存储在内存中,不受磁盘I/O制约
3.数据结构简单,操作也简单,redis是no-sql数据库,不使用表,才用key-value键值对存储,存取效率高
4.redis使用多路I/O复用模型,为非阻塞I/O,redis使用的I/O多路复用函数是:
epoll/kqueue/evport/select
选用策略:
因地制宜,优先选择时间复杂度为 O(1) 的 I/O 多路复用函数作为底层实现。
由于 Select 要遍历每一个 IO,所以其时间复杂度为 O(n),通常被作为保底方案。 基于 React 设计模式监听 I/O 事件。
redis数据类型?
1.String类型:最大512M,二进制安全(可包含任何二进制数据,包括jpg等)
重复写入,会覆盖之前数据
.png)