Redis 筆記與總結8 PHP + Redis 信息管理系統(分頁+好友關注)

Redis 筆記與總結8 PHP + Redis 信息管理系統(分頁+好友關注)

分頁php

要對列表頁進行分頁,須要知道:html

①用戶總數 $countredis

② 頁大小 $pageSize:用戶自定義數據庫

③ 當前頁:$page:GET 方式獲取  cookie

④ 總頁數:$pageCount = ceil($count / $pageSize)post

關鍵是用戶總數 $count 的獲取:ui

能夠採起的方案是,在用戶註冊時,把 uid 存入鏈表,統計鏈表中用戶 uid 的個數,即爲用戶總數 $countspa

【操做】3d

reg.php:(line 14)orm

複製代碼

1 <?php
 2 require 'redis.php';
 3 
 4 $username = $_POST['username']; 
 5 $password = md5($_POST['password']); 
 6 $age =$_POST['age']; 
 7 //uid 自加 
 8 //當有 userid 這個鍵時,執行 incr時該鍵的值加1;不存在該鍵時,建立一個 userid,值爲0,執行incr,值爲1
 9 $uid = $redis->incr('userid');
10 
11 //向 hash 表中批量添加數據:hMset 
12 $redis->hMset('user:'.$uid, array('uid'=>$uid, 'name'=>$username, 'password'=>$password, 'age'=>$age));
13 //把用戶 id 存入鏈表
14 $redis->rpush('uid', $uid);
15 
16 //跳轉
17 header('location:list.php');

複製代碼

 

在 redis 客戶端 flushdb 清除一下數據庫,從新註冊用戶;

註冊了 9 個用戶:

複製代碼

127.0.0.1:6379>  keys *
 1) "user:1"
 2) "user:4"
 3) "user:7"
 4) "user:3"
 5) "user:6"
 6) "uid"
 7) "user:8"
 8) "user:5"
 9) "user:9"
10) "user:2"
11) "userid"

複製代碼

key 爲 uid 的鍵便是保存用戶 uid 的鏈表:

複製代碼

127.0.0.1:6379> type uid
list
127.0.0.1:6379> lrange uid 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
9) "9"

複製代碼

 

前臺:

 

刪除用戶時,同時刪除鏈表結構中的對應的用戶的 uid :

del.php(line:7):

複製代碼

1 <?php
2 require 'redis.php';
3 
4 $uid = $_GET['uid'];
5 $redis->del('user:'.$uid);
6 //刪除鏈表中的用戶 uid
7 $redis->lrem('uid', $uid);
8 
9 header('location:list.php');

複製代碼

刪除其中一個用戶(例如秦明),在 redis 客戶端獲取 list uid:

複製代碼

127.0.0.1:6379> lrange uid 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "9"

複製代碼

uid 爲 8 的值已經被刪掉了。

 

在 list.php 中能夠經過 $resid->lsize('uid'); 來獲取 key 爲 uid 的鏈表元素的個數(line:15),同時修改 for 循環爲 foreach 循環(line:36),分頁(line:13):

複製代碼

1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>用戶信息列表</title>
 6 </head>
 7 <body>
 8     <a href="add.php">返回註冊頁面</a>
 9     <a href="login.php">登陸</a>
10 <?php
11 require 'redis.php';
12 
13 /*分頁*/
14 //用戶總數
15 $count = $redis->lsize('uid');
16 //頁大小 
17 $pageSize = 5;
18 //當前頁碼
19 $page = !empty($_GET['page'])?$_GET['page']:1;
20 //頁總數
21 $pageCount = ceil($count / $pageSize);
22 
23 /*
24 第 1 頁:lrange 0 4
25 第 2 頁:lrange 5 9
26 第 3 頁:lrange 10 14
27 第 n 頁:lrange ($page - 1) * $pageSize    ($page - 1) * $pageSize + ($pageSize - 1)
28 */
29 $ids = $redis->lrange('uid', (($page - 1) * $pageSize), (($page - 1) * $pageSize + ($pageSize - 1)));
30 /*
31 var_dump($ids); 
32 $page = 1
33 array(5) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" [3]=> string(1) "4" [4]=> string(1) "5" }
34 */
35 
36 foreach($ids as $v){
37     $data[] = $redis->hgetall('user:'.$v);
38 }
39 ?>
40 <table border="1" cellspacing="0" cellpadding="5">
41     <tr>
42         <th>uid</th>
43         <th>name</th>
44         <th>age</th>
45         <th>操做</th>
46     </tr>
47     <?php foreach($data as $v){ ?>
48     <tr>
49         <td><?php echo $v['uid']?></td>
50         <td><?php echo $v['name']?></td>
51         <td><?php echo $v['age']?></td>
52         <td><a href="del.php?uid=<?php echo $v['uid'];?>">刪除</a> | <a href="mod.php?uid=<?php echo $v['uid'];?>">編輯</a></td>
53     </tr>
54     <?php } ?>
55     <tr><td colspan="4">
56             <a href="?page=<?php echo ($page-1)<=1?1:($page-1);?>">上一頁</a>
57             <a href="?page=<?php echo ($page+1)>$pageCount?$pageCount:($page+1);?>">下一頁 </a>
58             <a href="?page=1">首頁</a>
59             <a href="?page=<?php echo $pageCount;?>">尾頁</a>
60             當前<?php echo $page;?>頁 
61             總共<?php echo $pageCount;?>頁 
62             共<?php echo $count;?>用戶
63         </td>
64     </tr>
65 </table>
66 </body>
67 </html>

