欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用redis管理用戶登錄會話的方法

 更新時間:2018年05月16日 14:10:19   作者:second24  
今天小編就為大家分享一篇使用redis管理用戶登錄會話的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

登錄和cookie緩存

對于用來登錄的cookie,有兩種常見的方法可以將登錄信息存儲在cookie里面:一種是簽名(signed)cookie,另一種是令牌(token)cookie。

簽名cookie通常會存儲用戶名,可能還有用戶ID、用戶最后一次成功登陸的時間,以及網(wǎng)站覺得有用的其他任何信息。除了用戶的相關(guān)信息外,簽名cookie還包含一個簽名,服務(wù)器可以使用這個簽名來驗(yàn)證發(fā)送的信息是否未經(jīng)改動(比如將cookie中的登錄用戶名改成另一個客戶)。

令牌cookie會在cookie里面存儲一串隨機(jī)字節(jié)作為令牌,服務(wù)器可以根據(jù)令牌在數(shù)據(jù)庫中查找令牌的擁有者。下表展示了簽名cookie和令牌cookie的優(yōu)點(diǎn)與缺點(diǎn)。

cookie類型 優(yōu)點(diǎn) 缺點(diǎn)
簽名cookie 驗(yàn)證cookie所需的一切信息都存儲在cookie里面。cookie可以包含額外的信息(additional information),并且對這些信息進(jìn)行簽名也很容易 正確地處理簽名很難。很容易忘記對數(shù)據(jù)進(jìn)行簽名,或者忘記驗(yàn)證數(shù)據(jù)的簽名,從而造成安全漏洞
令牌cookie 添加信息非常容易。cookie的體積非常小,因此移動端和速度較慢的客戶端可以更快地發(fā)送請求 需要在服務(wù)器中存儲更多信息。如果使用的是關(guān)系數(shù)據(jù)庫,那么載入和存儲cookie的代價可能會更高

下面是用java寫的一個例子

import java.util.ArrayList;
import java.util.Set;
import redis.clients.jedis.Jedis;
public class Login {
 public String checkToken(Jedis conn,String token){
  return conn.hget("login:", token);
 }
 public void updateToken(Jedis conn,String token,String user,String item){
  long time=System.currentTimeMillis()/1000;
  conn.hset("login:", token, user);//維持令牌與用戶之間的映射
  conn.zadd("recent:", time, token);//保存令牌最后一次出現(xiàn)的時間
  if(item!=null){
   conn.zadd("viewd:"+token, time, item);//根據(jù)這個令牌來設(shè)置該用戶在這個時間戳訪問的商品名字
   conn.zremrangeByRank("viewd:"+token, 0, -26);//移除就的用戶記錄,只保留用戶瀏覽過的25個商品。
   conn.zincrby("viewd:", -1, item);
  }
 }
 public class CleanSessionsThread extends Thread{
  private Jedis conn;
  private int limit;
  private boolean quit;
  public CleanSessionsThread(int limit) {
   // TODO Auto-generated constructor stub
   this.conn=new Jedis("localhost");
   conn.select(15);
   this.limit=limit;
  }
  public void quit(){
   quit=true;
  }
  @Override
  public void run() {
   // TODO Auto-generated method stub
   while(!quit){
    long size=conn.zcard("recent:");//依據(jù)登錄時間確定在線人數(shù)
    if(size<=limit){
     try {
      Thread.sleep(1000);
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }else{
     long endIndex=Math.min(size-limit,100);
     Set<String> tokensSet=conn.zrange("recent:", 0, endIndex-1);
     String[] tokens=tokensSet.toArray(new String[tokensSet.size()]);
     ArrayList<String> sessionKeys=new ArrayList<>();
     for(String token:tokens){
      sessionKeys.add("viewd:"+token);
     }
     conn.del(sessionKeys.toArray(new String[sessionKeys.size()]));
     conn.hdel("login:", tokens);
     conn.zrem("recent:", tokens);
    }
   }
  }
 }
}

以上這篇使用redis管理用戶登錄會話的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于Redis緩存數(shù)據(jù)常見的三種問題及解決

