日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
tornado使用redis來(lái)實(shí)現(xiàn)session分布式存儲(chǔ)

前言:

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、虛擬空間、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、肅南裕固族自治網(wǎng)站維護(hù)、網(wǎng)站推廣。

為了提供讓tornado更接近c(diǎn)10的能力,只能用nginx來(lái)處理tornado不太擅長(zhǎng)的靜態(tài)文件及用多app方案來(lái)提高負(fù)載能力。

我人比較的懶,把接口和平臺(tái)的頁(yè)面都做成一個(gè)py了,用upstream不好做負(fù)載,如果你用ip_hash,或者insert cookie的方式,雖然保證了針對(duì)后端服務(wù)器的命中,但是哥還就不想命中。

我還就想rr輪訓(xùn),為啥? 因?yàn)轫?yè)面上大量的耗時(shí)間的io和計(jì)算請(qǐng)求,這個(gè)時(shí)候我總是命中調(diào)度到一臺(tái)服務(wù)器,那我就會(huì)一直的等待,后面還有一堆的任務(wù)也都在同步堵塞著。太痛快啦,這個(gè)時(shí)候就需要rr輪訓(xùn),session如何的一致性,這個(gè)時(shí)候就需要一個(gè)快速的存儲(chǔ)來(lái)保證session cookie的存儲(chǔ)。

以前更多是用tornado memcached來(lái)存儲(chǔ)session或者cookie,因?yàn)閳?bào)警平臺(tái)中已經(jīng)在用redis、mongodb這些nosql數(shù)據(jù)庫(kù),沒(méi)必要再配置memcached了。 這次用我鐘愛(ài)的redis了。

這里導(dǎo)入了相關(guān)的類(lèi)和庫(kù),login_required是裝飾器,專(zhuān)門(mén)來(lái)判斷用戶登錄了沒(méi)有,沒(méi)有的話把訪問(wèn)扔給login.html頁(yè)面。

 
 
  1. #xiaorui.cc   
  2. from base import BaseHandler   
  3. from tornado.web import HTTPError   
  4. def login_required(f):   
  5.     def _wrapper(self,*args, **kwargs):   
  6.         print self.get_current_user()   
  7.         logged = self.get_current_user()   
  8.         if logged == None:   
  9.             self.write('no login')   
  10.             self.finish()   
  11.         else:   
  12.             ret = f(self,*args, **kwargs)   
  13.     return _wrapper   
  14. class Application(tornado.web.Application):   
  15.     def __init__(self):   
  16.         settings = dict(   
  17.             cookie_secret = "e446976943b4e8442f099fed1f3fea28462d5832f483a0ed9a3d5d3859f==78d",   
  18.             session_secret = "3cdcb1f00803b6e78ab50b466a40b9977db396840c28307f428b25e2277f1bcc",   
  19.             session_timeout = 60,   
  20.             store_options = {   
  21.             'redis_host': 'localhost',   
  22.                 'redis_port': 6379,   
  23.                 'redis_pass': '',   
  24.         },   
  25.         )   
  26.         handlers = [   
  27.             (r"/", MainHandler),   
  28.             (r"", MainHandler),   
  29.             (r"/login", LoginHandler)   
  30.         ]   
  31.         tornado.web.Application.__init__(self, handlers, **settings)   
  32.         self.session_manager = session.SessionManager(settings["session_secret"], settings["store_options"], settings["session_timeout"])  

關(guān)聯(lián)的兩個(gè)類(lèi):

 
 
  1. class MainHandler(BaseHandler):   
  2.     @login_required   
  3.     def get(self):   
  4.         username = self.get_current_user()   
  5.         print 'start..' 
  6.         print username   
  7.         print self.session['nima']   
  8.         if username==None:   
  9.             self.write('nima')   
  10.         else:   
  11.             self.write("What's up, " + username + "?")   
  12. class LoginHandler(BaseHandler):   
  13.     def get(self):   
  14.         self.session["user_name"] = self.get_argument("name")   
  15.         self.session["nima"] = 'xiaorui.cc' 
  16.         self.session.save()   
  17.         self.write('你的session已經(jīng)歐了') 