複製代碼

前臺:

 

 

登陸

須要判斷用戶輸入的用戶名是否已經註冊,實現的方法是:在用戶註冊的時候把用戶名存入字符串,修改 reg.php(註冊):

reg.php(line:15):

複製代碼

1 <?php
 2 require 'redis.php';
 3 
 4 $username = $_POST['username']; 
 5 $password = md5($_POST['password']); 
 6 $age =$_POST['age']; 
 7 //uid 自加 
 8 //當有 userid 這個鍵時,執行 incr時該鍵的值加1;不存在該鍵時,建立一個 userid,值爲0,執行incr,值爲1
 9 $uid = $redis->incr('userid');
10 
11 //向 hash 表中批量添加數據:hMset 
12 $redis->hMset('user:'.$uid, array('uid'=>$uid, 'name'=>$username, 'password'=>$password, 'age'=>$age));
13 //把用戶 id 存入鏈表
14 $redis->rpush('uid', $uid);
15 //把用戶名 name 存入字符串
16 $redis->set('username:'.$username, $uid);
17 
18 //跳轉
19 header('location:list.php');

複製代碼

在 redis 客戶端 flushdb 清空數據庫,從新註冊;

 

增長 login.php:

複製代碼

1 <?php 
 2     header("content-type:text/html;charset=utf-8");
 3     require 'redis.php';
 4     if(isset($_POST) && !empty($_POST)){
 5         $username = $_POST['username'];
 6         $pass = $_POST['password'];
 7         //判斷用戶民是否存在
 8         $id = $redis->get('username:'.$username);
 9         if(!empty($id)){
10             //用戶存在,對比密碼
11             $password = $redis->hget('user:'.$id, 'password');
12             if(md5($pass) == $password){
13                 $auth = md5(time().$username.rand());
14                 $redis->set('auth:'.$auth, $id);
15                 setcookie('auth', $auth, time()+86400);
16                 header('location:list.php');
17             }
18         }
19     }else{
20 ?>
21 <!DOCTYPE html>
22 <html lang="en">
23 <head>
24     <meta charset="UTF-8">
25     <title>Document</title>
26 </head>
27 <body>
28     <form action="" method="post">
29         <table align="left">
30             <tr><td>用戶名:</td><td><input type="username" name="username"></td></tr>
31             <tr><td>密碼:</td><td><input type="password" name="password"></td></tr>
32             <tr><td><input type="submit" value="登陸"></td><td><input type="reset" value="重置"></td></tr>
33         </table>
34     </form>
35 </body>
36 </html>
37 <?php }?>

複製代碼

 

修改 list.php,增長 「退出」,「歡迎+用戶名」:

複製代碼

1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>用戶信息列表</title>
 6 </head>
 7 <body>
 8     <a href="add.php">返回註冊頁面</a>
 9     <?php 
