Redis是一个key-value存储系统和Memcached类似,为了保证效率数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件并且在此基础上实現了master-slave(主从)同步。在部分场合可以对关系起到很好的补充作用它提供了Java,C/C++(hiredis)C#,PHPJavaScript,PerlObject-C,PythonRuby等客户端,使用很方便
三、安装LNMP环境(这里为了渻事,就是用yum来安装)
然后访问页面看到php的相关信息基础环境就算搭建完成了。
#编译完成后将src中的可执行文件拷贝到刚刚创建的目录中
|
還是访问phpinfo的那个界面
看到这个就是安装完成了。
这里只是简单的做了一下读没有写操作的相关代码,过一会测试直接到里执行update来模拟寫操作。
1、在mysql存到缓存中插入一些测试数据
2、编写php的测试代码
第一次访问redis中没有对应的KEY时
六、通过gearman实现同步
Gearman是一个支持分布式的任务分發框架:
Gearman Job Server:Gearman核心程序,需要编译安装并以守护进程形式运行在后台
Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行Gearman Worker接收到Gearman Client传递的任务内容后,会按顺序处理
lib_mysql存到缓存udf_json UDF库函数将关系数据映射为JSON格式。通常数据库中的数据映射为JSON格式,是通过程序来转换的
这个插件是用来管理调用 Gearman 的分布式的队列。
6、编写mysql存到缓存触发器(根据实际情况编写)
8、更新mysql存到緩存中的数据
从返回值可以看到是触发成功的(这里的@RECV是上面mysql存到缓存 TIGGER的返回值)。我们在redis中查看数据:
这里的数据居然没有变化这是我們就要排错了。
设置完成以后再次执行update,进入redis进行查看
刷新一下刚刚的php界面
到这里就基本算是大功告成了只要application将数据写到
中,mysql存到缓存触发器检测到更新就会通过Gearman将到redis中。然后读取的话就直接从redis中进行读取。当然这只是个实验环境实际上还有很多细节要调整。
实际的生产环境当中客户端对數据库的读操作都是直接找redis拿数据的
如果redis缓存里面没有数据,那么就会去找mysql存到缓存拿数据并且给redis中缓存一份
redis中的数据有两种情况不能使用:数据过期了或者mysql存到缓存中的数据更新了
用户读的时候访问redis,用户写的时候访问mysql存到缓存
实际上读的需求量是很大的redis刚好是把数據缓存在内存当中,响应速度也快
也可以降低我们后台mysql存到缓存数据库的压力
2、为什么要有读写分离
一般对于高并发的系统来说搭建一個健壮的缓存系统是不可避免的。
单机的reids的QPS可能只能上万如果有再高并发的场景,单机是不能搞定的就会有它的系统瓶颈。
一般来说緩存是用来支撑高并发读这时候我们可能就会想到读写分离;
读写分离是用来处理读的并发量大,而写的并发量小的场景
(1)、先安裝nginx:具体详见我的关于nginx部署的博客
由于此处不需要其它模块,所在在编译的时候只需要备注编译地址就可以 编译成功~~~出现以下信息
(2)、编辑nginx的配置文件将nginx的用户改为nginx,并加入php发布文件
(1)、进行php以及其有关依赖性文件的安装
(2)、删除原来的key
登录数据库授权用戶,并且刷新
//如果没有找到$key,就将该查询sql的结果缓存到redis
注释掉的目前用不到是创建查询的触发器的
刷新一次后,可以看到后面就从redis读取数據
注意这个时候有个问题如果此时mysql存到缓存数据发生变更,redis会同步吗
更后发现,redis里没有变浏览器也看不到变化.
总结一下问题:刚才茬数据库中进行修改数据,客户端看不到变化但是在redis服务器中修改,客户端可以看到变化但此时数据库对应的数据并没有变化,在生產生活中显然是不合理的~~~
下面就给PHP使用任务分发系统(gearmand)
#编译模块(文档上有) #将模块放到mysql存到缓存插件目录