1. 程式人生 > >redis做快取手動更新,redis和gearmand實現自動更新,redis高可用配置

redis做快取手動更新,redis和gearmand實現自動更新,redis高可用配置

實驗主機3臺:
server11:redis快取伺服器
server12:mysql伺服器:client
serever13:ngnx+php-fpm,gearmand server,worker
server11:

首先安裝redis伺服器

server13:

rpm包安裝nginx+php-fpm

vim /etc/php.ini
946 date.timezone = Asia/Shanghai

vim  /etc/php-fpm.d/www.conf
#修改使用者和組為nginx,原因是檢視/etc/nginx/nginx.conf檔案中記錄了nginx預設以nginx使用者身份啟動
39 user = nginx 40 ; RPM: Keep a group allowed to write in log dir. 41 group = nginx vim /etc/nginx/conf.d/default.conf 8 location / { 9 root /usr/share/nginx/html; 10 index index.php index.html index.htm; #新增php首頁 11 } 30 location ~ \.php$ { 31 root html; 32
fastcgi_pass 127.0.0.1:9000; 33 fastcgi_index index.php; 34 fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script _name; 35 include fastcgi_params; 36 } yum install -y unzip unzip phpredis-master.zip cd phpredis-master yum install -y
gcc phpize ./configure make & make install #此時可以生成redis.so,即redis動態連線庫 cd /usr/lib64/php/modules/ #預設在此目錄下 cd /usr/share/nginx/html/ vim test.php <?php $redis = new Redis(); $redis->connect('172.25.92.11',6379) or die ("could net connect redis server"); #指定redis伺服器 # $query = "select * from test limit 9"; $query = "select * from test"; for ($key = 1; $key < 10; $key++) { if (!$redis->get($key)) { $connect = mysql_connect('172.25.92.12','redis','westos'); #設定登陸後端mysql伺服器的使用者和密碼 mysql_select_db(test); $result = mysql_query($query); //如果沒有找到$key,就將該查詢sql的結果快取到redis while ($row = mysql_fetch_assoc($result)) { $redis->set($row['id'],$row['name']); } $myserver = 'mysql'; break; } else { $myserver = "redis"; $data[$key] = $redis->get($key); } } cd /etc/php.d/ cp mysql.ini redis.ini vim redis.ini extension=redis.so #新增redis快取庫,php預設會讀取/etc/php.d/下的所有.ini結尾的檔案 /etc/init.d/nginx start /etc/init.d/php-fpm start

server12:

yum install -y mysql-sesrver
/etc/init.d/mysqld start
mysql_secure_installation 
mysql -phello
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> grant all on test.* to [email protected]'%' identified by 'westos';   #根據test.php檔案內容授權使用者
Query OK, 0 rows affected (0.00 sec)

mysql < test.sql -phello

#test.sql檔案內容  

[[email protected] ~]# cat test.sql 
use test;
CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');

#DELIMITER $$
#CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN
#    SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`)); 
#  END$$
#DELIMITER ;


mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from test;
+----+-------+
| id | name  |
+----+-------+
|  1 | test1 |
|  2 | test2 |
|  3 | test3 |
|  4 | test4 |
|  5 | test5 |
|  6 | test6 |
|  7 | test7 |
|  8 | test8 |
|  9 | test9 |
+----+-------+

測試:手動更新redis

瀏覽器:
172.25.92.13/test.php
會顯示test庫中的內容。
在server12上手動做資料庫更新:

