分页

要对列表页进行分页,需要知道:

①用户总数 $count

② 页大小 $pageSize:用户自定义

③ 当前页:$page:GET 方式获取  

④ 总页数:$pageCount = ceil($count / $pageSize)

关键是用户总数 $count 的获取:

可以采取的方案是,在用户注册时,把 uid 存入链表,统计链表中用户 uid 的个数,即为用户总数 $count

【操作】

reg.php:(line 14)

 <?php
require 'redis.php'; $username = $_POST['username'];
$password = md5($_POST['password']);
$age =$_POST['age'];
//uid 自加
//当有 userid 这个键时,执行 incr时该键的值加1;不存在该键时,创建一个 userid,值为0,执行incr,值为1
$uid = $redis->incr('userid');

//向 hash 表中批量添加数据:hMset
$redis->hMset('user:'.$uid, array('uid'=>$uid, 'name'=>$username, 'password'=>$password, 'age'=>$age));
//把用户 id 存入链表
$redis->rpush('uid', $uid);

//跳转
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):

 <?php
require 'redis.php'; $uid = $_GET['uid'];
$redis->del('user:'.$uid);
//删除链表中的用户 uid
$redis->lrem('uid', $uid);

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):

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户信息列表</title>
</head>
<body>
<a href="add.php">返回注册页面</a>
<a href="login.php">登录</a>
<?php
require 'redis.php'; /*分页*/
//用户总数
$count = $redis->lsize('uid');
//页大小
$pageSize = 5;
//当前页码
$page = !empty($_GET['page'])?$_GET['page']:1;
//页总数
$pageCount = ceil($count / $pageSize); /*
第 1 页:lrange 0 4
第 2 页:lrange 5 9
第 3 页:lrange 10 14
第 n 页:lrange ($page - 1) * $pageSize ($page - 1) * $pageSize + ($pageSize - 1)
*/
$ids = $redis->lrange('uid', (($page - 1) * $pageSize), (($page - 1) * $pageSize + ($pageSize - 1)));
/*
var_dump($ids);
$page = 1
array(5) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" [3]=> string(1) "4" [4]=> string(1) "5" }
*/ foreach($ids as $v){
$data[] = $redis->hgetall('user:'.$v);
}
?>
<table border="1" cellspacing="0" cellpadding="5">
<tr>
<th>uid</th>
<th>name</th>
<th>age</th>
<th>操作</th>
</tr>
<?php foreach($data as $v){ ?>
<tr>
<td><?php echo $v['uid']?></td>
<td><?php echo $v['name']?></td>
<td><?php echo $v['age']?></td>
<td><a href="del.php?uid=<?php echo $v['uid'];?>">删除</a> | <a href="mod.php?uid=<?php echo $v['uid'];?>">编辑</a></td>
</tr>
<?php } ?>
<tr><td colspan="4">
<a href="?page=<?php echo ($page-1)<=1?1:($page-1);?>">上一页</a>
<a href="?page=<?php echo ($page+1)>$pageCount?$pageCount:($page+1);?>">下一页 </a>
<a href="?page=1">首页</a>
<a href="?page=<?php echo $pageCount;?>">尾页</a>
当前<?php echo $page;?>页
总共<?php echo $pageCount;?>页
共<?php echo $count;?>用户
</td>
</tr>
</table>
</body>
</html>

前台:

登录

需要判断用户输入的用户名是否已经注册,实现的方法是:在用户注册的时候把用户名存入字符串,修改 reg.php(注册):

reg.php(line:15):

 <?php
require 'redis.php'; $username = $_POST['username'];
$password = md5($_POST['password']);
$age =$_POST['age'];
//uid 自加
//当有 userid 这个键时,执行 incr时该键的值加1;不存在该键时,创建一个 userid,值为0,执行incr,值为1
$uid = $redis->incr('userid'); //向 hash 表中批量添加数据:hMset
$redis->hMset('user:'.$uid, array('uid'=>$uid, 'name'=>$username, 'password'=>$password, 'age'=>$age));
//把用户 id 存入链表
$redis->rpush('uid', $uid);
//把用户名 name 存入字符串
$redis->set('username:'.$username, $uid);

//跳转
header('location:list.php');

在 redis 客户端 flushdb 清空数据库,重新注册;

增加 login.php:

 <?php
