Redis企业架构设计
组件选择/多级
缓存的设计要分多个层次,在不同的层次上选择不同的缓存,包括JVM缓存、文件缓存和Redis缓存
JVM缓存
JVM缓存就是本地缓存,设计在应用服务器中(tomcat)。
通常可以采用Ehcache和Guava Cache,在互联网应用中,由于要处理高并发,通常选择Guava Cache。
适用本地(JVM)缓存的场景:
-
对性能有非常高的要求
-
不经常变化
-
占用内存不大
-
有访问整个集合的需求
-
数据允许不时时一致
文件缓存
这里的文件缓存是基于http协议的文件缓存,一般放在nginx中。
因为静态文件(比如css,js, 图片)中,很多都是不经常更新的。nginx使用proxy_cache将用户的请求缓存到本地一个目录。下一个相同请求可以直接调取缓存文件,就不用去请求服务器了。
1 | server { |
Redis缓存
分布式缓存,采用主从+哨兵或RedisCluster的方式缓存数据库的数据。
在实际开发中
作为数据库使用,数据要完整
作为缓存使用,作为Mybatis的二级缓存使用
缓存大小
GuavaCache的缓存设置方式:
1 | CacheBuilder.newBuilder().maximumSize(num) // 超过num会按照LRU算法来移除缓存 |
Nginx的缓存设置方式:
1 | http { |
Redis缓存设置:
1 | maxmemory=num # 最大缓存量 一般为内存的3/4 |
缓存淘汰策略的选择,可以查看Redis缓存过期和淘汰策略博客文章
key数量
官方说Redis单例能处理key:2.5亿个
一个key或是value大小最大是512M
读写峰值
Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提供的数据是可以达到110000+的QPS(每秒内查询次数)。80000的写
命中率
命中:可以直接通过缓存获取到需要的数据。
不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作。原因可能是由于缓存中根本不存在,或者缓存已经过期。
通常来讲,缓存的命中率越高则表示使用缓存的收益越高,应用的性能越好(响应时间越短、吞吐量越高),抗并发的能力越强。
由此可见,在高并发的互联网系统中,缓存的命中率是至关重要的指标。
通过info命令可以监控服务器状态
1 | 127.0.0.1:6379> info |
命中率=1000/(1000+20)=98%
一个缓存失效机制,和过期时间设计良好的系统,命中率可以做到95%以上。
影响缓存命中率的因素:
-
缓存的数量越少命中率越高,比如缓存单个对象的命中率要高于缓存集合
-
过期时间越长命中率越高
-
缓存越大缓存的对象越多,则命中的越多
过期策略
Redis的过期策略是定时删除+惰性删除,这个前面已经讲了。
性能监控指标
利用info命令就可以了解Redis的状态了,主要监控指标有:
1 | connected_clients:68 #连接的客户端数量 |
Redis监控平台:grafana、prometheus以及redis_exporter。
缓存预热
缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询实现被预热的缓存数据。
加载缓存思路:
-
数据量不大,可以在项目启动的时候自动进行加载
-
利用定时任务刷新缓存,将数据库的数据刷新到缓存中