一、Redis简介
Redis 是当前互联网世界最为流行的 NoSQL(Not Only SQL)数据库。NoSQL 在互联网系统中的作用很大,因为 它可以在很大程度上提高互联网系统的性能。
Redis 具备一定持久层的功能,也可以作为一种缓存工具。对于 NoSQL 数据库而言,作为持久层,它存储的数据是半结构化的,这就意味着计算机在读入内存中有更少的规则,读入速度更快。
对于那些结构化、多范式规则的数据库系统而言,它更具性能优势。作为缓存,它可以支持大数据存入内存中,只 要命中率高,它就能快速响应,因为在内存中的数据读/写比数据库读/写磁盘的速度快几十到上百倍,其作用如图 所示。
1.1Redis特点
Redis:Remote Dictionary Server(远程字典服务器)。是完全开源免费的,用C语言编写的,遵守BSD协议,是一 个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的 NoSQL数据库之一,也被人们称为数据结构服务器。
【BSD开源协议:是一个给于使用者很大自由的协议。. 可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。】
Redis与其他key - value缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key - value类型的数据,同时还提供list、set、zset、hash等数据结构的存储。
- Redis支持数据的备份,即master - slave模式的数据备份。
1.2 为什么要用 redis/缓存?
主要从“高性能”和“高并发”这两点来看待这个问题。
高性能:
假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在 缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相 当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!
高并发:
直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存 中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。
1.3 redis 和 memcached的区别
对于 redis 和 memcached 我总结了下面四点。现在公司一般都是用 redis 来实现缓存,而且 redis 自身也越来越 强大了!
- redis支持更丰富的数据类型(支持更复杂的应用场景):Redis不仅仅支持简单的k/v类型的数据,同时还提供 list,set,zset,hash等数据结构的存储。memcache支持简单的数据类型,String。
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而 Memecache把数据全部存在内存之中。
- 集群模式:memcached没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是 redis 目 前是原生支持 cluster 模式的.
- Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的多路IO复用模型。
二、图形界面客户端
有一个redis的图形界面客户端软件,名为redis-destop-manager。支持Windows、Mac OS X、Linux,请根据自 己的电脑系统选择下载,这里以windows为例,简单说下这软件的使用,安装很简单,一路下一步即可,安装后 打开该应用。
1、修改(redis服务器)redis文件夹下redis.conf文件,在bind 127.0.0.1行前面加#注释掉这一行,使能远程连接(默认只能使用 本地连接)。
2、执行命令 ps -ef|grep redis 杀掉redis-server进程。
3、在redis目录下执行 src/redis-server redis.conf用redis.conf设置的参数重启redis-server服务。
4、命令行执行src/redis-cli 进入redis命令行,执行config set requirepass 123456 ,也可以设置为其他
5、在RedisDesktopManager客户端输入用户名、密码、服务器地址、端口连接服务器,点击测试连接。
6、登录成功
【注意】在实例项目搭建-redis服务器环境下mysql实现la/nmp架构缓存时,不要连接redis图形化界面客户端,也不要设置密码。在搭建项目时忽略图形化界面。
三、Redis安装
1)源码安装(推荐)
① 安装源码编译支持库:
yum install gcc gcc-c++
② 下载包:
wget https://download.redis.io/releases/redis-6.2.3.tar.gz
③ 解压包:
tar xzf redis-6.2.3.tar.gz
④ 进入redis目录:
cd redis-6.2.3
⑤ 编译安装:
make
⑥ 编译测试:
make test
2)Redis启动停止与访问
后端启动是我们开发中绝对会用到的方式,但在使用后端启动命令之后,需要做如下配置:
后端启动的配置
vim redis.conf
后端启动的命令
src/redis-server redis.conf
后端启动的关闭命令
强制关闭:
kill -9 进程id
正常关闭:
src/redis-cli shutdown
【注意】:项目中,建议使用正常关闭。因为redis作为缓存来使用的话,将数据存储到内存中,如果使用正常关闭, 则会将内存数据持久化到本地之后,再关闭。如果强制关闭,则不会进行持久化操作,可能会造成部分数据丢失。
四、实例项目搭建-redis服务器环境下mysql实现la/nmp架构缓存
1)架构设计及准备工作
架构图:
场景实例搭建:(基于Memcached实例基础搭建)
IP地址 环境 192.168.198.142 redis 192.168.198.147 web(PHP) 192.168.198.148 mysql 关闭防火墙:
systemctl stop firewalld systemctl disable firewalld sed -i ‘s/enforcing/disabled/’/etc/selinux/config setenforce 0
同步时间:
yum -y install ntp ntpdate ntpdate cn.pool.ntp.org hwclock --systohc
2)场景实例搭建步骤
1、PHP安装:(WEB服务器安装,不要搞错)
yum install php php-fpm php-cli php-common php-gd php-mbstring php-mysql php-pdo php-devel phpxmlrpc php-xml php-bcmath php-dba php-enchant
2、安装php的redis扩展(web服务器安装,不要搞错)
wget http://pecl.php.net/get/redis-2.2.7.tgz
tar -zxvf redis-2.2.7.tgz
cd redis-2.2.7/ phpize
./configure
make install
phpize对php进行添加扩展。并且phpize编译的扩展库可以随时启用或停用,比较灵活。 编译完成后可以看到安装的目录如下,进入后可以看到编译的模块redis.so
3、vim修改/etc/php.ini,添加redis的扩展
vim /etc/php.ini
4、重启web服务器的httpd服务
systemctl restart httpd
5.最后查看phpinfo,显示如下,代表安装成功
(输入web服务器的ip)
6.安装redis
wget -c -t 0 http://download.redis.io/releases/redis-2.8.19.tar.gz
tar xvf redis-2.8.19.tar.gz
#安装很简单、直接make就可以了
cd redis-2.8.19 make
7.启动redis
编译安装好后如下所:
修改redis.conf将daemonize no改为yes
vim redis.conf
启动redis
src/redis-server redis.conf
启动如果没有报错,则配置正确
8.编写php的测试代码
编写redis.php到你的httpd服务器的发布目录
vim /var/www/html/redis.php
<?php $redis = new Redis(); $redis->connect('192.168.198.142',6379) or die ("could net connect redis server"); //此处修改自己的redis服务器地址,确保已经启动 # $query = "select * from test limit 9"; $query = "select * from test1"; for ($key = 1; $key < 10; $key++) { if (!$redis->get($key)) { $connect = mysql_connect('192.168.198.148','memcache','Nebula@123'); mysql_select_db(testab1); $result = mysql_query($query); //如果没有找到$key,就将该查询sql的结果缓存到redis $arr = []; while ($row = mysql_fetch_assoc($result)) { $redis->setex($row['id'],10,$row['name']); $arr[] = $row; } $myserver = 'mysql'; $data = $arr; break; } else { $myserver = "redis"; $data[$key] = $redis->get($key); } } echo $myserver; echo "<br>"; for ($key = 1; $key < 10; $key++) { echo "number is <b><font color=#FF0000>$key</font></b>"; echo "<br>"; if ($myserver == "mysql") { $arr2 = array_map('end',$data); echo "name is <b><font color=#FF0000>$arr2[$key]</font></b>"; echo "<br>"; } else { echo "name is <b><font color=#FF0000>$data[$key]</font></b>"; echo "<br>"; } }
循环的数据必须保证都有,否则会因为数组拿不到key报错
9、测试验证
第一次访问,redis中没有对应的KEY时
再一次刷新就有了