Write the Code. Change the World.

6月 23

redis特性

redis是一种key-value存储。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。value类型有字符串,哈希,链表,集合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务器。

redis的所有数据都是保存在内存中(效率高),然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。

redis使用场景
1. 取最新N个数据的操作
2. 排行榜应用,取TOPN操作
3. 需要精确设定过期时间的应用
4. 计数器应用
5. Uniq操作,获取某段时间所有数据排重值
6. 实时系统,反垃圾系统
7. Pub/Sub构建实时消息系统
8. 构建队列系统
9. 缓存

redis的特性使得它有足够的魅力。在php站点中,php redis的使用也越来越多。redis的特性以及应用场景 可以参考下边的文章:
http://www.cnblogs.com/markhe/articles/5689102.html

想要使用php redis扩展,必然先要安装redis

下载安装redis

在redis的官网https://redis.io/download中,可以看到redis的各个版本。此刻(2017年04月28日),redis稳定版的最新版本是 3.2.8。
先安装编译环境(这些程序在安装php,nginx的时候已经安装过了。只安装没安装的)。

yum install gcc
yum install gcc-c++ libstdc++-devel
yum install zlib-devel

再下载redis,并编译。

cd /usr/local/src/redis
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
tar -xzvf redis-3.2.8.tar.gz
cd redis-3.2.8
make

编译成功后,末尾会提示。

Hint: It's a good idea to run 'make test' 😉

