更新时间 2016年8月1日 12:53:01
一.可行性研究
>写个简单的模板熟练掌握redis的各种指令=>可行
>当某些用户被关注的量过大的时候,比如超过一万了,推送系统负荷会特别大=>待修改
二、需求分析
>目前这个模板,测试2~5个用户。1G内存的服务器内存应该是够了
三、设计概要
——数据先存到mysql,再存到redis
1.注册功能
注册功能包括:
>用户名是否存在
>检验注册格式是否存在(因为此次是用来做测试的,所以不加入此功能)
>录入用户名、密码、自增的用户ID
>自动登录
对应的key-value设计 //这里的前缀名,一般指的类似mysql中的表名
key0://自增id
uid
key1:
前缀名:id:username $username
key2:
前缀名:id:pwd $pwd
key3:
前缀名:id:time time()
key4://登陆时需要
前缀名:$username $uid
[示例] 供测试的php代码
DB.php
<?php
namespace HLZ;
function connect(){
static $redis=0;
if($redis!=0){//是否已经初始化过
return $redis;
}else{
$redis = new \Redis();
$redis -> connect("127.0.0.1","6379");
$redis->select(1); //初始选库
return $redis;
}
}
$r = connect();//返回连接后的对象
register.php
<?php
namespace HLZ;
function if_exists($name="云天河Blog",$pwd="hlzblog.top"){
require 'lib/DB.php';//连接redis数据库,返回redis类的静态对象$r
$uid=$r->get("user:".$name);
if( $uid>0 ){//用户名->用户id>相关信息
echo "该用户名已经存在!";
}else{
$uid=$r->incr("uid");
$uidMix="user:".$name;
$nameMix="user:".$uid.":username";
$pwdMix= "user:".$uid.":pwd" ;
$timeMix= "user:".$uid.":time" ;
$user_info=array(
$nameMix => $name,
$pwdMix => $pwd,
$uidMix => $uid,
$timeMix -> time()
);
$r->mset($user_info);
echo "亲爱的.".$name.", 欢迎您!";
}
echo "<br/>显示所有key<pre>";
$keys=$r->keys("*");
var_dump($keys);
echo "<br/>显示所有key的值<pre>";
var_dump($r->mget($keys));
}
if_exists("云天河Blog");
2.登陆功能
登陆功能包括:
>用户名是否存在
> 用户名与密码是否相对应 >用户名写入cookies,记录当前时间戳字符串,做身份验证
setcookie("hash",$name.substr(str_shuffle(time()),0,16));//用户名加随机时间戳
$_SESSION['hash']=$_COOKIE['hash'];//供权限判断
3.互相关注功能
消息推送功能包括:
>粉丝与粉主关系,即每个用户都得有两张集合表,如following与follwer
查询自己的粉丝smembers
key-value设计
key1://[个人]关注他人的表
following:uid:$uid $their_id
key2://[个人]文章
follower:uid:$uid $fans_id
4.发布功能
发布功能包括:
>是否用户本人,判断
>队列存入[个人发布的队列、全局大队列],自己看的时候,截取20条可直接显示,后面的视为冷数据,存入mysql
>每次用户发布的信息都会存入,全局大队列,设队列的前50条为热数据
>关注的人信息的拉取,通过 前缀名, 存的顺序都是username->content->time,
>涉及删除,所有的信息都要统一个pid
key-value设计
key0://[全局]文章id,自增
pid
key1://[个人]文章
msg:uid:$uid:content $msg
key2://[个人]时间,这里$time统一用一个time()时间戳
msg:uid:$uid:time $time
key3://[个人]用户名
msg:uid:$uid:name $username
key4://[个人]用户名
msg:uid:$uid:pid $pid
key5://[全局]时间
all::time $time
key6://[全局]用户名
all:name $username
key7://[全局]文章
all:content $content
key8://[自己看]文章
show:uid:$uid:time
key9://[自己看]文章
show:uid:$uid:name $username
key10://[自己看]时间
show:uid:$uid:time $time
key11://[个人]用户名
msg:uid:$uid:pid $pid
5.消息推送功能
消息推送功能包括:
>这里用List类型即可解决