1.Redis的简单介绍
Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务器。
Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这被称为“半持久化模式”);也可以把每一次数据变化都写到一个append onlyfile(aof)里面(“这称为全持久化模式”)。
2.Redis的生产经验教训
1.要进行Master-slave主从同步配置,在出现服务故障时候切换。
2.在master禁用数据持久化,只需在slave上配置数据持久化。
3.物理内存+虚拟内存不足,这个时候dump一直死着,时间久了机器挂掉,这个情况是灾难!
4.当Redis物理内存使用超过内存总容量的3/5时就会出现比较危险了,就开始用swap内存了。
5.档达到最大内存时候,会清空带有过期时间的key,即使key未到过期时间。
6.redis与DB同步写的问题,先写DB,后写redis,因为写内存基本上没有问题。
2.Redis部署环境搭建
①安装redis编译所需的相关依赖包
Ubuntu 和 Debain系列操作系统
apt-get -y install gcc make tcl
Redhat和CentOS 系列操作系统
yum -yinstall gcc make automake tcl
②下载redis源码安装包
sudo su- #统一切换到root家目录
mkdir -p/home/tools #统一把下载的redis安装包放到/home/tools目录
wgethttp://download.redis.io/redis-stable.tar.gz
③解压安装redis安装包
tar zxvf /home/tools/redis-stable.tar.gz
cdredis-stable/
make&& make PREFIX=/usr/local/redis install
#可以将相关命令文件安装到指定的path路径下,比如/usr/local/redis
redis-benchmark#性能测试工具,测试Redis在您的系统及您的配置下的读写性
redis-check-aof#更新日志检查
redis-check-dump#用于本地数据库检查
redis-cli#命令行操作工具
redis-server#Redis服务器的daemon启动程序
④ 配置redis相关目录以及文件
mkdir -p/usr/local/redis/{etc,run,data,log}
mkdir -p /usr/local/redis/data/6379
cd/home/tools/redis-stable
\cp/home/tools/redis-stable/redis.conf /usr/local/redis/etc/redis.conf
\cp/usr/local/redis/etc/redis.conf /usr/local/redis/etc/redis_6379.conf
sed -i‘37s/daemonize no/daemonize yes/‘ /usr/local/redis/etc/redis_6379.conf
sed -i‘41s#/var/run/redis.pid#/usr/local/redis/run/redis_6379.pid#‘/usr/local/redis/etc/redis_6379.conf
sed -i‘187s#dir ./#dir /usr/local/redis/data/6379#‘/usr/local/redis/etc/redis_6379.conf
sed -i‘103s#logfile ""#logfile /usr/local/redis/log/redis_6379.log#‘/usr/local/redis/etc/redis_6379.conf
⑤ 添加redis内存优化参数
echo"vm.overcommit_memory = 1" >> /etc/sysctl.conf
# /proc/sys/vm/overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2 表示内核允许分配超过所有物理内存和交换空间总和的内存。
Redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent占用的内存为 8G,这个时候也要同样分配8G的内存给child, 如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。
所以这里比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)。
sysctl -p #立刻生效
⑥ 自定义配置redis启动关闭脚本
vim/etc/init.d/redis
添加如下脚本
################################################################################
#!/bin/sh
PATH="/usr/local/redis/bin:$PATH"
EXEC="/usr/local/redis/bin/redis-server"
CLIEXEC="/usr/local/redis/bin/redis-cli"
PIDFILE="/usr/local/redis/run/redis_6379.pid"
CONF="/usr/local/redis/etc/redis_6379.conf"
REDISPORT="6379"
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
;;
stop)
if [ ! -f$PIDFILE ]
then
echo "$PIDFILE does not exist,process is not running."
else
PID=$(cat $PIDFILE)
echo"Stopping ..."
$CLIEXEC -p $REDISPORT shutdown
while[ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo"Redis stopped."
fi
;;
*)
echo"Usage: $0 {start|stop}" >&2
exit 1
;;
esac
###########################################################################
⑦赋与权限,启动redis服务,加载数据,测试redis
chmod +x/etc/init.d/redis && /etc/init.d/redis start #启动redis
/usr/local/redis/bin/redis-cli # 进入redis命令行
ln -s/usr/local/redis/bin/* /usr/bin # 添加软连接
加载数据
查看所有key
5. Redis的安全
警告:因为redis速度相当快,所以在一台比较好的服务器之下,一个外部的用户可以在一秒钟进行上万次的密码尝试,这意味着你需要制定非常强大的密码来防止暴力破解。
1)编辑配置文件/usr/local/redis/etc/redis_6379.conf
找到”requirepass”这一行,默认是注释掉的,去掉注释,自定义相关密码。
2)修改之后,记得重启redis服务,然后再次连接redis,发现没有密码的话,无法进行任何操作
3)使用密码以非交互式的方式连接,发现又可以进行查询和修改了
6.数据的保存和备份
因为Redis是异步写入磁盘的,如果要让内存中的数据马上写入硬盘,可以执行如下命令:
7.Redis的相关配置参数详解
daemonizeyes #是否作为守护进程运行
pidfile /usr/local/redis/run/redis_6379.pid#如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid
port 6379#默认监听端口
#bind127.0.0.1 #绑定主机IP,默认值为不绑定,即0.0.0.0
timeout 0#客户端闲置多少秒后,断开连接,默认为0,即不断开
loglevelverbose #日志记录等级,有4个可选值,debug,verbose(默认值),notice,warning
logfile/opt/redis/log/redis_6379.log #指定日志输出的文件名,默认值为stdout,也可设为/dev/null屏蔽日志
databases16 #可用数据库数,默认值为16,默认数据库为0
################################SNAPSHOTTING #################################
save 900 1#保存数据到disk的策略,当有一条Keys数据被改变是,900秒刷新到disk一次
save 30010 #当有10条Keys数据被改变时,300秒刷新到disk一次
save 6010000 #当有1w条keys数据被改变时,60秒刷新到disk一次
rdbcompressionyes #当dump .rdb数据库的时候是否压缩数据对象
dbfilenamedump.rdb #本地数据库文件名,默认值为dump.rdb
dir/opt/redis/data/6379 #本地数据库存放路径
#################################REPLICATION #################################
# slaveof<masterip> <masterport> #当本机为从服务时,设置主服务的IP及端口
#masterauth <master-password> #当本机为从服务时,设置主服务的连接密码
#requirepass foobared #连接密码
slave-serve-stale-datayes
slave-priority100
###################################LIMITS ####################################
#maxclients 128 #最大客户端连接数,默认不限制
#maxmemory <bytes> #最大内存使用设置,达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,仍到达最大内存设置,将无法再进行写入操作
##############################APPEND ONLY MODE ###############################
appendonlyno #是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认值为no
#appendfilename appendonly.aof #更新日志文件名,默认值为appendonly.aof
#appendfsync always #更新日志条件,共有3个可选值。no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次(默认值)
appendfsynceverysec
#appendfsync no
no-appendfsync-on-rewriteno
auto-aof-rewrite-percentage100
auto-aof-rewrite-min-size64mb
##################################SLOW LOG ###################################
slowlog-log-slower-than10000
slowlog-max-len128
################################VIRTUAL MEMORY ###############################
vm-enabledno #是否开启VM功能,默认值为no
vm-swap-file/tmp/redis.swap #虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-max-memory0 #将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的 (Redis的索引数据就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
vm-page-size32
vm-pages134217728
vm-max-threads4
###############################ADVANCED CONFIG ###############################
hash-max-zipmap-entries64
hash-max-zipmap-value512
list-max-ziplist-entries512
list-max-ziplist-value64
set-max-intset-entries512
zset-max-ziplist-entries128
zset-max-ziplist-value64
activerehashingyes #是否重置Hash表
8.Redis的自动化安装脚本
以上的操作步骤完全可以用下面这个自动化安装脚本代替。
可以直接运行此脚本来实现自动安装redis,兼融centos和ubuntu系列。
##############################################
#!/bin/bash
#version choose
OS=`sed -n ‘1p‘ /etc/issue|awk ‘{print $1}‘`
if [ $OS = "Ubuntu" ];then
apt-get -y install gcc make tcl
else
yum -y install gcc make automake tcl
fi
#Install redis
if [ ! -d /home/tools/ ];then
mkdir -p /home/tools
else
rm -rf /home/tools && mkdir -p /home/tools
fi
cd /home/tools
wget http://download.redis.io/redis-stable.tar.gz
tar zxvf redis-stable.tar.gz
if [ $? -eq 0 ];then
cd redis-stable/ && make && make PREFIX=/usr/local/redis install
fi
#Config redis
mkdir -p /usr/local/redis/{etc,run,data,log}
mkdir -p /usr/local/redis/data/6379
cd /home/tools/redis-stable
\cp /home/tools/redis-stable/redis.conf /usr/local/redis/etc/redis.conf
\cp /usr/local/redis/etc/redis.conf /usr/local/redis/etc/redis_6379.conf
sed -i ‘37s/daemonize no/daemonize yes/‘ /usr/local/redis/etc/redis_6379.conf
sed -i ‘41s#/var/run/redis.pid#/usr/local/redis/run/redis_6379.pid#‘ /usr/local/redis/etc/redis_6379.conf
sed -i ‘187s#dir ./#dir /usr/local/redis/data/6379#‘ /usr/local/redis/etc/redis_6379.conf
sed -i ‘103s#logfile ""#logfile /usr/local/redis/log/redis_6379.log#‘ /usr/local/redis/etc/redis_6379.conf
#Adding memory optimization parameters
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
sysctl -p
#Config start/stop script
cat > /etc/init.d/redis <<EOF
#!/bin/sh
PATH="/usr/local/redis/bin:\$PATH"
EXEC="/usr/local/redis/bin/redis-server"
CLIEXEC="/usr/local/redis/bin/redis-cli"
PIDFILE="/usr/local/redis/run/redis_6379.pid"
CONF="/usr/local/redis/etc/redis_6379.conf"
REDISPORT="6379"
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
;;
stop)
if [ ! -f \$PIDFILE ]
then
echo "\$PIDFILE does not exist, process is not running."
else
PID=\$(cat \$PIDFILE)
echo "Stopping ..."
\$CLIEXEC -p \$REDISPORT shutdown
while [ -x /proc/\${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped."
fi
;;
*)
echo "Usage: \$0 {start|stop}" >&2
exit 1
;;
esac
EOF
#Setup redis
chmod +x /etc/init.d/redis && /etc/init.d/redis start
ln -s /usr/local/redis/bin/*/usr/bin
##########################################################