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 '\n' 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

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(大部分情况已失效) 然后数据库中存在  延长过期时间或者设置永不过期
13 占用分析
    内存占用分别为未过期keys+过期keys 可以通过生成rdb文件来导出进行分析查看
14  删除动作

    0 del/unlink 删除keys的命令
   1 针对过期keys的处理
      1 惰性删除-程序get|scan 查询命令  对于大部分过期的keys,如果没有get,是不会主动删除.一旦并发get过期keys,就会发生大量过期keys被主动删除情况

              scan 0  match "aaa" count 10000 根据提示继续 scan index  match "aaa" count 10000  通过主动scan 可以短时间内释放大量的过期keys
      2 主动删除-后台任务后台任务每十秒执行进行主动性的key删除,可以理解成为一个crontab,通过调整hz参数可以提高主动删除key的频率
  2 内存一旦到达max_memory时会采用特殊策略,1 是要到达内存限制 2 是 evict 也有表现,驱逐keys数就是特殊策略采取的动作
    在设置了过期时间的数据中进行淘汰:
    volatile-random:随机淘汰设置了过期时间的任意键值;
    volatile-ttl:优先淘汰更早过期的键值。
    volatile-lru(Redis3.0 之前,默认的内存淘汰策略):淘汰所有设置了过期时间的键值中,最久未使用的键值;
    volatile-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰所有设置了过期时间的键值中,最少使用的键值;
    在所有数据范围内进行淘汰:
    allkeys-random:随机淘汰任意键值;
    allkeys-lru:淘汰整个键值中最久未使用的键值;
    allkeys-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰整个键值中最少使用的键值

 

posted @ 2021-04-29 14:43  开心的蛋黄派  阅读(576)  评论(0编辑  收藏  举报