一、Redis的优势:
- 纯内存操作,每秒可以处理超过 10 万次读写操作,是已知性能最快的 Key-Value 数据库;
- 单线程工作模型,避免了上下文的切换的损耗;
- 采用非阻塞IO多路复用提高了CPU利用率;
- 通过生成rdb文件持久化储存,并利用缓冲区添加新的数据更新操作做对应的同步;
- 支持set,zset,list,hash,string五种数据类型存储;
- 提供丰富的过期策略、事务、订阅发布等支持
二、Redis的不足:
- 存储能力受机器内存大小限制,虽然本身有过期策略,但是还是需要提前预估和节约内存,如果内存增长过快,需要适当删除数据;
- 生成rdb时会占用主机的CPU;
- 初次启动时需要将硬盘中的数据加载进内存,这个过程耗时较长,且在此过程中,Redis无法提供服务。
三、Redis的过期策略以及内存淘汰机制;
定期删除:Redis默认每隔100ms,抽样检查(全量检查耗时太长)是否有过期的key,检查到有过期的key则删除;
惰性删除:Redis在查找数据时,会对key对有效期进行校验,若可以过期则将其删除;
四、Redis应对缓存穿透和缓存雪崩问题
4.1 缓存穿透:由于请求的数据均不在缓存当中,导致出发大量的数据库请求;
解决方案:
- 对数据库请求添加互斥锁,缓存失效的时候,各线程先去争锁,避免数据库操作量过大(但吞吐量会下降);
- 采用异步更新策略,无论Redis是否取到值,都直接返回,由异步线程定时更新缓存的值(需要做缓存预热,项目启动前,先加载缓存);
- 提供一个能迅速判断请求是否有效的拦截机制,请求所携带的Key是否合法有效,如果不合法,则直接返回;
4.1 缓存雪崩:同一时间大面积缓存失效,这个时候又来了一波请求,所有的请求都变为数据库请求;
解决方案: - 给缓存的失效时间,加上一个随机值,避免集体失效;
- 对数据库请求添加互斥锁(但吞吐量会下降);
- 双缓存:缓存1使用正常的有效期配置,缓存2设定一个较长的有效时间或永久有效,并通过异步线程更新缓存值。先从缓存1读数据库,有则直接返回;缓存1没有数据,则去缓存2中查找,不管结果如果,都返回并跟新缓存1中对应的值;
2020-03-01
网友评论