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;
此时浏览器访问的信息不变


redis+mysql缓存相关推荐

  1. 部署Redis作为mysql缓存实现读写分离

    1. redis+mysql缓存服务器实现读写分离 Redis其实就是说把表中经常访问的记录放在了Redis中,然后用户查询时先去查询Redis再去查询MySQL,确实实现了读写分离,也就是Redis ...

  2. 高并发简单解决方案————redis队列缓存+mysql 批量入库(ThinkPhP)

    源码地址:https://github.com/Tinywan/PHP_Experience 问题分析 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量 ...

  3. mysql springboot 缓存_Spring Boot 整合 Redis 实现缓存操作

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 产品没有价值,开发团队再优秀也无济于事 – <启示录> 』 本文提纲 一.缓 ...

  4. mysql二级缓存redis_SpringBoot+Mybatis+redis(二级缓存)搭建

    刚刚开始接触Spring Boot,因为极简单的配置开发,搭建一个通用的Spring Boot+Mybaitis+redis的开发框架. 一.用maven构建项目,pom.xml文件如下: org.s ...

  5. docker 安装mysql、canal、redis实现redis和mysql缓存一致性

    一.canal介绍 Canal 是用 Java 开发的基于数据库增量日志解析,提供增量数据订阅&消费的中间件. 目前,Canal 主要支持了 MySQL 的 Binlog 解析,解析完成后才利 ...

  6. MySQL与Redis数据库结合——redis作为mysql的缓存服务器,实现读写分离(nginx+php+redis+mysql)

    文章目录 一.读写分离的背景 二.搭建nginx+php+redis+mysql 实验环境 实验 1.在server1上安装nginx+php 建立php和redis,mysql的连接 2.在serv ...

  7. 怎样将redis写入mysql_使用redis做mysql缓存

    应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql. 同时要注意避免冲突,在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主键自增 ...

  8. redis写入mysql 使用redis做mysql缓存

    应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql. 同时要注意避免冲突,在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主键自增 ...

  9. Redis作为MySQL缓存服务器的使用

    server1:192.168.1.11  安装nginx和php为用户提供服务访问入口 server3:192.168.1.13  安装mysql,存储数据 server2:192.168.1.12 ...

最新文章

  1. mysql 日志管理
  2. python_购物车
  3. C++Opengl三维列表堆罗汉源码
  4. 【BZOJ3387】[Usaco2004 Dec]Fence Obstacle Course栅栏行动 线段树
  5. jQuery练习:表单模态框
  6. 格局打开,带你解锁 prompt 的花式用法
  7. python max函数key_Python标准库:内置函数max(iterable, *[, key, default]) | 学步园
  8. DOTNET零碎要点---1.vb.net利用Oracle.DataAccess.dll链接Oracle数据库
  9. 地大计算机学院保研华科人数,2020年华中科技大学保研率是多少
  10. LLVM各种格式转换图
  11. Py之Scipy:Scipy库(高级科学计算库)的简介、安装、使用方法之详细攻略
  12. c10k java_c10k问题及其解决方案
  13. PS2022丨Photoshop 2022软件下载+Ps安装教程
  14. 区块链入门教程(1)--概述
  15. linux系统查看物理地址,Linux 下面对物理地址的访问
  16. win10系统安装到服务器失败怎么回事,U盘安装win10系统失败,提示Windows无法安装怎么办...
  17. python渐变色代码_python生成渐变色
  18. Win7 自制关闭屏幕快捷键
  19. 科比最新超酷广告《门徒》
  20. 加速度计和陀螺仪模型(imu元件)分析

热门文章

  1. table 能设圆角 css,tablecss圆角边框效果
  2. 关于A-level选课的6个建议
  3. 黑暗意志【map水题】
  4. 怎么剪辑视频教程,剪辑视频的软件怎么剪辑视频制作原创视频
  5. ctf菜狗杯OSINT wp
  6. HTML:设置360双核浏览器默认选中谷歌内核
  7. 为什么推荐网页翻译工具?这一强大插件,让你办公速度提升很多
  8. tp5 微信小程序 实现公众号模板推送(同一主体)
  9. BUUctf-WEB-Havefun
  10. buuctf(入门) Have Fun