處理session的文件 !

 
 
  1. #/usr/bin/python   
  2. # coding: utf-8 
  3. import uuid   
  4. import hmac   
  5. import ujson   
  6. import hashlib   
  7. import redis   
  8. class SessionData(dict):   
  9.     def __init__(self, session_id, hmac_key):   
  10.         self.session_id = session_id   
  11.         self.hmac_key = hmac_key   
  12. #   @property   
  13. #   def sid(self):   
  14. #       return self.session_id   
  15. #   @x.setter   
  16. #   def sid(self, value):   
  17. #       self.session_id = value   
  18. class Session(SessionData):   
  19.     def __init__(self, session_manager, request_handler):   
  20.         self.session_manager = session_manager   
  21.         self.request_handler = request_handler   
  22.         try:   
  23.             current_session = session_manager.get(request_handler)   
  24.         except InvalidSessionException:   
  25.             current_session = session_manager.get()   
  26.         for key, data in current_session.iteritems():   
  27.             self[key] = data   
  28.         self.session_id = current_session.session_id   
  29.         self.hmac_key = current_session.hmac_key
  30.  
  31. def save(self):   
  32.         self.session_manager.set(self.request_handler, self)   
  33. class SessionManager(object):   
  34.     def __init__(self, secret, store_options, session_timeout):   
  35.         self.secret = secret   
  36.         self.session_timeout = session_timeout   
  37.         try:   
  38.             if store_options['redis_pass']:   
  39.                 self.redis = redis.StrictRedis(host=store_options['redis_host'], port=store_options['redis_port'], password=store_options['redis_pass'])   
  40.             else:   
  41.                 self.redis = redis.StrictRedis(host=store_options['redis_host'], port=store_options['redis_port'])   
  42.         except Exception as e:   
  43.             print e
  44.  
  45.    def _fetch(self, session_id):   
  46.         try:   
  47.             session_data = raw_data = self.redis.get(session_id)   
  48.             if raw_data != None:   
  49.                 self.redis.setex(session_id, self.session_timeout, raw_data)   
  50.                 session_data = ujson.loads(raw_data)   
  51.             if type(session_data) == type({}):   
  52.                 return session_data   
  53.             else:   
  54.                 return {}   
  55.         except IOError:   
  56.             return {}   
  57.     def get(self, request_handler = None):   
  58.         if (request_handler == None):   
  59.             session_id = None   
  60.             hmac_key = None   
  61.         else:   
  62.             session_id = request_handler.get_secure_cookie("session_id")   
  63.             hmac_key = request_handler.get_secure_cookie("verification")   
  64.         if session_id == None:   
  65.             session_exists = False   
  66.             session_id = self._generate_id()   
  67.             hmac_key = self._generate_hmac(session_id)   
  68.         else:   
  69.             session_exists = True   
  70.         check_hmac = self._generate_hmac(session_id)   
  71.         if hmac_key != check_hmac:   
  72.             raise InvalidSessionException()   
  73.         session = SessionData(session_id, hmac_key)   
  74.         if session_exists:   
  75.             session_data = self._fetch(session_id)   
  76.             for key, data in session_data.iteritems():   
  77.                 session[key] = data   
  78.         return session 
  79.  
  80. def set(self, request_handler, session):   
  81.         request_handler.set_secure_cookie("session_id", session.session_id)   
  82.         request_handler.set_secure_cookie("verification", session.hmac_key)   
  83.         session_data = ujson.dumps(dict(session.items()))   
  84.         self.redis.setex(session.session_id, self.session_timeout, session_data)   
  85.     def _generate_id(self):   
  86.         new_id = hashlib.sha256(self.secret + str(uuid.uuid4()))   
  87.         return new_id.hexdigest()   
  88.     def _generate_hmac(self, session_id):   
  89.         return hmac.new(session_id, self.secret, hashlib.sha256).hexdigest()   
  90. class InvalidSessionException(Exception):   
  91.     pass 

tornado每個(gè)控制器相關(guān)的class ~

 
 
  1. import tornado.web   
  2. import sys   
  3. import session   
  4. class BaseHandler(tornado.web.RequestHandler):   
  5.     def __init__(self, *argc, **argkw):   
  6.         super(BaseHandler, self).__init__(*argc, **argkw)   
  7.         self.session = session.Session(self.application.session_manager, self)   
  8.     def get_current_user(self):   
  9.         return self.session.get("user_name") 

對(duì)于登錄注冊(cè)session:

 
 
  1. self.session["user_name"] = self.get_argument("name")   
  2. self.session["nima"] = 'xiaorui.cc' 
  3. self.session.save() 

對(duì)于退出登錄:

 
 
  1. self.session["nima"] =None   
  2. self.session.save() 

其實(shí)就改成None就行了,匹配都在裝飾器那邊搞好了。

原文:http://rfyiamcool.blog./1030776/1406378

偶了,這就可以了。用之前要配置下相關(guān)的組件!

pip install ujson redis

pip install tornado

session.py 代碼來(lái)自:

 
 
  1. git clone https://github.com/zs1621/tornado-redis-session 

這老外寫(xiě)的有點(diǎn)簡(jiǎn)陋,說(shuō)明幾乎沒(méi)有,還好tornado redis session本身就是不難的東西,看看就能搞定。

單個(gè)tornado我現(xiàn)在已經(jīng)可以頂?shù)?500個(gè)長(zhǎng)連接不崩潰了,如果加上ngixn做tornado的分發(fā)負(fù)載,估計(jì)連接在6k問(wèn)題不大。就算是接入所有業(yè)務(wù)的郵件轉(zhuǎn)發(fā)問(wèn)題也不大,估計(jì)問(wèn)題都在郵件網(wǎng)關(guān)上了。

博客地址:http://rfyiamcool.blog./1030776/1406378


當(dāng)前題目:tornado使用redis來(lái)實(shí)現(xiàn)session分布式存儲(chǔ)
文章源于:http://www.dlmjj.cn/article/djscgic.html