make[1]: Leaving directory `/usr/local/src/redis/redis-3.2.8/src'

安装。

make install PREFIX=/data/server/redis   #prefix安装目录

配置并启动redis

将redis-3.2.8中的redis.conf复制到/data/server/redis/etc/,并修改redis.conf中的daemonize为yes。这样,redis可以在后台运行。

cp /usr/local/src/redis/redis-3.2.8/redis.conf /data/server/redis/etc/
vi /data/server/redis/etc/redis.conf   #编辑redis.conf
daemonize yes   #将此行对应的no改成yes。

/data/server/redis/bin/中启动服务,默认端口是6379。

/data/server/redis/bin/redis-server /data/server/redis/etc/redis.conf

启动客户端。

/data/server/redis/bin/redis-cli   #运行客户端,然后可以做些redis操作

redis简单操作。

keys *   #查看所有的key。如果没有,是empty
set name vini123   #添加一个key为'name',value为'vini123'的kev-value对象。
get name   #获取key是'name'的value值。

检查redis进程,端口情况,以及关闭服务

ps -ef|grep redis   #检测后台进程是否存在
netstat -lntp | grep 6379   #检测6379端口是否在监听
pkill redis   #关闭redis服务

下载安装php redis扩展

php redis的版本:http://pecl.php.net/package/redis
github php redis:https://github.com/phpredis/phpredis

当前,最新版本是3.1.2,下载,解压,并安装。

cd /usr/local/src/php-redis   #进入欲下载的目录
wget https://github.com/nicolasff/phpredis/archive/3.1.2.tar.gz
tar -xzvf 3.1.2.tar.gz
mv phpredis-3.1.2 /data/server/php-redis
cd /data/server/php-redis
phpize
./configure 
make && make install

安装完成后的提示。

Build complete.
Don't forget to run 'make test'.

Installing shared extensions:     /data/server/php/lib/php/extensions/no-debug-non-zts-20160303/

/data/server/php/lib/php/extensions/no-debug-non-zts-20160303/目录下,发现redis.so

配置php.ini

先找到php.ini有时候,如果不知道php.ini在什么位置。这个时候,有两种方法可以找到他。一种是建立一个php文件,打印phpinfo 信息,Loaded Configuration File 对应的信息就是php.ini的位置。

<?php
    echo phpinfo();
?>

还有一种方法,通过find命令。

find / -name php.ini

个人觉得,通过命令最方便。找到php.ini的位置了,就可以编辑它。在php.ini中加入

extension=redis.so。保存,退出。然后,重启php和ngiinx。
vi /data/server/php/etc/php.ini
extension="redis.so"   #末尾加入此行
/etc/init.d/php-fpm restart   #重启php
/data/server/nginx/sbin/nginx -s reload   #重启nginx

通过,phpinfo可以看到现在php-redis扩展已经安装成功了。如下图所示:

配置开机自启动

其实,启动脚本(redis_init_script)已经在源代码包里(redis/utils/)。我们只要将启动脚本复制到/etc/init.d/下,稍作修改。然后执行chkconfig redis on就可以了。这个时候,你不必再进安装目录文件进行启动redis了。

cp /usr/local/src/redis/redis-3.2.8/utils/redis_init_script /etc/init.d/redis
vi /etc/init.d/redis

首先在脚本开头,加入以下两行注释,用来修改redis 的运行级别。

#!/bin/sh
# chkconfig:   2345 90 10
# description:  Redis is a persistent key-value database

然后修改EXEC、REDIS_CLI、CONF对应的值。分别对应服务端位置、客户端位置、配置文件位置。保存,退出。修改后的脚本如下;

#!/bin/sh
# chkconfig:   2345 90 10
# description:  Redis is a persistent key-value database

REDISPORT=6379
EXEC=/data/server/redis/bin/redis-server
CLIEXEC=/data/server/redis/bin/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/data/server/redis/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
        ;;
    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 "Please use start or stop as first argument"
        ;;
esac

执行权限,并开启服务重启自启动。

chmod +x /etc/init.d/redis   #执行权限
chkconfig redis on   #系统服务中启动redis服务
chkconfig --list   #系统服务启动列表
/etc/init.d/start   #启动redis

redis配置文件参数参考

#redis进程是否以守护进程的方式运行,yes为是,no为否(不以守护进程的方式运行会占用一个终端)。 如果需要在后台运行,把该项改为yes
daemonize no
#指定redis进程的PID文件存放位置
pidfile /var/run/redis.pid
#redis进程的端口号
port 6379
#绑定的主机地址,设置后只接受来自该ip的请求
bind 127.0.0.1
#客户端闲置多长时间后关闭连接,默认此参数为0即关闭此功能
timeout 300
#redis日志级别,可用的级别有debug.verbose.notice.warning
loglevel verbose
#log文件输出位置,如果进程以守护进程的方式运行,此处又将输出文件设置为stdout的话,就会将日志信息输出到/dev/null里面去了
logfile stdout
#设置数据库的数量,默认为0可以使用select 命令在连接上指定数据库id
databases 16
#指定在多少时间内刷新次数达到多少的时候会将数据同步到数据文件;
save
#指定存储至本地数据库时是否压缩文件,默认为yes即启用存储;
rdbcompression yes
#指定本地数据库文件名
dbfilename dump.db
#指定本地数据问就按存放位置;
dir ./
#指定当本机为slave服务时,设置master服务的IP地址及端口,在redis启动的时候他会自动跟master进行数据同步
slaveof
#当master设置了密码保护时,slave服务连接master的密码;
masterauth
#设置redis连接密码,如果配置了连接密码,客户端在连接redis是需要通过AUTH命令提供密码,默认关闭
requirepass footbared
#设置同一时间最大客户连接数,默认无限制;redis可以同时连接的客户端数为redis程序可以打开的最大文件描述符,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxclients 128
#指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory
#指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no
#指定跟新日志文件名默认为appendonly.aof
appendfilename appendonly.aof
#指定更新日志的条件,有三个可选参数no:表示等操作系统进行数据缓存同步到磁盘(快),always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全), everysec:表示每秒同步一次(折衷,默认值);
appendfsync everysec
#是否开启虚拟内存支持 (vm开头的参数都是配置虚拟内存的)
vm-enabled
#设置虚拟内存的交换文件路径
vm-swap-file
#设置redis使用的最大物理内存大小
vm-max-memory
#设置虚拟内存的页大小
vm-page-size
#设置交换文件的总的page数量
vm-pages
#设置VM IO同时使用的线程数量
vm-max-threads
#把小的输出缓存存放在一起
Glueoutputbuf
#设置hash的临界值
hash-max-zipmap-entries
#重新hash
Activerehashing

发表评论

电子邮件地址不会被公开。 必填项已用*标注