header("content-type:text/html;charset=utf-8");
require 'redis.php';
if(isset($_POST) && !empty($_POST)){
$username = $_POST['username'];
$pass = $_POST['password'];
//判断用户民是否存在
$id = $redis->get('username:'.$username);
if(!empty($id)){
//用户存在,对比密码
$password = $redis->hget('user:'.$id, 'password');
if(md5($pass) == $password){
$auth = md5(time().$username.rand());
$redis->set('auth:'.$auth, $id);
setcookie('auth', $auth, time()+86400);
header('location:list.php');
}
}
}else{
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form action="" method="post">
<table align="left">
<tr><td>用户名:</td><td><input type="username" name="username"></td></tr>
<tr><td>密码:</td><td><input type="password" name="password"></td></tr>
<tr><td><input type="submit" value="登录"></td><td><input type="reset" value="重置"></td></tr>
</table>
</form>
</body>
</html>
<?php }?>

修改 list.php,增加 “退出”,“欢迎+用户名”:

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户信息列表</title>
</head>
<body>
<a href="add.php">返回注册页面</a>
<?php
require 'redis.php';
if(!empty($_COOKIE['auth'])){
//获取 id
$id = $redis->get('auth:'.$_COOKIE['auth']);
//获取用户名
$name = $redis->hget('user:'.$id, 'name');
echo '&nbsp;&nbsp;欢迎你, ',$name;
echo '&nbsp;&nbsp;<a href="logout.php">退出</a>';
}else{
?>
<a href="login.php">登录</a>
<?php }?>
<?php
/*分页*/
//用户总数
$count = $redis->lsize('uid');
//页大小
$pageSize = 5;
//当前页码
$page = !empty($_GET['page'])?$_GET['page']:1;
//页总数
$pageCount = ceil($count / $pageSize); /*
第 1 页:lrange 0 4
第 2 页:lrange 5 9
第 3 页:lrange 10 14
第 n 页:lrange ($page - 1) * $pageSize ($page - 1) * $pageSize + ($pageSize - 1)
*/
$ids = $redis->lrange('uid', (($page - 1) * $pageSize), (($page - 1) * $pageSize + ($pageSize - 1)));
/*
var_dump($ids);
$page = 1
array(5) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" [3]=> string(1) "4" [4]=> string(1) "5" }
*/ foreach($ids as $v){
$data[] = $redis->hgetall('user:'.$v);
}
?>
<table border="1" cellspacing="0" cellpadding="5">
<tr>
<th>uid</th>
<th>name</th>
<th>age</th>
<th>操作</th>
</tr>
<?php foreach($data as $v){ ?>
<tr>
<td><?php echo $v['uid']?></td>
<td><?php echo $v['name']?></td>
<td><?php echo $v['age']?></td>
<td><a href="del.php?uid=<?php echo $v['uid'];?>">删除</a> | <a href="mod.php?uid=<?php echo $v['uid'];?>">编辑</a></td>
</tr>
<?php } ?>
<tr><td colspan="4">
<a href="?page=<?php echo ($page-1)<=1?1:($page-1);?>">上一页</a>
<a href="?page=<?php echo ($page+1)>$pageCount?$pageCount:($page+1);?>">下一页 </a>
<a href="?page=1">首页</a>
<a href="?page=<?php echo $pageCount;?>">尾页</a>
当前<?php echo $page;?>页
总共<?php echo $pageCount;?>页
共<?php echo $count;?>用户
</td>
</tr>
</table>
</body>
</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:

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

加关注

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

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户信息列表</title>
</head>
<body>
<a href="add.php">返回注册页面</a>
<?php
require 'redis.php';
if(!empty($_COOKIE['auth'])){
//获取 id
$id = $redis->get('auth:'.$_COOKIE['auth']);
//获取用户名
$name = $redis->hget('user:'.$id, 'name');
echo '&nbsp;&nbsp;欢迎你, ',$name;
echo '&nbsp;&nbsp;<a href="logout.php">退出</a>';
}else{
?>
<a href="login.php">登录</a>
<?php }?>
<?php
/*分页*/
//用户总数
$count = $redis->lsize('uid');
//页大小
$pageSize = 5;
//当前页码
$page = !empty($_GET['page'])?$_GET['page']:1;
//页总数
$pageCount = ceil($count / $pageSize); /*
第 1 页:lrange 0 4
第 2 页:lrange 5 9
第 3 页:lrange 10 14
第 n 页:lrange ($page - 1) * $pageSize ($page - 1) * $pageSize + ($pageSize - 1)
*/
$ids = $redis->lrange('uid', (($page - 1) * $pageSize), (($page - 1) * $pageSize + ($pageSize - 1)));
/*
var_dump($ids);
$page = 1
array(5) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" [3]=> string(1) "4" [4]=> string(1) "5" }
*/ foreach($ids as $v){
$data[] = $redis->hgetall('user:'.$v);
}
?>
<table border="1" cellspacing="0" cellpadding="5">
<tr>
<th>uid</th>
<th>name</th>
<th>age</th>
<th>操作</th>
</tr>
<?php foreach($data as $v){ ?>
<tr>
<td><?php echo $v['uid']?></td>
<td><?php echo $v['name']?></td>
<td><?php echo $v['age']?></td>
<td align="center"><a href="del.php?uid=<?php echo $v['uid'];?>">删除</a>
| <a href="mod.php?uid=<?php echo $v['uid'];?>">编辑</a>
<!-- 用户登录,列表中除自己之外的用户 都显示“加关注”-->
<?php if(!empty($_COOKIE['auth']) && $id != $v['uid']){ ?>| <a href="addAttention.php?id=<?php echo $v['uid'];?>&uid=<?php echo $id;?>">加关注</a><?php }?></td>
</tr>
<?php } ?>
<tr><td colspan="4">
<a href="?page=<?php echo ($page-1)<=1?1:($page-1);?>">上一页</a>
<a href="?page=<?php echo ($page+1)>$pageCount?$pageCount:($page+1);?>">下一页 </a>
<a href="?page=1">首页</a>
<a href="?page=<?php echo $pageCount;?>">尾页</a>
当前<?php echo $page;?>页
总共<?php echo $pageCount;?>页
共<?php echo $count;?>用户
</td>
</tr>
</table>
</body>
</html>

