22缓存技术对比
Redis 与 memcache能力比较
工作 memcache redis
数据类型:简单key/value 丰富的数据结构
持久化:不支持 支持(可以保存到磁盘上)
数据容灾:不支持 ,不能做数据恢复 支持,可以在灾难发生时,恢复数据
分布式存储:客户端哈希分片/一致性哈希 多种方式,主从
多线程支持:支持 支持
内存管理: 私有内存池 无
事务支持:不支持 有限支持
Redis 分布式存储方案
主从: 一主多从(主负责写,从负责读),故障时候手动切换(切换主从)
哨兵:拿一个哨兵来负责自动完成故障时候主从切换
集群:不同节点存放不同的数据
redis集群切片的常见方式:
客户端分片:在客户端通过key的hash值对应到不同的服务器
中间件实现分片:由中间件来分派
客户端服务端协作分片:客户端可采用一致性哈希,服务端提供错误节点的重定向服务slot上
redis数据分片方案
范围分片:按范围大小来分
哈希分片:用key求出hash值 如 Hash(“key") mod 4: 相比范围分片均匀
一致性哈希分片:对哈希的改进,改进哈希的扩容问题。
redis数据类型
string 存储二进制,任何类型数据 最大512MB 缓存,计数,共享Session
Hash 无序字典,数组+链表,适合存对象,key对应一个Hashmap,针对一组数据 存储,读取,修改用户属性
list 双向链表有序 增删快、查询慢;数组方式有序、增删慢、查询快 消息队列,文章列表纪录前N个最新登录的用户ID列表
Set 无序 唯一, 独立IP,共同爱好,标签
Sorted Set(Zset 有序集合) 有序 唯一 按权重 排行榜
redis数据淘汰算法(决定是否被淘汰)
不淘汰:noeviction 禁止驱逐数据,内存不足以容纳新入数据时,会报错
设置了过期时间的键空间: volatitl-random 随机移除某个key
volatitle-lru 优先移除最近未使用的key(局部性原理)
volatile-ttl ttl值小的key优先移除
全键空间 allkeys-random 随机移除某个key
allkeys-lru 优先移除最近未使用的key
redis 的持久化
RDB 和 AOF
RDB:传统数据库快照的思想,按指定时间间隔将数据进行快照存储
AOF:传统数据库日志的思想,将改变数据的命令追加到AOF文件末尾,出问题了,可以重新执行AOF文件中的命令来重建数据集
对比度 RDB AOF
备份量 全量备份 增量备份
保存间隔时间 间隔时间长 间隔时间短,默认1秒
还原速度 数据还原速度快 数据还原速度慢
阻塞情况 sava会阻塞,但bgsava或者自动不会阻塞 不会阻塞
数据体积 同等数据体积小 同等数据体积大(会记录其他数据)
安全性 数据安全性低,容易丢数据 数据安全性高,根据策略决定
redis常见问题
1 缓存雪崩
大部分缓存失效--》数据库崩溃
大部分缓存失效后,会使得大量的请求会到达数据库,导致数据库崩溃
解决方案:
使用锁或队列:保证不会有大量的线程对数据库一次性进行读写,避免雪崩时大量的并发请求
为key设置不同的缓存失效时间:尽量避免同时大部分缓存失效
二级缓存:雪崩时,避免大规模访问数据库
2 缓存穿透
查询无数据返回-》直接查数据库(缓存没有缓存的功能,比如没有的数据进行第二次查询时还去查数据库)
解决方案:
1如查数据库为空,直接设置一个默认值存放到缓存,这样第二次查的时候不用去查数据库(若是海量空值,那么还是会海量访问数据库)
2设置布隆过滤器,类似位示图。布隆过滤器用于快速识别1个元素不在一个集合中。通过一个长二进制向量和一系列随机映射函数来记录与识别
某个数据是否在一个集合中(通过3个哈希值解决哈希冲突)
优点 缺点
占用内存小 有一定的误判率,即存在假阳性,不能准确判断元素是否在集合中
查询效率高 布隆过滤器不能删除元素
不需要存储元素本身,对保密要求高有优势 不能获取元素本身
3 缓存预热
系统上线后,将相关需要缓存数据直接加到缓存系统中
解决方案
直接写个缓存刷新页面,上线时手工操作
数据量不大时,可以在项目启动的时候自动进行加载
定时刷新缓存
4 缓存更新
除了redis系统自带的缓存失效策略,常用以下两种
定期清理过期的缓存
有请求过来时,再判断是哦福过期,过期就更新
5缓存降级
降级时保证核心服务可用。在进行降级之前要对系统进行梳理,从而梳理出那些必须保护,哪些可以降级