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做快取手動更新,redis和gearmand實現自動更新,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整合mybatis,mysql做資料庫儲存,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