mysql> update test set name='westos' where id=1;
Query OK, 1 row affected (0.10 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | westos |
|  2 | test2  |
|  3 | test3  |
|  4 | test4  |
|  5 | test5  |
|  6 | test6  |
|  7 | test7  |
|  8 | test8  |
|  9 | test9  |
+----+--------+

在瀏覽器再次訪問時發現沒有變化,原因是因為redis快取的存在。
server11上:刪除id1的快取:

[[email protected] ~]# redis-cli 
127.0.0.1:6379> get 1
"test1"
127.0.0.1:6379> get 2
"test2"
127.0.0.1:6379> del 1
(integer) 1
127.0.0.1:6379> get 1
(nil)

再次在瀏覽器上訪問:
這裡寫圖片描述

利用gearmand實現redis自動更新:

原理:msyql作為gearemand的客戶端(client),geaemand自身為server,php端為worker。
當mysql(client)由資料更新時,會觸發trigger,trigger會呼叫UDF(三個函式),將mysql更新的資料json化,併發給gearmand(保證4370埠開啟)。gearmand會將資料傳送個php服務端,同時php端會發送給redis(worker.php檔案中記錄了此行為)。php端要安裝gearmand(gearman-1.1.2.tgz)來生成gearmand.so,然後擴充套件到php中,建立php和gearmand的關聯。然後將worker.php程式執行在後端,一旦資料庫端由資料更新,gearmand會發送給redis,同時會發送給php端。每次資料庫更新都會及時的更新到php端,不會因為redis快取導致客戶端訪問的資料不變的情況,既有快取的功能,也有實時更新的效果。
server13上:

yum install gearmand-1.1.8-2.el6.x86_64.rpm libgearman-1.1.8-2.el6.x86_64.rpm
/etc/init.d/gearmand start
netstat -antlp             #檢視gearmand開啟的埠4730
tcp        0      0 0.0.0.0:4730                0.0.0.0:*                   LISTEN      3601/gearmand   

server12:

yum install mysql-devel           #安裝mysql的開發包
yum install -y unzip
unzip lib_mysqludf_json-master.zip 
cd lib_mysqludf_json-master
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c        #編譯生成lib_mysqludf_json.so,可以使用ls檢視

cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
cd /usr/lib64/mysql/plugin/

mysql -phello
mysql> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';           #由mysqludf_json.so生成json_object這個UDF函式,此函式用於將mysql資料對映為json格式

tar zxf gearman-mysql-udf-0.6.tar.gz 
cd gearman-mysql-udf-0.6
yum install -y libgearman-* libevent-*
./configure --libdir=/usr/lib64/mysql/plugin/
make
make install
cd /usr/lib64/mysql/plugin/
ls       #可以看到生成libgearman_mysql_udf.so.0.0.0這個動態庫,用於建立另外兩個函式。

mysql -phello
mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so';         #生成gman_do_background這個函式,此函式用於將json資料傳送給gearmand
mysql> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';   #生成gman_servers函式,此函式用於指定gearmand的ip和埠
Query OK, 0 rows affected (0.00 sec)

mysql> select * from mysql.func;      #檢視關於沒有mysql的函式
+--------------------+-----+-------------------------+----------+
| name               | ret | dl                      | type     |
+--------------------+-----+-------------------------+----------+
| json_object        |   0 | lib_mysqludf_json.so    | function |
| gman_do_background |   0 | libgearman_mysql_udf.so | function |
| gman_servers_set   |   0 | libgearman_mysql_udf.so | function |
+--------------------+-----+-------------------------+----------+
3 rows in set (0.00 sec)

mysql> SELECT gman_servers_set('172.25.92.13:4730');  #檢視gearmand
+---------------------------------------+
| gman_servers_set('172.25.92.13:4730') |
+---------------------------------------+
| 172.25.92.13:4730                     |
+---------------------------------------+
 #重新匯入資料庫,啟動觸發條件,即mysql何時將資料傳送給gearmnd
 vim test.sql    #去掉觸發條件的註釋

use test;
#CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');

DELIMITER $$
CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN
    SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`));
  END$$
DELIMITER ;
~                                                                       
~       

mysql < test.sql -phello
mysql -phello
mysql> SHOW TRIGGERS FROM test;           #檢視觸發條件

server13上:

vim worker.php      #此程式用於指出gearmand和redis的關聯,用php語言寫成

<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');

$redis = new Redis();
$redis->connect('172.25.92.11', 6379);        #指出redis的位置

while($worker->work());
function syncToRedis($job)
{
        global $redis;
        $workString = $job->workload();
        $work = json_decode($workString);
        if(!isset($work->id)){
                return false;
        }
        $redis->set($work->id, $work->name);
}
?>


tar zxf gearman-1.1.2.tgz
cd gearman-1.1.2
phpize
yum install -y libgearman-devel-1.1.8-2.el6.x86_64.rpm libevent-1.4.13-4.el6.x86_64.rpm libevent-devel-1.4.13-4.el6.x86_64.rpm libevent-doc-1.4.13-4.el6.noarch.rpm libevent-headers-1.4.13-4.el6.noarch.rpm re2c-0.13.5-1.el6.x86_64.rpm 
cd gearman-1.1.2
./configure 
make
make install
cd /etc/php.d/
cp redis.ini gearman.ini    
vim gearman.ini                 #指定gearmand擴充套件的ini檔案
cd /usr/lib64/php/modules/      #次目錄下可以看見gearman.so
vim gearman.ini
extension=gearman.so
/etc/init.d/php-fpm reload
cp worker.php /usr/local/       #將第三方程式放在/usr/local下
cd /usr/local/
nohup php worker.php &          #後臺執行worker
ps ax                           #檢視程序

測試:此時在資料庫再次更新資料時,在redis以及瀏覽器上訪問都可以直接變更。

相關推薦

redis快取手動更新redisgearmand實現自動更新,redis可用配置

實驗主機3臺: server11:redis快取伺服器 server12:mysql伺服器:client serever13:ngnx+php-fpm,gearmand server,worker server11: 首先安裝redis伺服器 ser

springboot2.x redis快取的整合有專案地址的呦

1. springboot和用redis做快取的整合 這裡要整合的是springboot2.x和redis,所以你要把你的springboot 版本在開始之前換成springboot2.0之後的 具體怎麼換其實就是換一下版本號,不換的話後面會有很多問題,樓主踩了無數坑 專案地

使用Redis快取資料庫來存放資料Mybatis自帶的二級快取兩者相比各自有什麼優勢?

Redis方案:    1.擴充套件性號,資料量大的時候做主從複製,或者叢集來進行擴充套件。    2.不易丟失,可以週期性持久化。    3.降低風險,被快取的記憶體和應用程式的記憶體分開,有助於風險分攤。    4.靈活多變,對於快取失效和更新操作可自主控制。    5.

REDIS (13) 快取的穿透雪崩熱點key

穿透 穿透:頻繁查詢一個不存在的資料,由於快取不命中,每次都要查詢持久層。從而失去快取的意義。 解決辦法:①用一個bitmap和n個hash函式做布隆過濾器過濾沒有在快取的鍵。   ②持久層查詢不到就快取空結果,有效時間為數分鐘。 雪崩 雪崩:快取大量失效的時候,引發

springboot整合mybatismysql資料庫儲存redis快取

redis應用的場景通過快取來減少對關係型資料庫的查詢次數,減輕資料庫壓力。在執行DAO類的select***(), query***()方法時,先從Redis中查詢有沒有快取資料,如果有則直接從Redis拿到結果,如果沒有再向資料庫發起查詢請求取資料。springboot已

使用redis快取的單機、叢集版的簡單使用

一.簡介與安裝 Redis是c語言開發的。(裝c語言環境、解壓、編譯、安裝)埠號6379 很多專案中,為了緩解我們伺服器與資料庫的壓力,我們使用快取。 安裝redis需要c語言的編譯環境。如果沒有gcc需要線上安裝。yum install gcc-c++ 安裝步驟: 第一步:re

springboot 整合redis 快取

  一、新增依賴jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-re

Springboot之使用Redis快取資料

一、新增Redis依賴 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.o

學習yijun zhang 老師的商品秒殺專案所得(1)——使用Redis快取優化的簡單實現

主要使用的功能: 1.基於java的redis工具——Jedis 2.JDK本身提供的序列化方式——實現Serializable 3.實現序列化要用到的IO流——ByteArrayInputStream,ByteArrayOutputStream,ObjectI

Spring boot如何使用redis快取快取註解的用法總結

1. 概述 本文介紹Spring boot 如何使用redis做快取,如何對redis快取進行定製化配置(如key的有效期)以及spring boot 如

Maven+SSM使用redis快取 Spring5(JavaConfig註解配置

1. 配置環境 Redis 4 安裝教程自行google Spring 5.0.9 Mybatis 3.4.6 2. 依賴 注意: 預設你配置好了SSM的依賴環境,我只說在SSM配好過後怎麼把redis加進去 我用的依賴是如下的版本,基本都沒有最新jar包

Redis瑞士軍刀:慢查詢Pipeline釋出訂閱

1.慢查詢 1.1 慢查詢的生命週期 步驟一:client通過網路向Redis傳送一條命令 步驟二:由於Redis是單執行緒應用,可以把Redis想像成一個佇列,client執行的所有命令都在排隊等著server端執行 步驟三:Redis服務端按順序執行命令 步驟四:server端把命令結果通過網路返回給cl

SpringBoot使用redis快取機制

SpringBoot 2.0.3 版本、redis3.2版本 1. 加入jar包 <dependency> <groupId>org.springframework.boot</groupId> &

在專案中redis快取的一些思路

首先,快取的物件有三種: 1:資料庫中單條的的資料(以表名跟id作為key永久儲存到redis),在有更新的地方都要更新快取(不適用於需要經常更新的資料); 2:對於一些不分頁,不需要實時(需要多表查詢)的列表,我們可以將列表結果快取到redis中,設定一定快取時間作為該資

SSM整合Redis快取(含完整Demo)

之前一段時間自學了Redis,進行一下總結三個部分:    1. Linux環境下的redis客戶端操作    2. 在java程式中使用redis:        2.1)匯入jedis.jar包        2.2)直接 Jedis jedis = new Jedis(

SpringBoot之Mybatis操作中使用Redis快取

上一部落格學習了SpringBoot整合Redis,今天這篇部落格學習下Mybatis操作中使用Redis做快取。這裡其實主要學習幾個註解:@CachePut、@Cacheable、@CacheEvict、@CacheConfig。 一、基礎知識 @Cacheable @Cacheable 的作用 主要針對方

redis快取的簡單例項

由於之前對redis有了一個系統的研究,在公司的多個專案中使用redis當做資料快取;所以趁著這些天晚上的時間,自己寫了一個demo;這裡僅供自己後期學習筆記參考,若有不對的地方,請輕拍磚! redis 官網推薦給java 使用的客戶端很多:Jedis、Redi

redis快取優勢

1、 Redis簡介 redis是Nosql資料庫中使用較為廣泛的非關係型記憶體資料庫,redis內部是一個key-value儲存系統。它支援儲存的value型別相對更多,包括string(字串)、list(連結串列)、set(集合)、zset(sorted

SpringBoot使用redis快取

Redis由於資料存在記憶體中,類似於HashMap,HashMap的優勢就是查詢和操作的時間複雜度都是O(1),支援豐富資料型別,也支援事務,操作都是原子性,還具有其他豐富的特性,如可按key設定過期時間,過期後將會自動刪除.因此我們通常使用redis來作為快取,下面我根

Spring使用redis快取在一個方法上使用註解操作多個快取

我們使用的最基礎的Spring快取註解如下:     @Cacheable   生成快取   一般用在查詢Service介面上     @Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0