    基于Redis緩存數(shù)據(jù)常見的三種問題及解決

    這篇文章主要介紹了基于Redis緩存數(shù)據(jù)常見的三種問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Redis通過scan查找不過期的 key(方法詳解)

    Redis通過scan查找不過期的 key(方法詳解)

    SCAN 命令是一個基于游標(biāo)的迭代器,每次被調(diào)用之后, 都會向用戶返回一個新的游標(biāo), 用戶在下次迭代時需要使用這個新游標(biāo)作為 SCAN 命令的游標(biāo)參數(shù), 以此來延續(xù)之前的迭代過程,對Redis scan 查找 key相關(guān)知識感興趣的朋友一起看看吧
    2021-08-08
  • Redis設(shè)置database不生效的解決方案

    Redis設(shè)置database不生效的解決方案

    最近在做redis緩存設(shè)置的時候,發(fā)現(xiàn)即使已經(jīng)設(shè)置了database, 但是存數(shù)據(jù)的時候還是用的默認(rèn)0數(shù)據(jù)庫,所以本文就給大家介紹了Redis設(shè)置database不生效的解決方案,需要的朋友可以參考下
    2023-08-08
  • Redis入門教程詳解

    Redis入門教程詳解

    本文詳細(xì)介紹了Redis,文中主要講解了其基本數(shù)據(jù)結(jié)構(gòu)、高級數(shù)據(jù)結(jié)構(gòu)、高級特性、使用場景等,需要了解的朋友可以參考一下
    2021-08-08
  • Redis02 使用Redis數(shù)據(jù)庫(String類型)全面解析

    Redis02 使用Redis數(shù)據(jù)庫(String類型)全面解析

    這篇文章主要介紹了Redis02 使用Redis數(shù)據(jù)庫(String類型)全面解析的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • 詳解Redis瘦身指南

    詳解Redis瘦身指南

    Redis應(yīng)該是開發(fā)者最常用的緩存服務(wù)器了,它豐富的數(shù)據(jù)結(jié)構(gòu),快速高效的內(nèi)存操作能幫助開發(fā)者迅速完成復(fù)雜功能的設(shè)計(jì),作為一個內(nèi)存型數(shù)據(jù)庫,Redis經(jīng)常會遇到內(nèi)存問題,今天我們來談一下Redis常見的內(nèi)存滿的問題,介紹一下給 Redis “瘦身”的通用方式。
    2021-05-05
  • Redis官方ORM框架比RedisTemplate更優(yōu)雅

    Redis官方ORM框架比RedisTemplate更優(yōu)雅

    這篇文章主要為大家介紹了Redis官方ORM框架比RedisTemplate更優(yōu)雅的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Redis做預(yù)定庫存緩存功能設(shè)計(jì)使用

    Redis做預(yù)定庫存緩存功能設(shè)計(jì)使用

    這篇文章主要為大家介紹了Redis做預(yù)定庫存緩存功能設(shè)計(jì)使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Redis?SCAN命令詳解

    Redis?SCAN命令詳解

    SCAN 命令是一個基于游標(biāo)的迭代器,每次被調(diào)用之后, 都會向用戶返回一個新的游標(biāo), 用戶在下次迭代時需要使用這個新游標(biāo)作為 SCAN 命令的游標(biāo)參數(shù), 以此來延續(xù)之前的迭代過程,這篇文章給大家介紹了Redis?SCAN命令的相關(guān)知識,感興趣的朋友一起看看吧
    2022-07-07
  • Redis緩存的主要異常及解決方案實(shí)例

    Redis緩存的主要異常及解決方案實(shí)例

    這篇文章主要為大家介紹了Redis緩存的主要異常及解決方案實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01

最新評論