简介
告诉你Redis是一个牛逼货:https://www.jianshu.com/p/01b37cdb3f33
安装
Centos 源码编译安装
要有基本编译环境。
yum install -y tcl gcc
# 测试报I/O error reading reply下载新版tcl编译http://core.tcl.tk/tcl/download
# cd tcl/unix/
# ./configure && make && make install
wget http://download.redis.io/releases/redis-4.0.1.tar.gz
tar xzf redis-4.0.1.tar.gz
cd redis-4.0.1
make
make test
make install
cp redis.conf /etc/redis.conf
cd ..
rm-rf redis-4.0.1
测试通过后安装,安装后会自动把**/usr/local/redis/bin目录下的redis-server,redis-cli,redis-benchmark,redis-check-aof,redis-check-dump软链接到/usr/local/bin**目录下。
编辑redis.conf文件,vim redis.conf
修改daemonize no改成yes。
复制redis.conf到/etc目录下cp redis.conf /etc
Centos 6 自启动
编辑服务管理文件(包含chkconfig自启动)vim /etc/init.d/redis
###########################
#chkconfig: 2345 10 90
#description: Start and Stop redis
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
REDIS_CLI=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis.pid
CONF="/etc/redis.conf"
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
if [ "$?"="0" ]
then
echo "Redis is running..."
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$REDIS_CLI -p $REDISPORT SHUTDOWN
while [ -x ${PIDFILE} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
restart|force-reload)
${0} stop
${0} start
;;
*)
echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
exit 1
esac
##############################
#修改权限
chmod +x /etc/init.d/redis
#设置开机自动启动服务
chkconfig redis on
#启动服务:
service redis start
#停止服务:
service redis stop
#检查Redis是否正在工作
redis-cli
Centos 7 自启动
在Centos 7中自启动改用systemctl管理
vim /etc/systemd/system/redis-server.service
# 写入以下代码,版本一比较通用,版本2在某些版本的redis上会失效。
# 版本1(记得注释掉配置文件中的bind和设置protected-mode为no)
[Unit]
Description=The redis-server Process Manager
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /etc/redis.conf
ExecReload=/bin/kill -USR2
ExecStop=/bin/kill -SIGINT
[Install]
WantedBy=multi-user.target
######################################################
# 版本2(记得注释掉配置文件中的bind)
[Unit]
Description=The redis-server Process Manager
After=syslog.target network.target
[Service]
Type=simple
CONF=/etc/redis.conf
PIDFile=/var/run/redis_6379.pid #一般是这个路径,改成自己的路径
ExecStart=/usr/local/bin/redis-server #改成自己的路径(可以带参数关闭保护模式--protected-mode no)
ExecReload=/bin/kill -USR2 $PIDFile
ExecStop=/bin/kill -SIGINT $PIDFile
[Install]
WantedBy=multi-user.target
然后ps aux|grep redis
查看pid号(如果没有启动redis就随便指定一个pid号4-5位数)vim /var/run/redis_6379.pid
第一行写入pid号,保存退出。
systemctl daemon-reload
systemctl start redis-server.service
systemctl enable redis-server.service
#检查Redis是否正在工作
netstat -lntp
redis-cli
配置防火墙打开对应的端口:vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT
重启防火墙service iptables restart
Ubuntu
apt-get update
apt-get install redis-server
#检查Redis是否正在工作
redis-cli
外网访问
编辑配置文件,搜索:bind
在原有的127.0.0.1(redis默认只能本地访问) IP前加上本机的局域网IP,多IP以空格隔开.
保存重启redis服务即生效.
protected-mode yes 保护模式请开启
如果设置为0.0.0.0,可以同时配置密码,并把保护模式关闭;开启保护模式容易导致客户端无法连接。
如果是多个IP,且是不同网段,bind绑定也依然无法访问的,直接注释掉所有的bind,并把protected-mode设置为no;这样就允许任何主机访问了。
单机多实例、主从配置
http://www.cnblogs.com/super-d2/p/3855229.html
多机主从注意防火墙放行端口
Redis常用命令
参考:
http://www.centoscn.com/image-text/config/2015/0728/5928.html
http://doc.redisfans.com/
Redis快速入门
http://www.yiibai.com/redis/redis_quick_guide.html
一些杂项,只是怕自己会忘记,请忽略
关于Redis异常down掉后,不会自动重启(当然是因为还没有设置啦,不过一般不会死,也就没去理它)
出现问题后,首先检查是不是down掉了,真的down掉了再运行nohup redis-server &
启动服务就好了。
关于Redis的启动:http://www.tuicool.com/articles/aQbQ3u
一些常用配置、优化
redis-cli
连接之后输入info
可以看到目前的配置信息。
修改了配置文件,重启redis生效。
优化原则:
1:key的名称尽量使用简单明了的关键字,比如stu代表学生不要太长。
2:如果只是使用redis充当缓存就请关闭持久化功能。
3:redis为每种数据类型都提供了两种内部编码方式,生成时redis自己会自动根据数据类型调整使用那种编码方式。
4:slowlog慢日志查询
发现redis命令执行慢时可以通过slowlog来找出这些命令。在redis.conf中有两个参数slowlog-log-slower-than10000和slowlog-max-len 128。
- slowlog-log-slower-than10000表示当命令执行时间大于10000时此命令会被保存
- slowlog-max-len128表示redis会保存最多128条命令。
- slowlog get可以查看当前所有执行慢的命令
- slowlog len可以查看目前一共记录了多少条命令
- slowlog reset可以执行重置
设置密码
requirepass 123456
持久化
持久化工作原理参考:
Redis过期键的删除策略:https://www.cnblogs.com/lukexwang/p/4694094.html
RDB、AOF和复制时对过期键的处理:https://www.cnblogs.com/lukexwang/p/4710333.html
RDB和AOF持久化一:https://www.cnblogs.com/lukexwang/p/4699354.html
RDB和AOF持久化二:https://www.cnblogs.com/lukexwang/p/4705393.html
RDB快照
在默认情况下, Redis 将数据库快照保存在名字为 dump.rdb 的二进制文件中。
可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。也可以通过调用 SAVE 或者 BGSAVE , 手动让 Redis 进行数据集保存操作。这种持久化方式被称为快照(snapshot)。就是我们常说的备份,数据不是最新的,只是备份那一刻的数据。
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000 #60秒内容如超过10000个key被修改,则发起快照保存
AOF持久化
使用 AOF 持久化会让 Redis 变得非常耐久(much more durable):你可以设置不同的 fsync 策略,比如无 fsync ,每秒钟一次 fsync ,或者每次执行写入命令时 fsync 。**AOF 的默认策略为每秒钟 fsync 一次,在这种配置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据( fsync 会在后台线程执行,所以主线程可以继续努力地处理命令请求)。**AOF 文件是一个只进行追加操作的日志文件(append only log), 因此对 AOF 文件的写入不需要进行 seek , 即使日志因为某些原因而包含了未写入完整的命令(比如写入时磁盘已满,写入中途停机,等等), redis-check-aof 工具也可以轻易地修复这种问题。
# 修改配置文件
appendonly yes
# 临时开启(重启后失效),登录redis,CONFIG SET appendonly yes
# 同步方式有3种
appendfsync no #不主动同步,依赖系统同步,性能最好,持久化没保证
appendfsync everysec #每秒写入一次(推荐)
appednfsync always #每执行一条命令就写入,数据很安全,但是速度慢一点
# 其他一些配置默认是已经开启了,或者使用默认值就行了。
参考:
http://doc.redisfans.com/topic/persistence.html
http://oldblog.antirez.com/post/redis-persistence-demystified.html
http://blog.csdn.net/freebird_lb/article/category/1087302
http://blog.csdn.net/jackpk/article/details/30073097
https://www.jianshu.com/p/8aa619933ebb
日志级别
loglevel项,设置为:notice (默认也就是此)
共有4种级别:
- debug (a lot of information, useful for development/testing)
- verbose (many rarely useful info, but not a mess like the debug level)
- notice (moderately verbose, what you want in production probably)
- warning (only very important / critical messages are logged)
timeout
客户端空闲N秒后关闭连接(0禁用)
默认是禁用的,根据自己的需要设置。
守护进程
更改redis的启动方式为后台守护进程启动
daemonize 项设置为yes
日志文件位置
默认是空,
logfile "/home/redis_logs/redis.log"
持久化文件
默认是当前目录下
dir /home/redis_data/redisData
最大占用内存、内存置换策略
最大内存一般是最大物理内存的45%(开启持久化,子进程在复制所有数据时内存使用量会增加一倍,所以不建议超过45%),不要超过75%(没有开启持久化),其他程序占用大量内存,再适量减少,预留一部分做其他程序的缓冲。
找到maxmemory
# 45G*1024*1024*1024转换为bytes;也可以直接用46080mb 的方式书写。
# 在线字节转换:https://calc.itzmx.com
maxmemory 48318382080
设置了最大内存一定要设置 最大内存置换策略
当redis使用的内存超过设置的最大值时的处理方式
LRU算法:(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
volatile-lru : 根据LRU算法生成的过期时间来删除。
volatile-random : 对具有生存周期的key进行随机置换。
volatile-ttl : 对具有生存周期的key随机进行抽样, 置换出抽样中生存周期最短的(辅以TTL)。
allkeys-lru : 对整个db进行LRU算法置换(根据LRU算法删除任何key)。
allkeys-random : 对整个db进行随机置换,无差别随机删。
noeviction : 不进行置换,只是在写操作时返回错误。
- volatile-random和allkeys-random策略, Redis直接在相应的数据集上随机并置换.
- volatile-ttl需要抽样, 抽样的大小由maxmemory-samples控制, 默认maxmemory-samples为5, 抽样越大算法精确度越高,但是消耗也越大.
- volatile-lru和allkeys-lru是对抽样的数据中选出最近最久未使用的Key置换出去。这里抽样的大小默认是16, 如果我们设置maxmemory-samples并且大于16的话, 抽样值和最大的保持一致。
- Redis设置了一个可置换池, 大小为16, 每次先进行抽样, 抽样之后与置换池中的数据进行比较, 选出最近最久未使用的16个Key放入置换池中, 从置换池中再选择一个Key进行置换。
maxmemory-policy volatile-ttl
设置密码
打开redis.conf配置文件,找到requirepass,然后修改(重启才能生效):
requirepass yourpassword
# yourpassword就是redis验证密码,设置密码以后发现可以登陆,但是无法执行命令了,不支持特殊字符,比如@#!之类的。
redis-cli -h IP -p yourPort
keys * #输出服务器中的所有key
报错如下:
(error) ERR operation not permitted
# 这时候你可以用授权命令进行授权,就不报错了
auth youpassword
# 另外,在连接服务器的时候就可以指定登录密码,避免单独输入上面授权命令
redis-cli -h IP -p yourPort -a youPassword
已经启动的redis服务器通过命令行设置密码,但这种方式是临时的,当服务器重启了密码必须重设。命令行设置密码方式如下:
config set requirepass yourPassword
有时候我们不知道当前redis服务器是否有设置验证密码,或者忘记了密码是什么,我们可以通过命令行输入命令查看密码,命令如下:
config get requirepass
如果redis服务端没有配置密码,会得到nil,而如果配置了密码,但是redis客户端连接redis服务端时,没有用密码登录验证,会提示:operation not permitted,这时候可以用命令:auth yourpassword 进行验证密码,再执行 config set requirepass,就会显示yourpassword
由于redis并发能力极强,仅仅搞密码,攻击者可能在短期内发送大量猜密码的请求,很容易暴力破解,所以建议密码越长越好,比如20位。(密码在 conf文件里是明文,所以不用担心自己会忘记)
Redis+MySQL冷热数据交换
https://blog.csdn.net/baochao95/article/details/60761397
界面管理
可以用Redis Live(类似phpmyadmin的系统)
参考:https://www.cnblogs.com/Leo_wl/p/5870006.html
调试
也适合Codis集群
清除所有数据
redis-cli -p 19000 #连接主就行了,从会自动同步过去
auth 123456
flushall
把文本数据写入redis(大量数据)
cat /root/123.log | redis-cli -p 19000 -x set leokey
get leokey
Redis性能问题排查
参考:https://www.cnblogs.com/mushroom/p/4738170.html
报错
(error) OOM command not allowed when used memory > 'maxmemory'.
这是Codis内存不够了,
注意,此函数是在执行特定命令之前进行调用的,并且在当前占用内存低于限制后即返回OK。因此可能在后续执行命令后,redis占用的内存就超过了maxmemory的限制。因此,maxmemory是redis执行命令所需保证的最大内存占用,而非redis实际的最大内存占用。(在不考虑slave buffer和aof buffer的前提下)
参考:https://zhidao.baidu.com/question/1885669884720283268.html
进阶应用
Redis 命令参考:http://doc.redisfans.com/
Redis快速入门:https://www.yiibai.com/redis/redis_quick_guide.html
Redis-Cluster、Redis坑:http://carlosfu.iteye.com/blog/2240426
参考:
Redis的应用场景:https://mp.weixin.qq.com/s/nc3u82zQ2jOO7R52w8UPNw
Redis 设计与实现:http://redisbook.com/
使用redis遇到过的坑:http://www.lmyw.net.cn/?p=278
深入了解Redis:https://mp.weixin.qq.com/s/xB5K0ScxAWIk5Bo5vtUujw
评论区