存储结构和存储格式
redis使用了两种文件格式:全量数据和增量请求。全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载;增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。
redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。
save seconds updates,save配置,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。
appendonly yes/no ,appendonly配置,指出是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在于内存中。
appendfsync no/always/everysec ,appendfsync配置,no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次。
Redis 安装—服务端
下载、安装
下载最新稳定版
cd /usr/local/src/
wget http://download.redis.io/redis-4.0.1.tar.gz
tar -zxvf redis-4.0.1.tar.gz
cd redis-4.0.1
make && make install
cp redis.conf /etc/redis.conf
修改配置文件
vim /etc/redis.conf \\修改如下内容
daemonize yes
logfile "/var/log/redis.log"
dir /data/redis_data/
appendonly yes
mkdir /data/redis_data
或者备份原redis.conf,新建配置文件写入以下内容
mv /etc/redis.conf /etc/redis.conf.bak
vim /etc/redis.conf
daemonize yes
pidfile "/var/log/redis.pid"
port 6379
timeout 300
loglevel debug
logfile "/var/log/redis.log"
databases 16
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
dir /data/redis_data
appendonly no
appendfsync always
redis.conf的主要配置参数的意义
daemonize:是否以后台daemon方式运行
pidfile:pid文件位置
port:监听的端口号
timeout:请求超时时间
loglevel:log信息级别
logfile:log文件位置
databases:开启数据库的数量
save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。
rdbcompression:是否使用压缩
dbfilename:数据快照文件名(只是文件名,不包括目录)
dir:数据快照的保存目录(这个是目录)
appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。
appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)
启动redis
redis-server /etc/redis.conf
less /var/log/redis.log //查看日志如果有警告就按照它解决http://blog.51cto.com/chenshengsheng/2115482
killall redis-server
redis-server /etc/redis.conf
我们也可以编写一个redis启动脚本。
vi /etc/init.d/redis //加入如下内容:
#!/bin/sh
#
#redis init file for starting up the redis daemon
#
#chkconfig: - 20 80
#description: Starts and stops the redis daemon.
#Source function library.
. /etc/rc.d/init.d/functions
name="redis-server"
basedir="/usr/local/redis"
exec="$basedir/bin/$name"
pidfile="$basedir/var/redis.pid"
REDIS_CONFIG="$basedir/etc/redis.conf"
[ -e /etc/sysconfig/redis ] && . /etc/sysconfig/redis
lockfile=/var/lock/subsys/redis
start() {
[ -f $REDIS_CONFIG ] || exit 6
[ -x $exec ] || exit 5
echo -n $"Starting $name: "
daemon --user ${REDIS_USER-redis} "$exec $REDIS_CONFIG"
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $name: "
killproc -p $pidfile $name
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
stop
start
}
reload() {
false
}
rh_status() {
status -p $pidfile $name
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart}"
exit 2
esac
exit $?
############到此结束
创建用户
因为脚本启动时以redis用户启动的,所以需要增加redis用户
useradd -s /sbin/nologin redis
chmod 755 /etc/init.d/redis
/etc/init.d/redis start
安装redis.so扩展模块-客户端
cd /usr/local/src
wget https://coding.net/u/aminglinux/p/yuanke_centos7/git/raw/master/21NOSQL/phpredis.zip
unzip phpredis.zip
cd phpredis-develop
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make &make install
vim /usr/local/php.ini//增加extension=redis.so
/usr/local/php/bin/php -m|grep redis//看是否有redis模块
重启php-fpm服务
vim /usr/local/php-fpm/etc/php.ini//更改或增加
session.save_handler = "redis"
session.save_path = "tcp://127.0.0.1:6379"
或者apache虚拟主机配置文件中也可以这样配置:
php_value session.save_handler " redis"
php_value session.save_path " tcp://127.0.0.1:6379"
或者php-fpm配置文件对应的pool中增加:
php_value[session.save_handler] = redis
php_value[session.save_path] = " tcp://127.0.0.1:6379 "
测试
客户端:
wgt http://study.lishiming.net/.mem_se.txt
mv .mem_se.txt session.php 把session放到网站根目录
其中session.php内容可以参考https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/21NOSQL/session.php
# curl localhost/session.php
[root@localhost phpredis-develop]# curl localhost/session.php
1526157029<br><br>1526157029<br><br>edi5pqn9jtu1ndulfe8the8pi0
[root@localhost phpredis-develop]# curl localhost/session.php
1526157032<br><br>1526157032<br><br>pbg5h030i98qk18ovfjj5ggg51
服务端:
# redis-cli //命令行连接redis-cli,也可以查看到该key以及对应的值
127.0.0.1:6379> keys *
1) "PHPREDIS_SESSION:edi5pqn9jtu1ndulfe8the8pi0"
2) "PHPREDIS_SESSION:pbg5h030i98qk18ovfjj5ggg51"
测试结果:客户端和服务的键值是相对应的
如果想用php连接redis cluster,需要使用predis扩展
安装方法类似phpredis,predis扩展地址https://github.com/nrk/predis