• 缓存组件选择/多级


        缓存的设计要分多个层次,在不同的层次上选择不同的缓存,包括JVM缓存、文件缓存和Redis缓存

    1、JVM缓存

    • JVM缓存就是本地缓存,设计在应用服务器中(tomcat)。
    • 通常可以采用Ehcache和Guava Cache,在互联网应用中,由于要处理高并发,通常选择Guava Cache。

    适用本地(JVM)缓存的场景:

    1. 对性能有非常高的要求。
    2. 不经常变化
    3. 占用内存不大
    4. 有访问整个集合的需求
    5. 数据允许不时时一致

    2、文件缓存

    这里的文件缓存是基于http协议的文件缓存,一般放在nginx中。

         因为静态文件(比如css,js, 图片)中,很多都是不经常更新的。nginx使用proxy_cache将用户的请求缓存到本地一个目录。下一个相同请求可以直接调取缓存文件,就不用去请求服务器了。

    1. server {
    2. listen 80 default_server;
    3. server_name localhost;
    4. root /mnt/blog/;
    5. location / {
    6. }
    7. #要缓存文件的后缀,可以在以下设置。
    8. location ~ .*\.(gif|jpg|png|css|js)(.*) {
    9. proxy_pass http://ip地址:90;
    10. proxy_redirect off;
    11. proxy_set_header Host $host;
    12. proxy_cache cache_one;
    13. proxy_cache_valid 200 302 24h;
    14. proxy_cache_valid 301 30d;
    15. proxy_cache_valid any 5m;
    16. expires 90d;
    17. add_header wall "hello lagou.";
    18. }
    19. }

    3、Redis缓存

    分布式缓存,采用主从+哨兵或RedisCluster的方式缓存数据库的数据。

    在实际开发中:

    1. 作为数据库使用,数据要完整
    2. 作为缓存使用
    3. 作为Mybatis的二级缓存使用

    4、缓存大小

    GuavaCache的缓存设置方式:

    CacheBuilder.newBuilder().maximumSize(num) // 超过num会按照LRU算法来移除缓存

    Nginx的缓存设置方式:

    1. http {
    2. ...
    3. proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
    4. server {
    5. proxy_cache mycache;
    6. location / {
    7. proxy_pass http://localhost:8000;
    8. }
    9. }
    10. }

    Redis缓存设置:

    1. maxmemory=num # 最大缓存量 一般为内存的3/4
    2. maxmemory-policy allkeys lru #

    Redis缓存淘汰策略的选择

    • allkeys-lru : 在不确定时一般采用策略。
    • volatile-lru : 比allkeys-lru性能差 存 : 过期时间
    • allkeys-random : 希望请求符合平均分布(每个元素以相同的概率被访问)
    • 自己控制:volatile-ttl 预防缓存穿透
    • 禁止驱逐 用作DB 不设置maxmemory

    5、Redis命中率

    命中:可以直接通过缓存获取到需要的数据。
    不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作。原因可能是由于缓存中根本不存在,或者缓存已经过期。

            通常来讲,缓存的命中率越高则表示使用缓存的收益越高,应用的性能越好(响应时间越短、吞吐量越高),抗并发的能力越强。由此可见,在高并发的互联网系统中,缓存的命中率是至关重要的指标。

    通过info命令可以监控服务器状态

    1. 127.0.0.1:6379> info
    2. # Server
    3. redis_version:5.0.5
    4. redis_git_sha1:00000000
    5. redis_git_dirty:0
    6. redis_build_id:e188a39ce7a16352
    7. redis_mode:standalone
    8. os:Linux 3.10.0-229.el7.x86_64 x86_64
    9. arch_bits:64
    10. #缓存命中
    11. keyspace_hits:1000
    12. #缓存未命中
    13. keyspace_misses:20
    14. used_memory:433264648
    15. expired_keys:1333536
    16. evicted_keys:1547380

    命中率=1000/1000+20=83%

    一个缓存失效机制,和过期时间设计良好的系统,命中率可以做到95%以上。

    影响缓存命中率的因素:

    1. 缓存的数量越少命中率越高,比如缓存单个对象的命中率要高于缓存集合
    2. 过期时间越长命中率越高
    3. 缓存越大缓存的对象越多,则命中的越多

    6、性能监控指标

    利用info命令就可以了解Redis的状态了,主要监控指标有:

    1. connected_clients:68 #连接的客户端数量
    2. used_memory_rss_human:847.62M #系统给redis分配的内存
    3. used_memory_peak_human:794.42M #内存使用的峰值大小
    4. total_connections_received:619104 #服务器已接受的连接请求数量
    5. instantaneous_ops_per_sec:1159 #服务器每秒钟执行的命令数量 qps
    6. instantaneous_input_kbps:55.85 #redis网络入口kps
    7. instantaneous_output_kbps:3553.89 #redis网络出口kps
    8. rejected_connections:0 #因为最大客户端数量限制而被拒绝的连接请求数量
    9. expired_keys:0 #因为过期而被自动删除的数据库键数量
    10. evicted_keys:0 #因为最大内存容量限制而被驱逐(evict)的键数量
    11. keyspace_hits:0 #查找数据库键成功的次数
    12. keyspace_misses:0 #查找数据库键失败的次数

    Redis监控平台:grafana、prometheus以及redis_exporter。

  • 相关阅读:
    nvm 安装后出现的各种问题解决方法
    ToDoList待办事件(Vue实现)详解
    matlab 实现点云ICP 配准算法
    前端传参数进行Mybatis调用mysql存储过程执行返回值
    常见列表字典排序
    GraphQL(8):与数据库结合示例
    Java多线程-lambda表达式
    基于springboot+vue的华山旅游网(前后端分离)
    江波龙入选国家级专精特新“小巨人”企业
    W31-02-excel和logging使用,实现自动登录百度,并搜索雷军
  • 原文地址:https://blog.csdn.net/weixin_52851967/article/details/127725677