10         require 'redis.php';
11         if(!empty($_COOKIE['auth'])){
12             //獲取 id
13             $id = $redis->get('auth:'.$_COOKIE['auth']);
14             //獲取用戶名
15             $name = $redis->hget('user:'.$id, 'name');
16             echo '&nbsp;&nbsp;歡迎你, ',$name;
17             echo '&nbsp;&nbsp;<a href="logout.php">退出</a>';
18         }else{
19     ?>
20     <a href="login.php">登陸</a>
21     <?php }?>
22 <?php
23 /*分頁*/
24 //用戶總數
25 $count = $redis->lsize('uid');
26 //頁大小 
27 $pageSize = 5;
28 //當前頁碼
29 $page = !empty($_GET['page'])?$_GET['page']:1;
30 //頁總數
31 $pageCount = ceil($count / $pageSize);
32 
33 /*
34 第 1 頁:lrange 0 4
35 第 2 頁:lrange 5 9
36 第 3 頁:lrange 10 14
37 第 n 頁:lrange ($page - 1) * $pageSize    ($page - 1) * $pageSize + ($pageSize - 1)
38 */
39 $ids = $redis->lrange('uid', (($page - 1) * $pageSize), (($page - 1) * $pageSize + ($pageSize - 1)));
40 /*
41 var_dump($ids); 
42 $page = 1
43 array(5) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" [3]=> string(1) "4" [4]=> string(1) "5" }
44 */
45 
46 foreach($ids as $v){
47     $data[] = $redis->hgetall('user:'.$v);
48 }
49 ?>
50 <table border="1" cellspacing="0" cellpadding="5">
51     <tr>
52         <th>uid</th>
53         <th>name</th>
54         <th>age</th>
55         <th>操做</th>
56     </tr>
57     <?php foreach($data as $v){ ?>
58     <tr>
59         <td><?php echo $v['uid']?></td>
60         <td><?php echo $v['name']?></td>
61         <td><?php echo $v['age']?></td>
62         <td><a href="del.php?uid=<?php echo $v['uid'];?>">刪除</a> | <a href="mod.php?uid=<?php echo $v['uid'];?>">編輯</a></td>
63     </tr>
64     <?php } ?>
65     <tr><td colspan="4">
66             <a href="?page=<?php echo ($page-1)<=1?1:($page-1);?>">上一頁</a>
67             <a href="?page=<?php echo ($page+1)>$pageCount?$pageCount:($page+1);?>">下一頁 </a>
68             <a href="?page=1">首頁</a>
69             <a href="?page=<?php echo $pageCount;?>">尾頁</a>
70             當前<?php echo $page;?>頁 
71             總共<?php echo $pageCount;?>頁 
72             共<?php echo $count;?>用戶
73         </td>
74     </tr>
75 </table>
76 </body>
77 </html>

複製代碼

 

此時在 redis 客戶端產看全部的 key:

複製代碼

127.0.0.1:6379> keys *
 1) "user:4"
 2) "user:1"
 3) "user:6"
 4) "user:3"
 5) "uid"
 6) "username:\xe5\x90\x89\xe5\xb8\x83\xe6\x96\xaf"
 7) "username:\xe5\x88\x87\xe8\xb5\xab"
 8) "auth:d3716d28fd2491c1983fc6bb4087c05b"
 9) "user:5"
10) "username:\xe9\xbb\x98\xe5\xbe\xb7\xe8\x90\xa8\xe5\x85\x8b"
11) "userid"
12) "user:2"
13) "username:\xe5\xbe\xb7\xe5\xb8\x83\xe8\xa5\xbf"
14) "username:\xe5\x85\x8b\xe6\x96\xaf\xe5\x88\x87\xe5\xb0\x94\xe5\xb0\xbc"
15) "username:\xe5\x8a\xa0\xe5\xb8\x83\xe9\x87\x8c\xe5\x9f\x83\xe5\xb0\x94"

複製代碼

用戶列表前臺:

 

 

退出

logout.php:

1 <?php
2 setcookie('auth', '', time()-1);
3 header('location:list.php');

 

 

加關注

修改 list.php(列表界面 line:64)

複製代碼

1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>用戶信息列表</title>
 6 </head>
 7 <body>
 8     <a href="add.php">返回註冊頁面</a>
 9     <?php 
