redis 和 mysql 的区别
-
类型上
从类型上来说,mysql是关系型数据库,redis是缓存数据库
-
作用上
-
mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢
-
redis用于存储使用较为频繁的数据到缓存中,读取速度快
-
-
需求上
mysql和redis因为需求的不同,一般都是配合使用。
redis 的安装和使用
安装包:链接:redis5.0 提取码: sna8
源码解压,进入解压目录,
make && make install
, 之后进入utils/目录下
./install_server.sh 执行脚本. 会自动生成二进制启动脚本在/etc/init.d/redis_6379
, 主配置文件在/etc/redis/6379.conf
.
会自动生成配置文件。
修改主配置文件,默认在/etc/redis/6379.conf
修改, 修改监听接口为0.0.0.0
redis 常用的命令
redis-cli 进入交互界面
命令 | 作用 |
---|---|
set key value | 设置一个变量key的值是value |
get key | 获取一个变量key的值 |
expire key 数字 | 规定一个变量key值,到期的时间为多少秒 |
incr key | 对key变量进行迭加 |
key * | 获得当前所有的key值 |
info | 获得服务器详细信息 |
redis 的主从复制
再开启一台虚拟机server2,将redis 安装包发送给server2,重复server1开启redis的步骤,但server2作为server1的从机,需要在主配置文件中添加slaveof 172.25.3.1 6379
配置命令
再重新启动服务,测试:
redis 的高可用
开启第三台虚拟机server3,配置一主两从框架,其中server1作为master,server2和server3作为slave端。
搭建后的效果:
实现redis的高可用的步骤:
官网:http://redis.cn/topics/sentinel.html
- 在master 端中,将redis解压目录下的
sentinel.conf
文件拷贝到/etc/redis/
目录下,并修改:
- 将该文件发送到两个节点的 /etc/redis 目录下. 之后在三台主机上执行
redis-sentinel /etc/redis/sentinel.conf
来启动sentinel系统,最后执行的效果:
测试:
主观下线和客观下线
主观下线:如果一个服务器没有在 master-down-after-milliseconds 选项所指定的时间内, 对向它发送 PING 命令的 Sentinel 返回一个有效回复(valid reply), 那么 Sentinel 就会将这个服务器标记为主观下线。
客观下线:如果一个主服务器被标记为主观下线, 并且有足够数量的 Sentinel (至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断, 那么这个主服务器被标记为客观下线。
redis 集群
Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念,例如有三个节点。
- 节点 A 包含 0 到 5500号哈希槽.
- 节点 B 包含5501 到 11000 号哈希槽.
- 节点 C 包含11001 到 16384号哈希槽.
Redis 集群的主从复制模型
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品.
在我们例子中具有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用.
然而如果在集群创建的时候(或者过一段时间)我们为每个节点添加一个从节点A1,B1,C1,那么整个集群便有三个master节点和三个slave节点组成,这样在节点B失败后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了,不过当B和B1 都失败后,集群是不可用的.
构建3个节点的redis集群
步骤:
- 首先, 让我们进入一个新目录, 并创建六个以端口号为名字的子目录,
在文件夹 7000 至 7005 中, 各创建一个 redis.conf 文件,文件的内容可以使用下面的配置文件, 但记得将配置中的端口号从 7000 改为与文件夹名字相同的号码。并且用命令redis-server redis.conf
在每个文件夹中打开一个实例
redis.conf文件
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
效果:
- 执行
redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
搭建集群
查看集群的状态
测试:
注:redis 集群是无中心化的集群
redis 持久化(rdb和aof)
区别:
- RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.
- AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.
redis 和 mysql结合使用
redis 作为mysql的缓存
实验环境搭建:
三台主机,server1做apache,server2做redis, server3做mysql,三台主机上分别安装了httpd, redis和mariadb-server. 并将三个服务打开。
用到的安装包: 链接: rhel7提取码: vpxk
数据: 链接: test.sql 提取码: qm2p
测试页:链接: test.php 提取码: pd19
实验步骤:
- 将test,php文件放入server1主机的apache 的默认发布目录下,并修改文件内容。
由于该测试页使用的是php语言,所以server1主机上需要安装php语言支持,并且涉及到mysql数据库和redis数据库,所以需要添加两个模块。模块包在rhel7中, 在rhel7目录下 安装yum install php-pecl-redis-2.2.8-1.el7.x86_64.rpm php-pecl-igbinary-1.2.1-1.el7.x86_64.rpm php-mysql-5.4.16-46.el7.x86_64.rpm -y
这三个包,最后的效果:
- 将test.sql中的数据导入server3的mysql 数据库中
mysql < test.sql
并且进入 mysql数据库,建立redis用户,密码为westos,
grant all on test.* to 'redis'@'%' identified by 'westos';
访问测试:
第一次访问是通过调用mysql数据库的数据访问的
之后再次访问,都是从redis缓存中直接访问的,这是由于test.php中写的策略导致的,加快了客户对数据的访问
这样虽然实现了客户端对数据的高效访问,但是一旦mysql数据库的信息被更改之后,redis没能收到更改后的信息,所以就需要gearman工具来解决这个问题。
gearman 分发任务的程序框架
gearmand端:在上个实验的基础上,再打开一个虚拟机server4,作为gearmand管理端,将rhel7目录发送给该虚拟机,安装gearmand 服务。
yum install gearmand-1.1.12-18.el7.x86_64.rpm -y libgearman-1.1.12-18.el7.x86_64.rpm libgearman-devel-1.1.12-18.el7.x86_64.rpm libevent-devel-2.0.21-4.el7.x86_64.rpm
并启动服务systemctl status gearmand.service
。
mysql数据库端:
- 软件包: 链接: lib_mysqludf_json UDF 提取码: g3tp
lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式,
unzip lib_mysqludf_json-master.zip
解压该压缩包
cd lib_mysqludf_json-master/
进入解压目录
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so
进行编译,需要用到gcc编译器。yum install gcc mysql-devel
·cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
拷贝到mysql的插件目录中。
进入到mysql数据库,用命令CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';
注册udf 函数。
select * from mysql.func;
查看函数
- 软件包: 链接: gearman-mysql-udf-0.6 提取码: d747
安装gearman-mysql-udf-0.6插件,该插件是用来管理调用 Gearman 的分布式的队列。进入到该目录下,进行源码编译:
./configure --with-mysql --libdir=/usr/lib64/mysql/plugin/
要解决依赖性的问题,解决依赖性的软件包在rhel7目录里有
yum install libgearman-devel-1.1.12-18.el7.x86_64.rpm libgearman-1.1.12-18.el7.x86_64.rpm libevent-devel-2.0.21-4.el7.x86_64.rpm
环境检测成功后,make && make install
进入到mysql数据库,注册udf函数
CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so';
CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';
查看函数:
- 添加mysql触发器, 在test.sql文件中有一个触发器,打开并导入即可
mysql < test.sql 导入到数据库
SHOW TRIGGERS FROM test;
查看触发器
- 链接: work.php 提取码: 93jc
编辑gearmand的work端,由于是由php语言写的work.php ,所以需要下载php解释器,并且下载php的拓展模块,在rhel7目录中有拓展模块的安装包执行yum命令安装
yum install -y php-pecl-gearman-1.1.2-1.el7.x86_64.rpm
yum install -y php-pecl-redis-2.2.8-1.el7.x86_64.rpm php-pecl-igbinary-1.2.1-1.el7.x86_64.rpm
修改work.php文件
测试:
nohup php worker.php &
后台运行work.php