redis学习(四) 登录和cookie缓存

<redis实战> 第二章

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);  //移除最旧的令牌

}

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值