22缓存技术对比

wumingliang / 2023-08-11 / 原文

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缓存降级

降级时保证核心服务可用。在进行降级之前要对系统进行梳理,从而梳理出那些必须保护,哪些可以降级