• redis基础篇~内存篇


     
    1 内存的计算公式
        used_memory_rss Redis进程占用的物理内存总量 这是直观在redis显示的,也是最关注的
        used_memory Redis分配器分配的内存总量,也是我们设置的maxmemor大小
        used_memory_peak_human  最大使用内存总量(峰值)
        mem_fragmentation_ratio used_memory_rss/used_memory比值,内存碎片率
        mem_allocator Redis所使用的内存分配器,默认jemalloc
    2 调整redis内存大小
        config get max_memory
        conifg set maxmemory 4gb 内存
        config get max_memory
        config rewrite
    3 内存碎片的影响
       mem_fragmentation_ratio的不同值,说明不同的情况。
        大于1:说明内存有碎片,一般在1到1.5之间是正常的。
        大于1.5:说明内存碎片率比较大,需要考虑是否要进行内存碎片清理,要引起重视。
        小于1:说明已经开始使用交换内存,也就是使用硬盘了,正常的内存不够用了,需要考虑是否要进行内存的扩容。
    4 一些思想
        rss的占用是可以被redis回收掉的,峰值肯定要参考peak_hum
    5 分析大key的占用
      1 安装rdb_tool工具
      2 进行分析
       redis-profiler rdb -f rdb.html 查看类型分布
       rdb -c memory rdb -f dmp.csv 根据内存进行排序导出的csv  csv文件大小小于rdb大小
      CREATE TABLE `table_name (

      `database_redis` varchar(255) DEFAULT NULL,
     ` type_redis` varchar(255) DEFAULT NULL,
      `key_redis` text,
      `size_in_bytes_redis` int(11) DEFAULT NULL,
      `encoding_redis` varchar(255) DEFAULT NULL,
      `num_elements_redis` varchar(255) DEFAULT NULL,
      `len_largest_element_redis` varchar(255) DEFAULT NULL,
      `expiry_redis` varchar(255) DEFAULT NULL,
      KEY `idx_type` (`type_redis`),
      KEY `idx_size` (`size_in_bytes_redis`),
      KEY `idx_expire` (`expiry_redis`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    LOAD DATA LOCAL INFILE 'csv_name' INTO TABLE table_name FIELDS TERMINATED BY ',' LINES TERMINATED BY ' ' IGNORE 1 LINES

     3 sql语句查看    

       select key_redis,concat(round(size_in_bytes_redis/1024/1024,2),'MB') as key_size from redis_db order by size_in_bytes_redis desc limit 100; 查看top100

       select type_redis,count(*) from redis_db group by type_redis;  查看redis key类型数量

       select key_redis from redis_db where expiry_redis is null ;  查看没有设置过期时间的key

    6 4.0X版本之后的优化
       1 已经可以开始自动整理内存碎片了,设置相关参数
    7 内存可能问题
       1 存在大量的key,有可能存在大key
       2 可能存在空间碎片
       3 没有设置过期策略
    8 淘汰策略与数据删除
       1 所有的业务key 应该都需要设置过期时间,其中string比较特殊命令是setnx,其他类型都是exprie
       2 redis大部分情况对于已经过期的key,如果没有再次get,是不会进行删除的(这里要特别注意,我们通过redis info可以发现大量的过期key,但是没有被访问所以依然存在),造成了内存上的浪费,但是节省了cpu资源-惰性删除
       3 redis也会通过后台任务每十秒执行进行主动性的key删除,可以理解成为一个crontab,通过调整hz参数可以提高主动删除key的频率 -主动删除
       4 在到达maxmemory时也会触发过期key的删除
     9 关于rdb和内存一点补充
       redis内存数据>rdb文件>csv分析数据=mysql-table
       过期的key是不进入RDB文件,这也是为什么redis内存数据远远大于rdb文件
    10 关注参数
       redis-info keys ,expires 
    11关注监控图
        1 memory usage  内存使用率
        2 total items per DB  内存总量key的增长趋势,如果内存使用率增长,这里会同步增长
        3 expring or not expring keys  写入的key中 设置过期时间与没有设置过期时间的keys数量之比对应redis-info-expires  排除写入key无法呗淘汰的情况
    12 高并发缓存概念
        1 缓存雪崩 - 针对redis服务down掉 或者 key集体失效   解决办法 是建立哨兵或者集群 key设置随机值进行间隔失效
        2 缓存穿透- 针对访问在redis中并不存在的key. 数据库也并不存在 可以采用布隆过滤器 或者设置空值应对同一key访问 
        3 缓存击穿-针对访问在redis中key(大部分情况已失效) 然后数据库中存在  延长过期时间或者设置永不过期
     

  • 相关阅读:
    [iOS]UIDynamicAnimator动画
    [iOS]被忽略的main函数
    [iOS]app的生命周期
    vue 封装http请求时错误信息提示使用element-ui message,只提示一次
    angular8 Vue 导出excel文件
    python3 tornado api + angular8 + nginx 跨域问题
    ubutu tornado python3.7.5 nginx supervisor 部署web api
    angular cli 反向代理实现跨域
    angular8自定义管道、指令以及获取dom值
    angular cli 使用echarts
  • 原文地址:https://www.cnblogs.com/danhuangpai/p/14717915.html
Copyright © 2020-2023  润新知