10         require 'redis.php';
11         if(!empty($_COOKIE['auth'])){
12             //獲取 id
13             $id = $redis->get('auth:'.$_COOKIE['auth']);
14             //獲取用戶名
15             $name = $redis->hget('user:'.$id, 'name');
16             echo '&nbsp;&nbsp;歡迎你, ',$name;
17             echo '&nbsp;&nbsp;<a href="logout.php">退出</a>';
18         }else{
19     ?>
20     <a href="login.php">登陸</a>
21     <?php }?>
22 <?php
23 /*分頁*/
24 //用戶總數
25 $count = $redis->lsize('uid');
26 //頁大小 
27 $pageSize = 5;
28 //當前頁碼
29 $page = !empty($_GET['page'])?$_GET['page']:1;
30 //頁總數
31 $pageCount = ceil($count / $pageSize);
32 
33 /*
34 第 1 頁:lrange 0 4
35 第 2 頁:lrange 5 9
36 第 3 頁:lrange 10 14
37 第 n 頁:lrange ($page - 1) * $pageSize    ($page - 1) * $pageSize + ($pageSize - 1)
38 */
39 $ids = $redis->lrange('uid', (($page - 1) * $pageSize), (($page - 1) * $pageSize + ($pageSize - 1)));
40 /*
41 var_dump($ids); 
42 $page = 1
43 array(5) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" [3]=> string(1) "4" [4]=> string(1) "5" }
44 */
45 
46 foreach($ids as $v){
47     $data[] = $redis->hgetall('user:'.$v);
48 }
49 ?>
50 <table border="1" cellspacing="0" cellpadding="5">
51     <tr>
52         <th>uid</th>
53         <th>name</th>
54         <th>age</th>
55         <th>操做</th>
56     </tr>
57     <?php foreach($data as $v){ ?>
58     <tr>
59         <td><?php echo $v['uid']?></td>
60         <td><?php echo $v['name']?></td>
61         <td><?php echo $v['age']?></td>
62         <td align="center"><a href="del.php?uid=<?php echo $v['uid'];?>">刪除</a> 
63         | <a href="mod.php?uid=<?php echo $v['uid'];?>">編輯</a>
64         <!-- 用戶登陸,列表中除本身以外的用戶 都顯示「加關注」-->
65         <?php if(!empty($_COOKIE['auth']) && $id != $v['uid']){ ?>| <a href="addAttention.php?id=<?php echo $v['uid'];?>&uid=<?php echo $id;?>">加關注</a><?php }?></td>
66     </tr>
67     <?php } ?>
68     <tr><td colspan="4">
69             <a href="?page=<?php echo ($page-1)<=1?1:($page-1);?>">上一頁</a>
70             <a href="?page=<?php echo ($page+1)>$pageCount?$pageCount:($page+1);?>">下一頁 </a>
71             <a href="?page=1">首頁</a>
72             <a href="?page=<?php echo $pageCount;?>">尾頁</a>
73             當前<?php echo $page;?>頁 
74             總共<?php echo $pageCount;?>頁 
75             共<?php echo $count;?>用戶
76         </td>
77     </tr>
78 </table>
79 </body>
80 </html>

複製代碼

 

加關注用集合(set,有並集、交集、差集——能夠實現共同關注、好友推薦(a 關注了,可是 b 沒有關注,a 給 b 的好友推薦))來存儲

addAttenation.php:

複製代碼

1 <?php
 2 require 'redis.php';
 3 
 4 //待加關注的用戶id
 5 $id = $_GET['id'];
 6 //用戶id
 7 $uid = $_GET['uid'];
 8 
 9 //當前用戶 uid 正在following(關注)id
10 $redis->sadd('user:'.$uid.':following', $id);
11 //用戶id的followers(粉絲):uid
12 $redis->sadd('user:'.$id.':followers', $uid);
13 
14 header('location:list.php');

複製代碼

 

添加完關注之後,在 redis 客戶端:

複製代碼

127.0.0.1:6379> keys *
 1) "user:4"
 2) "user:1:followers"
 3) "user:3"
 4) "user:6"
 5) "auth:a6ce443729f3d524f81c2bdcdba60278"
 6) "uid"
 7) "auth:556734b6f86b074b921349d616393c2e"
 8) "username:\xe5\x88\x87\xe8\xb5\xab"
 9) "user:2:followers"
10) "user:2"
11) "userid"
12) "user:1:following"
13) "auth:28e59ffccd991262bfb1b92c027a69ea"
14) "username:\xe5\xbe\xb7\xe5\xb8\x83\xe8\xa5\xbf"
15) "user:1"
16) "user:5:followers"
17) "username:\xe5\x90\x89\xe5\xb8\x83\xe6\x96\xaf"
18) "user:3:followers"
19) "user:5"
20) "auth:d3716d28fd2491c1983fc6bb4087c05b"
21) "username:\xe9\xbb\x98\xe5\xbe\xb7\xe8\x90\xa8\xe5\x85\x8b"
22) "auth:a2a03ba9c65d1716d7f19726372f83f7"
23) "user:2:following"
24) "user:4:followers"
25) "auth:8ae6684aecf41ee7259a288aaecca964"
26) "username:\xe5\x8a\xa0\xe5\xb8\x83\xe9\x87\x8c\xe5\x9f\x83\xe5\xb0\x94"
27) "username:\xe5\x85\x8b\xe6\x96\xaf\xe5\x88\x87\xe5\xb0\x94\xe5\xb0\xbc"

127.0.0.1:6379> smembers user:1:following
1) "2"
2) "4"
3) "5"

127.0.0.1:6379> smembers user:1:followers
1) "2"
127.0.0.1:6379> smembers user:2:following
1) "1"
2) "3"
3) "4"

