存储结构和存储格式

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