redis+mysql缓存
缓存逻辑:client -> nginx -> php-fpm -> redis -> mysql
一.原理
1.为什么要作缓存
当网站的处理和访问量非常大的时候,我们的数据库的压力就变大了,数据库的连接池,数据库同时处理数据的能力就会受到很大的挑战,一旦数据库承受了其最大承受能力,网站的数据处理效率就会大打折扣。此时就要使用高并发处理、负载均衡和分布式数据库,而这些技术既花费人力,又花费资金。
2.redis缓存原理
Redis其实就是说把表中经常访问的记录放在了Redis中,然后用户查询时先去查询Redis再去查询MySQL,确实实现了读写分离,也就是Redis只做读操作。由于缓存在内存中,所以查询会很快。
如何确定在redis查询还是Mysql查询:
对于一个sql语句格式的数据请求,首先计算该语句的MD5并据此得到结果集标识符,然后利用该标识符在Redis中查找该结果集。注意,结果集中的每一行都有一个相应的键,这些键都存储在一个Redis集合结构中。如果Redis中不存在这样一个集合,说明要找的结果集不在Redis中,所以需要执行相应的sql语句,在Mysql中查询到相应的结果集,然后按照上面所说的办法把结果集中的每一行以字符串或哈希的形式存入Redis。
3.memcached和redis做缓存的区别
1.性能上:
性能上都很出色,具体到细节,由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比
Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起 Memcached,还是稍有逊色。
2.内存空间和数据量大小:
MemCached可以修改最大内存,采用LRU算法。Redis增加了VM的特性,突破了物理内存的限制。
3.操作便利上:
MemCached数据结构单一,仅用来缓存数据,而Redis支持更加丰富的数据类型,也可以在服务器端直接对数据进行丰富的操作,这样可以减少网络IO次数和数据体积。
4.可靠性上:
MemCached不支持数据持久化,断电或重启后数据消失,但其稳定性是有保证的。Redis支持数据持久化和数据恢复,允许单点故障,但是同时也会付出性能的代价。
5.应用场景:
Memcached:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等)。
Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。
请参考:https://www.cnblogs.com/work115/p/5584646.html
6.其他缓存策略:
直接用Mysql
这种事情首先Mysql里面就有缓存,实现了类似的功能,如果需要缓存的东西很多,你可以把缓存的内存设置大一点。这样的好处就是你不用自己去控制缓存的失效,确保数据一致性。
MySQL查询会造成内存碎片等问题,请参考:http://blog.csdn.net/songjianyue12345/article/details/77340168
启用DAO框架的缓存
比如Mybatis、Hibernate都是可以直接开启二级缓存,一般是用ehcache作为实现,你只要配置一下就行,无需额外操作。
程序实现
用AOP去在Dao层做一个切面,把调用的“类名+方法名+参数”作为key,查询结果作为value,每次调用去看一下是否已经缓存了,如果没有再去调用Dao的实现类。
参考:
https://blog.csdn.net/songjianyue12345/article/details/78587053
二.redis+mysql缓存实现:
1.环境
server1 - - - - 172.25.0.1 - - - - rhel6.5 - - - - master
server2 - - - - 172.25.0.2 - - - - rhel6.5 - - - - slave
server3 - - - - 172.25.0.3 - - - - rhel6.5 - - - - lamp
server4 - - - - 172.25.0.4 - - - - rhel6.5 - - - - mysql
2.lamp环境(server3)
(1) nginx安装
安装编译文件:
yum install -y gcc
查看是否安装好了php:
rpm -qa | grep php
查看是否存在依赖性:
rpm -ivh nginx-1.10.2-1.el6.x86_64.rpm
安装nginx
cd redis/
yum install -y nginx-1.8.0-1.el6.ngx.x86_64.rpm
(2) php安装
安装php
yum install -y php-*
yum list php
配置php:
cd /etc/php.d/
vim /etc/php.ini
946 date.timezone = Asia/Shanghai
cd /etc/php-fpm.d/
查看是否存在nginx用户
id nginx
vim www.conf
39 user = nginx
41 group = nginx
/etc/init.d/php-fpm start
ps -ax 查看进程
cd /etc/nginx/conf.d/
vim default.conf
/html$fastcgi_script_name;
编写测试主目录文件:
cd /usr/share/nginx/html/
vim index.php
/etc/init.d/nginx start
浏览器访问172.25.0.3检测,或
curl -I 172.25.0.3
查看安装的组建
php -m | grep mysql
php -m | grep redis
这个目录下是php的模块目录
cd /etc/php.d
(3) redis插件安装
cd /mnt/redis/
安装解压文件unzip:
yum install unzip -y
unzip phpredis-master.zip
cd phpredis-master
加载php解码环境:
phpize
./configure –enable-redis
make
make install
配置插件配置文件
cd /usr/lib64/php/modules/
cd /etc/php.d/
cp mysql.ini redis.ini
vim redis.ini
1 extension=redis.so
/etc/init.d/php-fpm reload
php -m | grep redis
cd /mnt/redis/
cp test.php /usr/share/nginx/html/
cd /usr/share/nginx/html/
创建测试文件:
vim test.php
当有访问请求的时候连接到172.25.78.3的redis的6379端口,redis如果没有要访问的数据就去172.25.78.4以数据库已经授权的redis用户去读取数据;redis把数据反馈给用户,同时把数据存储在自己的内存里
chmod 755 /usr/share/nginx/html/test.php
cd /mnt/redis/
scp test.sql server4:/mnt/
server4:(mysql)
yum install -y mysql-server
/etc/init.d/mysqld start
mysql < test.sql
mysql -p
mysql> grant all on test.* to redis@’172.25.0.%’ identified by ‘westos’;
mysql> select * from test.test;
检测:
浏览器访问
第一次访问的是mysql数据 server2
第二次访问的是redis缓存 server8
问题:
当数据库数据更新时,访问的仍是缓存文件
use test;
update test set name=’westos’ where id=1;
select * from test.test;
此时浏览器访问的信息不变
来源:CSDN
作者:zwhzwh0228
链接:https://blog.csdn.net/zwhzwh0228/article/details/80445008