redis記憶體分析

2022-07-21 18:45:13 字數 3617 閱讀 1420

web專案中經常會使用redis作為快取,當專案了執行一段時間後,由於不恰當的使用方法和需求迭代頻繁,導致redis記憶體快速增長,這時就需要對redis的key進行分析,刪掉無用的key以節省空間

使用redis自帶的info keyspace命令可以檢視簡略的key分布情況

rdbtools是用python開發的第三方工具,主要作用有:

1.生成csv分析報告

rdb -c memory dump.rdb > redis_memory_report.csv
2.生成json

rdb -c json dump.rdb > redis_json_report.json
3.比較兩個dump檔案

rdb -c diff dump1.rdb | sort > dump1.txt

rdb -c diff dump2.rdb | sort > dump2.txt

kdiff3 dump1.txt dump2.txt

補充:需要先安裝kdiff3

yum install kdiff3
安裝

1.pip安裝

pip isntall rdbtools
2.原始碼安裝

git clone 

cd redis-rdb-tools/

python setup.py install

安裝加速工具,加快解析速度

# 安裝依賴包

yum install python-devel

# 安裝加速工具

pip install python-lzf

生成記憶體報告

使用之前先要獲取到redis的快照(rdb檔案),使用以下命令生成記憶體報告

rdb -c memory dump.rdb -f dump_memory_report.csv
生成的csv檔案如下

上述欄位的意義如下:

database: key的redis的db

type: key速度型別

key: key的名稱

size_in_bytes: key的記憶體大小(byte)

encoding: value的儲存編碼形式

num_elements: key中的元素的個數(list,set,zset等)

len_largest_element: key中的value的最大長度

expiry: key的過期時間

如果需要對記憶體報告進行進一步的分析,可以將csv匯入mysql

先建一張表

create table redis_memory_report (

`database` tinyint(2) not null default 0 comment '資料庫',

`type` varchar(32) not null default '' comment 'key型別',

`key` varchar(255) not null default '' comment 'key',

`size_in_bytes` int(11) not null default 0 comment '記憶體大小',

`encoding` varchar(32) not null default '' comment '編碼',

`num_elements` int(11) not null default 0 comment 'value中元素個數',

`len_largest_element` int(11) not null default 0 comment 'value的最大長度',

`expiry` varchar(128) not null default ''

)engine=innodb default charset=utf8

匯入資料

load data infile 'redis_memory_report.csv' into table redis_memory_report

fields terminated by ',' optionally enclosed by '"'

escaped by '"' lines terminated by '\r\n';

注意在linux下,結束換行符是'\n'

如果報錯

the mysql server is running with the --secure-file-priv option so it cannot execute this statement
show variables like 'secure%';
結果

+------------------+-------+

| variable_name | value |

+------------------+-------+

| secure_auth | on |

| secure_file_priv | null |

+------------------+-------+

說明是secure_file_priv這個變數沒有配置造成的

解決辦法

找到配置檔案my.ini或者my.cnf,在[mysqld]下面加入一行配置

secure_file_priv = '/var'    # 表示允許目錄/var下面的檔案匯入到資料庫
將csv檔案移到/var目錄下,再次執行匯入

分析記憶體報告

1)查詢key的個數

select count(*) from dump_memory_report;
2)查詢總的記憶體占用

select count(size_in_bytes) from dump_memory_report;
3)查詢記憶體占用最高的10個key

select * from dump_memory_report order by size_in_bytes desc limit 10;
可以使用redis自帶的命令redis-memory-for-keys

redis-memory-for-key 127.0.0.1 -p 6379 -a mypassword key_name
結果

key                             name

bytes 64

type string

Redis記憶體儲存結構分析

from redis a persistent key value database with built in net inte ce written in ansi c for posix systems 本文是基於 redis v2.2.4 版本進行分析.redis 是支援多key value...

Redis原始碼分析 記憶體管理

原始碼版本 redis 2.4.4 redis記憶體相關函式都放在zmalloc.h zmalloc.c中 redis中可以使用tcmalloc jemalloc makefile ifeq use tcmalloc yes alloc dep alloc link ltcmalloc alloc ...

Redis記憶體使用情況分析

由於資料冗餘儲存在redis中,對redis快取使用量比較多,通過監控觀察。所以需要對redis記憶體使用情況進行分析。1 通過redis aof檔案分析。aof檔案記錄redis所有操作日誌,如下圖。優點可以分析key的使用情況。缺點無法分析出占用記憶體的情況,另外由於檔案較大,需要開發程式進行分...