加关注用集合(set,有并集、交集、差集——可以实现共同关注、好友推荐(a 关注了,但是 b 没有关注,a 给 b 的好友推荐))来存储

addAttenation.php:

 <?php
require 'redis.php'; //待加关注的用户id
$id = $_GET['id'];
//用户id
$uid = $_GET['uid']; //当前用户 uid 正在following(关注)id
$redis->sadd('user:'.$uid.':following', $id);
//用户id的followers(粉丝):uid
$redis->sadd('user:'.$id.':followers', $uid);

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):

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户信息列表</title>
</head>
<body>
<a href="add.php">返回注册页面</a>
<?php
require 'redis.php';
if(!empty($_COOKIE['auth'])){
//获取 id
$id = $redis->get('auth:'.$_COOKIE['auth']);
//获取用户名
$name = $redis->hget('user:'.$id, 'name');
echo '&nbsp;&nbsp;欢迎你, ',$name;
echo '&nbsp;&nbsp;<a href="logout.php">退出</a>';
}else{
?>
<a href="login.php">登录</a>
<?php }?>
<?php
/*分页*/
//用户总数
$count = $redis->lsize('uid');
//页大小
$pageSize = 5;
//当前页码
$page = !empty($_GET['page'])?$_GET['page']:1;
//页总数
$pageCount = ceil($count / $pageSize); /*
第 1 页:lrange 0 4
第 2 页:lrange 5 9
第 3 页:lrange 10 14
第 n 页:lrange ($page - 1) * $pageSize ($page - 1) * $pageSize + ($pageSize - 1)
*/
$ids = $redis->lrange('uid', (($page - 1) * $pageSize), (($page - 1) * $pageSize + ($pageSize - 1)));
/*
var_dump($ids);
$page = 1
array(5) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" [3]=> string(1) "4" [4]=> string(1) "5" }
*/ foreach($ids as $v){
$data[] = $redis->hgetall('user:'.$v);
}
?>
<table border="1" cellspacing="0" cellpadding="5">
<tr>
<th>uid</th>
<th>name</th>
<th>age</th>
<th>操作</th>
</tr>
<?php foreach($data as $v){ ?>
<tr>
<td><?php echo $v['uid']?></td>
<td><?php echo $v['name']?></td>
<td><?php echo $v['age']?></td>
<td align="center"><a href="del.php?uid=<?php echo $v['uid'];?>">删除</a>
| <a href="mod.php?uid=<?php echo $v['uid'];?>">编辑</a>
<!-- 用户登录,列表中除自己之外的用户 都显示“加关注”-->
<?php if(!empty($_COOKIE['auth']) && $id != $v['uid']){ ?>| <a href="addAttention.php?id=<?php echo $v['uid'];?>&uid=<?php echo $id;?>">加关注</a><?php }?></td>
</tr>
<?php } ?>
<tr><td colspan="4">
<a href="?page=<?php echo ($page-1)<=1?1:($page-1);?>">上一页</a>
<a href="?page=<?php echo ($page+1)>$pageCount?$pageCount:($page+1);?>">下一页 </a>
<a href="?page=1">首页</a>
<a href="?page=<?php echo $pageCount;?>">尾页</a>
当前<?php echo $page;?>页
总共<?php echo $pageCount;?>页
共<?php echo $count;?>用户
</td>
</tr>
</table>
<table cellspacing="0" cellpadding="2" border="1">
<caption>我的关注</caption>
<?php
$data = $redis->smembers('user:'.$id.':following');
foreach ($data as $value) {
$row = $redis->hgetall('user:'.$value);
?>
<tr>
<td><?php echo $row['uid'];?></td>
<td><?php echo $row['name'];?></td>
<td><?php echo $row['age'];?></td>
</tr>
<?php
}
?>
</table>
</body>
</html>

