1、登陆服务器,查看tcp连接数

        netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

        查看已经建立的连接数,即ESTABLISHED的数量,发现大多数建立的ESTABLISHED连接是java和redis之间的TCP连接。

        运行config get maxclients命令,查看redis的最大连接数,如果上述命令获取的连接数远大于redis自身的允许的最大最大连接数,说明过多的连接导致redis内存占用高。


        查看监控,流量正常,也没有突发大流量进入。那很有可能是TCP连接后没有释放,找开发检查代码,是否存在方法获取redis的key后,没有close。增加关闭redis连接的代码即可。

2、查看redis是否存在过多空闲键

3、分析redis基本的内存信息

        连接redis后,使用info memory命令查看redis内存的基本信息:

        查看每个db key的数量:

        查询redis已经连接的客户端数

        查看单个redis key占用的空间 -- redis-memory-for-key -s ${host} -p ${port} key_name

        如果redis是用的集群,找到key的槽位所在的节点,port用对应的节点即可。 

寻找占用内存过高的key 

4、内存快照分析

        redis-rdb-tools 是一个 python 的解析 rdb 文件的工具,在分析内存的时候,主要用它生成内存快照。

安装redis-rdb-tools

        1.使用pip安装

                pip install rdbtools

                pip install python-lzf        # 加快转换速度

        2.使用源码安装

                # git clone https://github.com/sripathikrishnan/redis-rdb-tools 

                # cd redis-rdb-tools 

                # sudo python setup.py install

使用redis-rdb-tools 生成内存快照

        rdb -c memory dump.rdb > dump.csv

        执行完后会生成 CSV 格式的内存报告。包含的列有:数据库 ID,数据类型,key,内存使用量(byte),编码。内存使用量包含 key、value 和其他值。

        通过内存快照,可以找出占用内存超大的单个key,分析问题key产生的原因。 

5、redis内存限制

        查看redis配置文件是否限制最大内存使用,如果不设置maxmemory或者设置为0,64位系统不限制内存,32位系统最多使用3GB内存,如果未设置可以通过如下命令进行设置:

1) 通过配置文件修改

        在redis.conf配置文件中添加以下配置

        //设置Redis最大占用内存大小为500M
        maxmemory 500mb

2) 通过命令修改

        Redis支持运行时通过命令动态修改内存大小

        # 设置Redis最大占用内存大小为500M
        config set maxmemory 500mb
        # 获取设置的Redis能使用的最大内存大小
        config get maxmemory

6、redis内存淘汰

内存淘汰策略

        1. noeviction:redis默认内存淘汰策略,当内存使用超过配置的时候会返回错误,不会驱逐任何键

        2. allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键

        3. volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键

        4. allkeys-random:加入键的时候如果过限,从所有key随机删除

        5. volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐

        6. volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键

        7. volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键

        8. allkeys-lfu:从所有键中驱逐使用频率最少的键

获取当前的内存淘汰策略

        config get maxmemory-policy

修改redis.conf设置redis淘汰策略: 

        maxmemory-policy volatile-lru

通过命令修改淘汰策略:

        config set volatile-lru allkeys-lru

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