一、持久化(对比 memcache) 1、RDB持久化(持久化内存数据) 2、AOF(持久化 buffer中的命令)
二、单线程 优势:对小数据的吞吐性能高于memcached(不存在线程分配、线程切换的时间消耗) 劣势:对大数据块的吞吐能力比较吃力(大数据块的读写造成的IO阻塞,使单线程的劣势暴露出来)
当数据大小超过10K时,redis写入性能已经慢让人无法忍受; 当然在读性能上依然可观,因为数据在内存中,基于内存的读写速度比从磁盘读到内存快的多。
三、发布/订阅 支持发布、订阅模式,使其不仅仅是一款缓存中间件,也可用作一个消息对列,以及注册中心 (对比于 zookeeper做注册中心) Redis发布/订阅 是一种消息广播模型,而不支持单播模式; 所以发布、订阅多用于注册中心,而不是消息队列。
四、事务—— MULTI+EXEC 命令入Queue的事务保证,命令执行却无法保证事务特性
五、复制 —— SLAVEOF 详细挖掘redis的复制功能改进
六、高可用—— sentinel
七、分布式其群—— CLUSTER 六七,对比memecache,memcached是没有分布式协调能力的,需要借助客户端完成分布式协调
八、常见难题 1、缓存穿透 (指,查询一个不存在的key值,即缓存未命中而DB中也没有;会不断频繁的访问数据库) 经常是为了防止有人恶意针对未存在的数据做查找而导致数据库因高并发访问而崩溃。
解决方案: ①当在数据库中未查找到该key值时,仍然将该key写入缓存(其值为null),并设置过期时间 ;以保护后端数据源 (过期时间为解决空间膨胀,而该key因BD后续插入导致的不一致问题,可以在DB插入后以消息方式通知redis擦除响应key) ②布隆过滤器 使用redis-Bitmaps构建布隆过滤器; 布隆过滤器存储了所有缓存目标的key(当数据插入新行时,需要更新布隆过滤器); 则程序访问数据的路线是: ——布隆过滤器(miss/存在)——缓存(hit / miss)——DB 即,先访问BloomFilter,在BloomFilter中命中才去访问缓存(缓存命中则返回,未命中则访问DB)
Notice: 布隆过滤器适用于数据实时性不高的场景
2、热点key 某热点key在失效后,被高并发访问,继而大量线程来重建该缓存key值,导致应用后端负载加大,应用崩溃。
解决方案: ①写缓存互斥锁: 即:缓存miss则去获取mutex-lock,获取锁后重建缓存; 未获取到所则,线程等待一段时间,继续执行上一步骤(查询缓存。。。) ②
3、缓存击穿
4、缓存失效
5、缓存雪崩 由于缓存层宕掉等原因,导致高并发的请求访问存储层,致使存储层服务奔溃。(缓存在高并发环境保护存储层)
解决方案: ①缓存层高可用HA Redis-Sentinel, Redis-Cluster
②资源池、线程池等限流策略