這篇文章主要介紹了PHP+Redis開發的書籤案例,結合實例形式詳細分析了php結合redis開發書籤功能的具體步驟及相關操作技巧,需要的朋友可以參考下
本文實例講述了PHP+Redis開發的書籤案例。分享給大家供大家參考,具體如下:
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set 有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
場景
在項目開發過程中,相信大家都遇到過這樣的場景——一個書籍表,一個書籍標籤表,然後一本書可以有多個標籤,這個場景就和CSDN發佈文章時的文章標籤差不多。
問題:如果我要查詢多個標籤共同的書籍,那麼必須將表關聯查詢,這樣影響效率。我們可以使用redis來幫忙。
案例思路
在添加書籍的時候,需要添加書籍和標籤,將書籍保存到MySQL中,將標籤保存到redis的set集合中,將每個標籤看成一個set集合,然後每個標籤保存的是書籍的id信息。如果需要查詢多個標籤共同的書籍,只需要將多個集合進行交集操作。
結果圖
項目結構圖
index.html文件
在這個頁面是用來添加書籍的。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>Document</title> </head> <body> <form action="add.php" method="post"> <p>請輸入書名:<input type="text" name="title" /></p> <p>請輸入標籤:<input type="text" name="tags" /></p> <p><input type="submit" value="提交" /></p> </form> </body> </html>
add.php文件
這個文件主要處理添加書籍。
首先生成生成自增長的id,用來給書籍的id使用,然後將標籤信息添加到redis中,最後使用pdo將書籍信息添加到數據庫中。
<?php $redis = new Redis(); $redis->connect('localhost',6379); //生成自增長的id $bid = $redis->incr('bid'); //將標籤信息添加到redis中 $tags = explode(',',trim($_POST['tags'],',')); foreach($tags as $t){ $redis->sAdd($t,$bid); } //使用pdo將書籍信息添加到數據庫中 $dsn = 'mysql:host=localhost;dbname=test'; $pdo = new PDO($dsn,'root','1234'); $pdo->query('set names utf8'); $sql = 'insert into book values(?,?)'; $st = $pdo->prepare($sql); $line = $st->execute([$bid,$_POST['title']]); if($line != 0){ echo '添加書籍成功'; }
search.php文件
這個文件主要處理搜索界面,也就是上面效果圖的界面。首先創建一個redis對象並進行連接,然後獲取地址欄的標籤,然後將標籤轉換爲數組,計算出用戶輸入標籤的數量,因爲每個標籤都對應redis中的集合,所以給這幾個集合取交集就可以了。
<?php $redis = new Redis(); $redis->connect('localhost',6379); $tags = explode(',',trim($_GET['tags'],',')); $len = count($tags); if($len == 1){ var_dump($redis->sMembers($tags[0])); }else if($len == 2){ var_dump($redis->sInter($tags[0],$tags[1])); }else if($len == 3){ var_dump($redis->sInter($tags[0],$tags[1],$tags[2])); }
更多關於PHP相關內容感興趣的讀者可查看本站專題:《php+redis數據庫程序設計技巧總結》、《php面向對象程序設計入門教程》、《PHP基本語法入門教程》、《PHP數組(Array)操作技巧大全》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧彙總》
希望本文所述對大家PHP程序設計有所幫助。