前台显示:

粉丝同理。

总结:

统计用户总数可以把用户 uid 以链表(list)结构存储;判断用户是否已经注册可以把用户名以字符串(string)类型存储;统计用户的关注、粉丝以及推荐好友可以使用集(set)数据类型。

Redis 笔记与总结8 PHP + Redis 信息管理系统(分页+好友关注)的更多相关文章

  1. 【Redis笔记(四)】 Redis数据结构 - list链表

    原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50573605 经过前面的介绍,我们学习了Redis中string字符串.hash ...

  2. Redis 笔记与总结7 PHP + Redis 信息管理系统(用户信息的增删改查)

    1. PHP 连接 Redis 访问 redis 官方网站的 client 栏目:http://www.redis.io/clients#php,可以获取 redis 的 php 扩展. 其中 php ...

  3. Redis笔记(三):Redis常用命令

    连接测试 连接本地服务器 语法 $ redis-cli 实例 启动 redis 客户端,打开终端并输入命令 redis-cli.该命令会连接本地的 redis 服务. $redis-cli redis ...

  4. Redis笔记(一):Redis安装教程

    Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis是目前应用最广泛的内存数据存储技术,相比之前的Me ...

  5. Redis笔记(五):Redis发布订阅

    Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...

  6. Redis笔记(七):Redis应用场景

    特性优势 1 支持持久化 Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用. 2 数据类型丰富 Redis不仅仅支持简单的key-value类型的数据,同时还 ...

  7. Redis笔记(四):Redis事务支持

    Redis 事务 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其 ...

  8. Redis笔记(二):Redis数据类型

    Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...

  9. Redis 笔记 01:入门篇

    Redis 笔记 01:入门篇 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...

随机推荐

  1. 在Android软按键中添加Menu键

    在Android中,有时候没有硬件Menu.于是需要软件Menu.但是默认Google想让你用ActionBar上的Menu. 但是,有时候我们确实需要在在底部的软按键上加Menu.这里提供一种方法, ...

  2. ubuntu下简单的驱动编译

    转自:http://www.eefocus.com/jefby1990/blog/13-02/291628_c39b8.html 本文是参考了网上多篇帖子而写的算不上什么原创.唯一值得欣慰的只不过在本 ...

  3. 同网段下,windows自带远程桌面连接

    1.服务器关闭防火墙 2.右键点击’我的电脑‘进入’属性‘点击左侧菜单栏中的’远程设置‘: 把远程桌面选项设置成’允许运行任意版本远程桌面的计算机连接‘. 3.客户端点击“开始”在附件菜单下面找到“远 ...

  4. 免费电子书:使用VS Online敏捷管理开源项目

    今天推荐的是一本由微软出版社发布的免费电子书,涉及的话题是如何在Visual Studio Online中基于敏捷的思想来管理开源项目. 本书的几位作者(自称ALM领域的游侠),给大家分享了在一个敏捷 ...

  5. Ubuntu各版本下载地址

    Ubuntu各版本下载地址:     http://old-releases.ubuntu.com/releases/

  6. C#学习笔记(六)——面向对象编程简介

    一.面向对象编程的含义 *   是一种模块化编程方法,使代码的重用性大大的增加. *   oop技术使得项目的设计阶段需要的精力大大的增加,但是一旦对某种类型的数据表达方式达成一致,这种表达方式就可以 ...

  7. SQL Server 2000 ——系统表和系统视图

    一.系统表 数据字典的详细信息请查SQL SERVER BOL,这里仅列出一部分. 1.1.sysservers 1.查看所有本地服务器及链接服务器 select * from master..sys ...

  8. SparkStreaming+Flume出现ERROR ReceiverTracker: Deregistered receiver for stream 0: Error starting receiver 0 - org.jboss.netty.channel.ChannelException

    文章发自http://www.cnblogs.com/hark0623/p/4204104.html ,转载请注明 我发现太多太多的坑要趟了… 向yarn提交sparkstreaming了,提交脚本如 ...

  9. CodeForces 300C --数论

    A - A Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  10. 17111 Football team

    时间限制:1000MS  内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题   语言: C++;C Description As every one known, a footbal ...