redis是一个很好的缓存中间件,当我们的请求很多的时候,频繁读取数据库肯定是不可取的。而当数据请求太大,对redis的操作压力也会加大。当单机redis的cpu占用率超过了50%以上,我这边是到了100%的时候,优化redis就势在必行了。
首先我们想到的是将redis进行读写分离,那么采用哨兵模式是最好的方式
sudo tar -xvf redis-6.2.6.tar.gz -C /usr/local/redis && cd /usr/local/redis/redis-6.2.6 && sudo make
sudo cp /usr/local/redis/redis-6.2.6/src/redis-server /usr/local/bin/
sudo cp /usr/local/redis/redis-6.2.6/src/redis-cli /usr/local/bin/
sudo cp /usr/local/redis/redis-6.2.6/src/redis-sentinel /usr/local/bin/
先在根目录下创建一个myredis的文件夹
sudo mkdir myredis
sudo chmod 777 myredis
然后在myredis文件夹下面创建6个配置文件,可以直接到这里下载:redis哨兵模式配置文件
#!/bin/sh
#start redis master-slave
redis-server /myredis/redis6379.conf
redis-server /myredis/redis6380.conf
redis-server /myredis/redis6381.conf
redis-sentinel /myredis/sentinel26379.conf
redis-sentinel /myredis/sentinel26380.conf
redis-sentinel /myredis/sentinel26381.conf
最后使用sudo start start-redis-sentinel.sh 启动即可
使用redis哨兵模式后,我发现6379对应的redis进程,就是主进程的cpu占用率还是居高不下,另外两个进程cpu占用率不高,由此我怀疑还是代码里面写的操作压力太大。于是考虑redis集群模式。
先在根目录下创建一个myredis的文件夹
sudo mkdir myrediscluster
sudo chmod 777 myrediscluster
然后在myrediscluster文件夹下面创建6个配置文件,可以直接到这里下载:redis集群模式配置文件
#!/bin/sh
#start redis cluster
redis-server /myrediscluster/redis6001.conf
redis-server /myrediscluster/redis6002.conf
redis-server /myrediscluster/redis6003.conf
redis-server /myrediscluster/redis6004.conf
redis-server /myrediscluster/redis6005.conf
redis-server /myrediscluster/redis6006.conf
sleep 10s
redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006
最后使用sudo start start-redis-cluster.sh 启动即可
集群搭建完毕后,确实3个主redis的cpu占用率得到了平分后有一定程度的下降。优化基本结束了。 当然redis写的压力太大,最后我还是去优化了代码,集群虽然能解决问题,但还是更多的要去代码层面分析问题。尽量不要在太高的并发逻辑里面做写的操作
。
以下是一些参考文档
redis安装教程和redis集群搭建–主从复制(读写分离)、中间人模式(主仆兼具、去中心化)、反客为主、哨兵模式,从实战出发的保姆级别教程
Redis(1):四种模式(单机、哨兵、集群、主从复制)原理