127.0.0.1:6379> smembers user:2:followers
1) "1"

127.0.0.1:6379> sdiff user:1:following user:2:following   #user:1 和 user:2 關注的差集,能夠user:1 能夠向 user:2 推薦好友
1) "2"
2) "5"

複製代碼

 

 

個人關注

修改 list.php(line:79):

複製代碼

1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>用戶信息列表</title>
 6 </head>
 7 <body>
 8     <a href="add.php">返回註冊頁面</a>
 9     <?php 
10         require 'redis.php';
11         if(!empty($_COOKIE['auth'])){
12             //獲取 id
13             $id = $redis->get('auth:'.$_COOKIE['auth']);
14             //獲取用戶名
15             $name = $redis->hget('user:'.$id, 'name');
16             echo '&nbsp;&nbsp;歡迎你, ',$name;
17             echo '&nbsp;&nbsp;<a href="logout.php">退出</a>';
18         }else{
19     ?>
20     <a href="login.php">登陸</a>
21     <?php }?>
22 <?php
23 /*分頁*/
24 //用戶總數
25 $count = $redis->lsize('uid');
26 //頁大小 
27 $pageSize = 5;
28 //當前頁碼
29 $page = !empty($_GET['page'])?$_GET['page']:1;
30 //頁總數
31 $pageCount = ceil($count / $pageSize);
32 
33 /*
34 第 1 頁:lrange 0 4
35 第 2 頁:lrange 5 9
36 第 3 頁:lrange 10 14
37 第 n 頁:lrange ($page - 1) * $pageSize    ($page - 1) * $pageSize + ($pageSize - 1)
38 */
39 $ids = $redis->lrange('uid', (($page - 1) * $pageSize), (($page - 1) * $pageSize + ($pageSize - 1)));
40 /*
41 var_dump($ids); 
42 $page = 1
43 array(5) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" [3]=> string(1) "4" [4]=> string(1) "5" }
44 */
45 
46 foreach($ids as $v){
47     $data[] = $redis->hgetall('user:'.$v);
48 }
49 ?>
50 <table border="1" cellspacing="0" cellpadding="5">
51     <tr>
52         <th>uid</th>
53         <th>name</th>
54         <th>age</th>
55         <th>操做</th>
56     </tr>
57     <?php foreach($data as $v){ ?>
58     <tr>
59         <td><?php echo $v['uid']?></td>
60         <td><?php echo $v['name']?></td>
61         <td><?php echo $v['age']?></td>
62         <td align="center"><a href="del.php?uid=<?php echo $v['uid'];?>">刪除</a> 
63         | <a href="mod.php?uid=<?php echo $v['uid'];?>">編輯</a>
64         <!-- 用戶登陸,列表中除本身以外的用戶 都顯示「加關注」-->
65         <?php if(!empty($_COOKIE['auth']) && $id != $v['uid']){ ?>| <a href="addAttention.php?id=<?php echo $v['uid'];?>&uid=<?php echo $id;?>">加關注</a><?php }?></td>
66     </tr>
67     <?php } ?>
68     <tr><td colspan="4">
69             <a href="?page=<?php echo ($page-1)<=1?1:($page-1);?>">上一頁</a>
70             <a href="?page=<?php echo ($page+1)>$pageCount?$pageCount:($page+1);?>">下一頁 </a>
71             <a href="?page=1">首頁</a>
72             <a href="?page=<?php echo $pageCount;?>">尾頁</a>
73             當前<?php echo $page;?>頁 
74             總共<?php echo $pageCount;?>頁 
75             共<?php echo $count;?>用戶
76         </td>
77     </tr>
78 </table>
79 <table cellspacing="0" cellpadding="2" border="1">
80     <caption>個人關注</caption>
81     <?php 
82         $data = $redis->smembers('user:'.$id.':following');
83         foreach ($data as $value) {
84             $row = $redis->hgetall('user:'.$value);
85     ?>
86         <tr>
87             <td><?php echo $row['uid'];?></td>
88             <td><?php echo $row['name'];?></td>
89             <td><?php echo $row['age'];?></td>
90         </tr>
91     <?php
92         }
93     ?>
94 </table>
95 </body>
96 </html>

複製代碼

前臺顯示:

粉絲同理。

 

總結:

統計用戶總數能夠把用戶 uid 以鏈表(list)結構存儲;判斷用戶是否已經註冊能夠把用戶名以字符串(string)類型存儲;統計用戶的關注、粉絲以及推薦好友能夠使用集(set)數據類型。

相關文章
相關標籤/搜索