目录
1、常见分类
1、MemCache
Memcache是一个高性能的分布式的内存对象缓存系统,用于动态Web 应用以减轻数据库负载。Memcache通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。
2、Redis
Redis 是一个开源的使用 ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的API。
3、Squid
Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher、HTTPS 和 HTTP 协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、1/0驱动的进程来处理所有的客户端请求。
2、集群切片方式
3、Redis
3.1、分布式存储方式
- 主从(Master/Slave)模式:-主多从,故障时手动切换。
- 哨兵((Sentinel)模式:有哨兵的一主多从,主节点故障自动选择新的主节点。
- 集群(Cluster)模式:分节点对等集群,分slots,不同slots的信息存储到不同节点。
3.2、数据分片方式
列表分片:属性的离散值,如按城市区域
3.3、数据类型
ZSet 常用命令
|------------------------------------------------------------------|------------------------------------|
| ZSCAN | 迭代有序集合中的元素(包括元素成员和元素分值),也可判断元素是否存在 |
| ZSCORE | 返回有序集中,成员的分数值 |
|---------------------------------------------------------------|----------------|
| ZRANK | 返回有序集合中指定成员的索引 |
|---------------------------------------------------------------|-----------------------------|
| ZADD | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
| ZCARD | 获取有序集合的成员数 |
3.4、持久化方案
rdb 与 aof
3.5、内存淘汰机制
- volatile-lru 从设置过期时间的数据集中挑选出最近最少使用的数据淘汰。
- volatile-ttl 除了淘汰机制采用LRU,策略基本上与volatile-lru相似,从设置过期时间的数据集中挑选将要过期的数据淘汰,ttl值越大越优先被淘汰。
- volatile-random(过期随机) 从已设置过期时间的数据集中任意选择数据淘汰。
- allkeys-lru 从数据集中挑选最近最少使用的数据淘汰,该策略要淘汰的key面向的是全体key 集合,而非过期的key 集合。
- allkeys-random(全键随机):从数据集中选择任意数据淘汰。
- no-enviction:禁止驱逐数据,也就是当内存不足以容纳新入数据时,禁止新的写入,线上任务也不能持续进行,采用no-enviction策略可以保证数据不被丢失,这也是系统默认的一种淘汰策略。
3.6、Redis常见问题
1)缓存雪崩:大部分缓存失效 ->数据库崩溃
解决方案:
- 使用锁或队列:保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。
- 为 key 设置不同的缓存失效时间:在固定的一个缓存时间的基础上+随机一个时间作为缓存失效时间。
- 二级缓存:设置一个有时间限制的缓存+一个无时间限制的缓存。避免大规模访问数据库。
2)缓存穿透:查询无数据返回->直接查数据库
解决方案:
- 如果查询结果为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了。设置一个不超过5分钟的过期时间,以便能正常更新缓存。
- 设置布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个 bitmap拦截掉,从避免了对底层存储系统的查询压力。
3)缓存预热
解决方案:
- 直接写个缓存刷新页面,上线时手工操作。
- 数据量不大时,可以在项目启动的时候自动进行加载。
- 定时刷新缓存。
4)缓存更新
解决方案:
- 除 Redis 系统自带的缓存失效策略,常见采用以下两种:定时清理过期的缓存。
- 当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。
4、布隆过滤器
布隆过滤器用于快速识别1个元素不在一个集合中。
通过一个长 二进制向量 和一系列 随机映射函数来记录与识别某个数据是否在一个集合中。