基于Redis实现分布式部署单点登录
生活随笔
收集整理的這篇文章主要介紹了
基于Redis实现分布式部署单点登录
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
單點(diǎn)登錄的概念:
單點(diǎn)登錄(Single Sign On),簡(jiǎn)稱為 SSO,是目前比較流行的企業(yè)業(yè)務(wù)整合的解決方案之一。SSO的定義是在多個(gè)應(yīng)用系統(tǒng)中,用戶只需要登錄一次就可以訪問(wèn)所有相互信任的應(yīng)用系統(tǒng)
為什么會(huì)存在單點(diǎn)登錄的問(wèn)題
- session默認(rèn)是存儲(chǔ)在當(dāng)前服務(wù)器的內(nèi)存中,如果是集群,那么只有登錄那臺(tái)機(jī)器的內(nèi)存中才有這個(gè)session
- 比如說(shuō)我在A機(jī)器登錄,B機(jī)器是沒(méi)有這個(gè)session存在的,所以需要重新驗(yàn)證
如何解決這個(gè)單點(diǎn)登錄問(wèn)題
- 不管在那一臺(tái)web服務(wù)器登錄,都會(huì)把token值存放到我們的一個(gè)集中管理的redis服務(wù)器中
- 當(dāng)客戶端攜帶token驗(yàn)證的時(shí)候,會(huì)先從redis中獲取,再去redis中查詢是否有該用戶信息存在,如此實(shí)現(xiàn)單點(diǎn)登陸
為什么要使用redis 來(lái)解決session 共享問(wèn)題呢?
- redis 是一個(gè)純鍵值類型的NSQL數(shù)據(jù)庫(kù),所有的操作都是具有原子性的.
- redis 可以設(shè)置key的生存時(shí)間,訪問(wèn)速度快速效率高.
- 缺點(diǎn)就是: 會(huì)對(duì)代碼有一定的侵入性.需要自行編碼實(shí)現(xiàn)!!!
單點(diǎn)登錄的缺點(diǎn)及解決辦法:
引進(jìn)SSO單點(diǎn)登錄的邏輯,它完美的解決了在多服務(wù)下的session共享問(wèn)題,但是又會(huì)帶來(lái)哪些問(wèn)題呢?
于是在這種情況下就需要使用分布式鎖!分布式鎖有很多實(shí)現(xiàn)方式, 利用redis 中的setnx 和getset命令來(lái)實(shí)現(xiàn)redis 分布式鎖!
SETNX命令簡(jiǎn)介 命令格式 SETNX key value 將 key 的值設(shè)為 value ,當(dāng)且僅當(dāng) key 不存在。 若給定的 key 已經(jīng)存在,則 SETNX 不做任何動(dòng)作。 SETNX 是『SET if Not eXists』(如果不存在,則 SET)的簡(jiǎn)寫(xiě)。 返回值 設(shè)置成功,返回 1 。 設(shè)置失敗,返回 0 。現(xiàn)實(shí)舉例
- 比如你寫(xiě)的一個(gè)tornado項(xiàng)目,分別部署到A,B兩臺(tái)機(jī)器上
- 如果直接使用session,那么如果在A機(jī)器登錄,token只會(huì)在A服務(wù)器的內(nèi)存
- 因?yàn)檎?qǐng)求會(huì)分不到A,B兩個(gè)機(jī)器,如果這個(gè)請(qǐng)求到了B機(jī)器,B的內(nèi)存中沒(méi)有就會(huì)讓重新登錄
- 所以登錄A機(jī)器的時(shí)候我們應(yīng)該把token值寫(xiě)入到redis中,A/B機(jī)器登錄,都從redis中獲取token進(jìn)行校驗(yàn)
單點(diǎn)登錄的原理:
總結(jié)
以上是生活随笔為你收集整理的基于Redis实现分布式部署单点登录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MongoDB常见面试题及答案模板
- 下一篇: linux cmake编译源码,linu