redis 是一款基于内存的非关系型数据库,目前发展比较成熟,使用redis的公司也比较多,鉴于redis的数据全部存在内存中,并且速度特别快,所以redis适合做一些经常变化,而且数据量比较小的数据存储,比如帖子点击量,用户经验,游戏中的数据等。
本文介绍了使用redis作为点击量统计的全部过程。

安装redis和redis的php驱动
本文写作时,redis最新的版本是2.8.13,redis的php扩展phpredis的最新版本是2.2.5。

安装redis

wget http://download.redis.io/releases/redis-2.8.13.tar.gz
tar zxvf redis-2.8.13.tar.gz
cd redis-2.8.13.tar.gz
make
make install

redis没有第三方依赖包,没有configure过程,安装好之后,默认位置在 /usr/local/bin/redis-xxxx

安装完成后使用

redis-cli -v

来查看版本号

安装成功之后,接下来启动redis-server,启动参数有命令行读入和配置文件读入两种,使用配置文件读入,则首先需要创建redis的配置文件
安装包里面带了redis的默认配置文件redis.conf

cp redis.conf /etc

有兴趣可以看一下redis.conf 中的配置

#是否后台运行
daemonize yes
#进程号文件位置
pidfile /var/run/redis/redis-server.pid
#端口号
port 6379
#监听IP地址的请求
bind 127.0.0.1
#日志级别
loglevel notice
#日志储存位置
logfile /var/log/redis/redis-server.log
#数据库数量
databases 16
#内存向硬盘备份持久数据的周期
save 900 1
save 300 10
save 60 10000
#硬盘文件名
dbfilename dump.rdb
#硬盘文件所在路径
dir /var/lib/redis

接下来启动redis服务器

redis-server /etc/redis.conf

接下来就可以通过命令行工具操作redis了

redis-cli

redis有5中数据类型,每种数据类型都有自己对应的命令,所以命令比较多,这里只关注字符型的数据结构,常用的命令有

#设置某个键值
set some:thing foo
#读取某个键值
get some:thing
#读取键
keys some:*

更多命令参看http://redis.io/commands

接下来安装phpredis扩展

wget https://github.com/nicolasff/phpredis/archive/2.2.5.zip
phpize
./configure
make && make install

修改php.ini文件,添加redis扩展。
重启apache服务器,进入phpinfo.php,查看phpredis是否安装成功。

所有工具都安装好了,接下来用php进行点击量统计。
点击量统计有3个模块
1 帖子详细页面模块-点击量自增,并返回当前点击量
步骤比较简单,首先连接redis服务器,接下来发送一个incr命令
使用thread:click:{$id}的形式来命名redis的键

// Connect redis server
$redis = new redis();
$redis->connect('127.0.0.1', 6379);

// Perform increase action
$click = $redis->incr('thread:click:123');

2 帖子列表页,返回一页帖子所有的点击量
首先从mysql获得需要显示的帖子列表,然后从redis中获取需要显示的帖子点击数,两个点击量加起来即当前真实的点击量

// Connect redis server
$redis = new redis();
$redis->connect('127.0.0.1', 6379);

// Connect mysql server
$mysql = new PDO("mysql:host=localhost;dbname=thread","root","",array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 
$rs = $mysql -> query("select * from thread limit 30");

while($row = $rs -> fetch()){ 
    $click = $redis->get('thread:click:'.$row['id']);
    echo $row['id']."	";
    echo $row['title']."	";
    echo $row['click'], "+", $click, "=", $row['click']+$click;
    echo "\n";
} 

3 隔一段时间把redis中的数据转存到mysql中,并清空redis
取出所有点击量的数据,更新mysql的点击量,并删除redis中与点击量相关的键

// Connect redis server
$redis = new redis();
$redis->connect('127.0.0.1', 6379);

// Connect mysql server
$mysql = new PDO("mysql:host=localhost;dbname=thread","root","",array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 

// Fetch all clicks
$keys = $redis->keys('thread:click:*');
foreach ($keys as $key) {
    $id = substr($key,10);
    $click = $redis->get($key);
    $sql = "update thread SET `click` = `click` + $click where `id` = $id";
    echo $sql,"\n";
    $rs = $mysql -> query($sql);
}
// Delete clicks in redis
$redis->delete($keys);

redis管理工具的话,有两款不错,一个是桌面版的Redis Desktop Manager 一款是基于web的phpRedisAdmin
1 Redis Desktop Manager
官网 http://redisdesktop.com/
下载链接 http://redisdesktop.com/download
2 phpRedisAdmin
官网 https://github.com/ErikDubbelboer/phpRedisAdmin
下载地址 https://github.com/ErikDubbelboer/phpRedisAdmin/archive/v1.1.0.zip
安装
解压压缩包
也可以通过composer或者git来安装
curl -s http://getcomposer.org/installer | php
php composer.phar -s dev create-project erik-dubbelboer/php-redis-admin path/to/install
或者
git clone https://github.com/ErikDubbelboer/phpRedisAdmin.git

修改配置文件
include 目录下面有个config.sample.inc.php 改为 config.inc.php

安装第三方依赖库
cd phpRedisAdmin
git clone https://github.com/nrk/predis.git vendor

统计点击量的工作就做完了,还有一些问题值得探讨
使用redis来做一层缓存对mysql的性能到底有多大提升
redis占用的内存有多大
多久进行一次redis到mysql转存合适

参考

http://redis.io/

http://redis.readthedocs.org/en/latest/

https://github.com/nicolasff/phpredis/tree/2.2.5/

http://www.cnblogs.com/ikodota/archive/2012/03/05/php_redis_cn.html

http://blog.51yip.com/cache/1439.html

http://blog.51yip.com/cache/1440.html

https://github.com/ErikDubbelboer/phpRedisAdmin