redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都 支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排 序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文 件,并且在此基础上实现了master-slave(主从)同步。
redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复 制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布 记录。同步对读取操作的可扩展性和数据冗余很有帮助。
一 Redis安装:
1.准备redis压缩包:
2.安装gcc,解压压缩包,进入解压后的目录,直接make &&make install编译。
3.编译完成之后进入utils目录,执行初始化脚本:
3.初始化完成之后编辑配置文件/etc/redis/6379.conf:
设定bind为0.0.0.0表示监听所有端口:
4.重启redis服务:
服务端口为6379:
二 设定主从同步
1.设定server3为主,server4为从,在server3端写入数据:
2.设定server4同步server3:
编辑server4端配置文件/etc/redis/6379.conf :指定同步端ip和端口
重启server4端的redis服务,打开redis-cli就可以看到在server3端输入的数据:
三 redis主从设定:
1.在一个新的服务端server5安装redis并进行初始化配置。
2.在redis的解压目录下,将sentinel.conf文件复制到/etc/redis目录下,并编辑这个文件
编辑文件sentinel.conf:
监听本机所有端口并关闭保护模式:
设定172.25.17.3为主机:
设定宕机反应时间:
3. 在server3端服务重启之前,将配置文件发送到两个从机的/etc/redis目录下:
4. .重新开启服务,执行指令redis-server /etc/redis/sentinel.conf --sentinel查看主从状态:
在下方看到server4和server5已经成功添加为从机:
同样可以使用指令redis-cli info查看到设定的从机:
在从机端redis-cli info查看到所连接的主机:
四 redis集群环境搭建
1.在redis的安装目录下,建立集群目录并建立子目录,进入一个子目录新建配置文件redis.conf :
编辑配置文件:
2.在redis安装目录下的src目录,将redis-trib.rb复制到/usr/local/bin :
3.安装redis4.0.1:
安装成功可以在本地看到redis4.0.1 :
5.在安装目录下的cluster/7001里修改原来的文件redis.conf:
之后执行redis-sever redis.conf 开启服务,查看日志信息查看到TCP backlog需要设定为511:
查看上图中选中部分,当前TCP backlog为128,将其修改为511并设定vm.overcommit_memory为1 :
编辑/etc/sysctl将vm.overcommit_memory的设定写入配置文件:
然后按照图中选中部分要求执行指令:
7.将当前配置文件复制到其他的5各目录:
在另外五个配置文件中修改port、logfile和pidfile为所在目录,之后redis0-server redis.conf启动。netstat -antlp就可以查看到:
8.创建集群:
执行指令后输入yes接收创建设定:
可以看到每个主设备分配的哈希槽:
也可以查看主从状态:
预期配置为7006作为7001的从设备,但真实的配置可能会不一样:
实际的设置为:
redis-trib.rb check 127.0.0.1:7001查看,M端的码和S端replicates码一致的为一对主从设备。
所以图中7001和7006为主从,7003和7005为主从,7002和7004为主从:
9.测试主从功能:
以7001和7006这对主从设备为例,在7001端写入数据,在7006可以查看到:
由于集群的无中心性,在写入数据后,会located at 7002端。
7006端查看到:
主从替换测试:
结束7001的进程:
之后查看显示7001无法连接:
7006成为主设备:
五 redis+mysql
1.停掉刚才的redis进程。
2.安装nginx和php-fpm:
PHP包:
安装:
3.编辑/etc/php.ini设定时区:
4.编辑/etc/php-fpm.d/www.conf设定用户和组为nginx ,之后开启php-fpm服务:
5.编辑nginx的默认配置文件/etc/nginx/conf.d/default.conf :
index行加入php默认首页
设定文件路径:
开启nginx服务
6.在nginx的默认发布目录/usr/share/nginx/html/下新建文件index.php,写入内容,之后重启nginx:
浏览器访问:
7.还是在/usr/share/nginx/html/目录下新建index.php覆盖原来的index.php:
1 <?php
2 $redis = new Redis();
3 $redis->connect('172.25.17.4',6379) or die ("could net connect redis server");
4 # $query = "select * from test limit 9";
5 $query = "select * from test";
6 for ($key = 1; $key < 10; $key++)
7 {
8 if (!$redis->get($key))
9 {
10 $connect = mysql_connect('172.25.17.5','redis','westos');
11 mysql_select_db(test);
12 $result = mysql_query($query);
13 //如果没有找到$key,就将该查询sql的结果缓存到redis
14 while ($row = mysql_fetch_assoc($result))
15 {
16 $redis->set($row['id'],$row['name']);
17 }
18 $myserver = 'mysql';
19 break;
20 }
21 else
22 {
23 $myserver = "redis";
24 $data[$key] = $redis->get($key);
25 }
26 }
27
28 echo $myserver;
29 echo "<br>";
30 for ($key = 1; $key < 10; $key++)
31 {
32 echo "number is <b><font color=#FF0000>$key</font></b>";
33
34 echo "<br>";
35
36 echo "name is <b><font color=#FF0000>$data[$key]</font></b>";
37
38 echo "<br>";
39 }
40 ?>
###设定redis端为172.25.17.4(server4),设定mysql端为172.25.17.6(server5),数据库用户为redis,密码为westos。
8.编译phpredis
将phpredis包解压,进入解压包后编译:
9.在php中加入redis组件:
在/etc/php.d目录下将mysql.ini复制为redisini :
编辑redis.ini ,将mysql修改为redis :
之后重启php-fpm服务就可以看到php中成功jiaru了redis组件:
10. 在数据库172.25.17.5(server50端,停掉原来的mysql5.7(之前没有安装mysql5.7不需要执行这一步,直接安装新的数据库):
安装新的数据库: yum install mysql-server -y之后/etc/init.d/mysql开启数据库服务。
进入数据库后授权:这里的用户名密码需要和刚才的redis.ini中用户和密码一致:
11.将备份包test.ql导入到数据库:
test.sql文件内容:
use test;
CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');
#DELIMITER $$
#CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN
# SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`));
# END$$
#DELIMITER ;
~
导入数据库:
之后在浏览器中可以访问到数据:
12.在redis端(server4)的redis配置文件/etc/redis/6379.conf中注释掉设定本机redis为从设备的一行,表示这是一个master:
之后重启redis服务,就可以在redis端访问到数据库的数据了:
但这种模式的缺点在于,数据库端更新了数据,但在redis端得到的数据还是原来的数据并没有更新,就会出现msyql和redis数据不一致的情况。这时就需要通过mysql触发器将改变的数据同步到redis中。
六 通过mysql触发器进行mysql和redis数据同步
1.安装greamand:
先将所有依赖包安装:
然后安装gearmand:
开启服务:
2.将关联包发送到数据库端(server5):
在server5端解压:(59行错误,不执行),并拷贝 lib_mysqludf_json.so 模块(62行)
3.进入数据库注册UDF函数:
4.解压gearman-mysql ,解决依赖性后编译安装:
5.进入数据库注册UDF函数并查看:
指定 gearman 的服务信息:
编写触发器文件test.sql并导入数据库:
查看触发器:
6.给php添加gearman模块之后重启php-fpm服务:
模块添加成功:
在/etc/php.d目录下复制redis.ini为gearman.ini并编辑:
7.将worker.php复制到/usr/local目录下并 编辑,指定redis端为172.25.17.4:
8.后台运行worker:
9.在数据库端更新数据:
浏览器访问到的数据被更新: