1.cookie缓存用户信息的两种方式
每当我们登录互联网服务时,这些服务会使用cookie记录我们的身份 .cookie由少量数据组成,网站会要求我们浏览器存储这些数据,并在每次服务发送请求时将这些数据返回给服务. 对于用来登录的cookie,有两种常用的方式可以将登录信息存储到cookie里面:一种是签名(sign)cookie,另一种是令牌(token)cookie
签名cookie通常会存储用户名,可能还有用户id,用户最后一次登录成功的时间,以及网站觉得有用的其他信息.除了用户的相关信息之外,签名cookie还包含一个签名,服务器可以使用这个签名来验证浏览器发送的信息是否未经改动(比如讲cookie中的用户名改成另外一个用户)
令牌cookie会在cookie中存储一串随机字节作为令牌,服务器可以根据令牌 在数据库中查找令牌拥有者. 随着时间的推移,旧令牌被新令牌代替
2.使用令牌cookie(sign)存储令牌信息
用户在购买商品前,会浏览不同的商品
使用散列存储登录cookie令牌和已登录用户之间的关系(映射).
<?php
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
/**
* 检查用户是否登录
* @param $redis
* @param $token
* @return mixed
*/
function check_token($redis,$token)
{
//根据给定的令牌来查找与之对应的用户,并在用户已经登录的情况下返回用户的id
return $redis->hget('login:',$token);
}
$redis->zAdd($key,$score,$value);
/**
* 更新令牌
* @param $redis
* @param $token
* @param $user
* @param $item
*/
function update_token($redis,$token,$user,$item)
{
//用户每次浏览页面的时候,程序对存储在散列里面的信息进行更新,并将用户的令牌和当前时间戳添加到最近登录用户的有序集合里面
$redis->hSet('login:',$token,$user); //维持令牌与登录用户之间的(关系)映射
$redis->zAdd('recent:',time(),$token); //记录令牌最后一次出现的时间
if ($item)
{
$redis->zadd('viewd:'.$token,time(),$item); //记录用户浏览过的商品
$redis->zRemRangeByRank('viewed:'.$token,0,-26); //移除旧的记录,只保留用户最近浏览过的25个商品
}
}
//守护进程方式运行
//定时任务(cron)运行
/**
* 定期清理旧的会话数据
* @param $redis
*/
function clean_sessions($redis)
{
$quit = false;
$limit = 1000000;
while (!$quit)
{
$size = $redis->zCard('recent:'); //找出当前已有令牌的数量
if ($size < $limit) // 令牌未超过限制,休眠并在之后重新检查
{
sleep(1);
continue;
}else{
$quit = true;
}
}
$end_index = min($size-$limit,100);
$token = $redis->zRange('recent:',0,$end_index-1); //获取需要移除令牌的id
foreach ($token as $value)
{
$session_key [] = $value['viewed:'.$token]; //给被删除的令牌构建键名
}
$redis->delete($session_key);
$redis->del('login',$value);
$redis->zrem('recent:',$value); //移除最旧的令牌
}