国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

tornado使用redis來實現(xiàn)session分布式存儲

開發(fā) 前端 Redis 分布式
以前更多是用tornado memcached來存儲session或者cookie,因為報警平臺中已經(jīng)在用redis、mongodb這些nosql數(shù)據(jù)庫,沒必要再配置memcached了。 這次用我鐘愛的redis了。

前言:

為了提供讓tornado更接近c10的能力,只能用nginx來處理tornado不太擅長的靜態(tài)文件及用多app方案來提高負載能力。

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

我還就想rr輪訓,為啥? 因為頁面上大量的耗時間的io和計算請求,這個時候我總是命中調(diào)度到一臺服務器,那我就會一直的等待,后面還有一堆的任務也都在同步堵塞著。。。太痛快啦,這個時候就需要rr輪訓,session如何的一致性,這個時候就需要一個快速的存儲來保證session cookie的存儲。

以前更多是用tornado memcached來存儲session或者cookie,因為報警平臺中已經(jīng)在用redis、mongodb這些nosql數(shù)據(jù)庫,沒必要再配置memcached了。 這次用我鐘愛的redis了。

這里導入了相關的類和庫,login_required是裝飾器,專門來判斷用戶登錄了沒有,沒有的話把訪問扔給login.html頁面。

  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"])  

關聯(lián)的兩個類:

  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每個控制器相關的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"

對于登錄注冊session:

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

對于退出登錄:

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

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

原文:http://rfyiamcool.blog.51cto.com/1030776/1406378

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

pip install ujson redis

pip install tornado

session.py 代碼來自:

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

這老外寫的有點簡陋,說明幾乎沒有,還好tornado redis session本身就是不難的東西,看看就能搞定。

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

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

 

責任編輯:林師授 來源: 51cto博客
相關推薦

2015-08-19 15:45:33

2021-03-08 09:56:24

存儲分布式Session

2024-10-07 10:07:31

2024-04-01 05:10:00

Redis數(shù)據(jù)庫分布式鎖

2023-08-21 19:10:34

Redis分布式

2022-01-06 10:58:07

Redis數(shù)據(jù)分布式鎖

2023-12-29 08:18:31

Session分布式系統(tǒng)微服務

2019-06-19 15:40:06

分布式鎖RedisJava

2017-10-27 08:40:44

分布式存儲剪枝系統(tǒng)

2015-06-17 14:10:34

Redis分布式系統(tǒng)協(xié)調(diào)

2023-07-11 10:24:00

分布式限流算法

2019-02-26 09:51:52

分布式鎖RedisZookeeper

2023-01-13 07:39:07

2025-05-16 08:58:47

Mongodb分布式存儲

2024-08-12 16:20:27

2015-05-12 13:03:54

開源分布式存儲HDFS

2024-01-02 13:15:00

分布式鎖RedissonRedis

2022-06-28 08:37:07

分布式服務器WebSocket

2024-06-13 09:34:35

JWTTokenSpring

2020-07-15 16:50:57

Spring BootRedisJava
點贊
收藏

51CTO技術棧公眾號

欧美久久亚洲| 久久综合中文字幕| 四虎在线免费看| 欧美日韩亚洲综合一区二区三区激情在线 | 在线观看精品自拍私拍| 在线观看日产精品| 成人va在线观看| 亚洲一区二区网站| 精品久久亚洲| 欧美草逼视频| 一本一道dvd在线观看免费视频| 成人免费观看在线| 美女三级99| 国产精品揄拍500视频| 精品国产视频在线| 亚洲国产福利在线| 欧美日韩免费视频| 欧美日韩亚洲高清| 国产清纯美女被跳蛋高潮一区二区久久w| 韩国女主播成人在线观看| 影音先锋久久久| 天堂美国久久| 欧美日韩有码| 国产a久久精品一区二区三区| 精品视频在线观看网站| 国产精品一区二区美女视频免费看| 忘忧草在线日韩www影院| 日本在线观看高清完整版| 快射视频在线观看| 99免在线观看免费视频高清| 你懂的在线观看视频网站| 中文在线最新版天堂8| 神马久久影视大全| 922tv免费观看在线| 亚洲校园欧美国产另类| 无遮挡动作视频在线观看免费入口 | 国产精品久久久久久av福利软件| 欧美成人亚洲成人日韩成人| 欧美成人黄色小视频| 欧美激情视频网址| 国产z一区二区三区| 国产一区二区久久久| 国产精品国产精品| 手机福利在线视频| 久久99久久99精品| 四虎永久在线高清国产精品| http://嫩草影院| 精品欧美不卡一区二区在线观看| 高清av电影在线观看| 成人一级福利| 国产精品宾馆| 亚洲一本二本| 国产最新精品精品你懂的| 91丝袜高跟美女视频| 亚洲天堂成人在线观看| 欧美性色视频在线| 亚洲色图50p| 全球成人中文在线| 亚洲欧美日韩精品在线| 成人午夜视频免费在线观看| 新版中文字幕在线资源| 97欧美成人| 亚洲欧美在线专区| 不卡av电影在线播放| 色999日韩国产欧美一区二区| 尤物tv国产一区| 国产91色在线|免| 中文字幕在线中文| 黄色毛片在线看| 午夜影院一区| 欧美日一区二区在线观看| 久久综合色综合88| 日韩欧美电影一二三| 久久综合色影院| 亚洲欧洲一区二区| 日本私人网站在线观看| 国产伦理久久久久久妇女| 亚洲久久成人| 亚洲成av人片| 欧美精品一区三区| 成年丰满熟妇午夜免费视频| 你懂的在线看| 电影一区二区在线观看| 日本中文字幕不卡| 在线亚洲高清视频| 国产精品日韩欧美大师| 茄子视频成人免费观看| 激情图片qvod| 欧美天天影院| 精品国内亚洲2022精品成人| 美女视频黄免费的久久| 亚洲第一狼人社区| 欧美专区第一页| 精品无码一区二区三区爱欲| 丁香花视频在线观看| 欧美国产免费| 五月激情丁香一区二区三区| 欧美日韩不卡合集视频| 樱空桃在线播放| 亚洲女同av| 国产一区二区在线视频| 精品国产第一区二区三区观看体验| 欧美专区中文字幕| 亚洲欧美另类动漫| 国产一区高清| 91免费国产视频网站| 日韩在线观看高清| 伊人网在线免费| 免费看男女www网站入口在线| 国产精品极品在线观看| www.成人在线| 久久久精品免费| 国产视频一区二区视频| 中文字幕成人| 国产欧美一区二区精品婷婷| 在线观看欧美日韩国产| 精品少妇一区二区三区在线| 成人福利视频| 精品一区二区免费看| 亚洲美女又黄又爽在线观看| www.亚洲天堂网| 老汉色老汉首页av亚洲| 中文字幕人成不卡一区| 成人网在线视频| 黄色在线免费观看网站| 99精品欧美一区二区蜜桃免费 | 妖精视频一区二区三区| 99久久99久久久精品齐齐| 萌白酱国产一区二区| 国产一区视频免费观看| 日韩精品二区| 精品国内片67194| 成人免费xx| 亚洲欧美日韩视频二区| 欧美大片免费观看在线观看网站推荐| 日本视频一二三区中文字幕| 蜜臀av性久久久久蜜臀aⅴ | 精品一区二区三区免费视频| 欧美亚洲国产视频小说| caoporn免费在线| **网站欧美大片在线观看| 97超碰人人爱| 狠狠色丁香婷婷综合影院| 日韩精品专区在线影院重磅| 色视频网站在线| 国产乱色国产精品免费视频| 亚洲最大福利视频| 99re8这里有精品热视频8在线| 欧美成人艳星乳罩| videoxxxx另类日本极品| av在线播放一区二区三区| 日本高清久久一区二区三区| 欧美精品一二| 91高清视频免费| 九九热线视频只有这里最精品| 欧美三级午夜理伦三级中视频| 一区二区三区国产免费| 国产一区二区三区在线观看免费视频| 97夜夜澡人人双人人人喊| 亚洲精品进入| 在线播放国产一区中文字幕剧情欧美 | 亚洲欧美综合网| 成人一区二区免费视频| 亚洲成人直播| 亚洲精品v欧美精品v日韩精品| 日韩激情视频一区二区| 成人黄色777网| 欧美一级裸体视频| 欧美网站大全在线观看| 久久久久久久| 国产不卡在线观看| 青青草成人在线观看| 色婷婷综合久久久久中文字幕 | av一区在线| 国产成人91久久精品| 久久综合婷婷| 亚洲娇小娇小娇小| 欧美精品第1页| 久久久久99精品久久久久| 亚洲国产视频二区| 国产深夜精品福利| 亚洲专区在线| 欧美日韩国产精品激情在线播放| 成人av电影在线| 国产视频在线视频| 欧美最猛性xxxxx直播| 欧美1234区| 国产午夜精品全部视频播放 | 久久99精品久久久久久水蜜桃| 亚洲青色在线| 国产中文字幕乱人伦在线观看| 午夜一区二区三区在线观看| 污污的网站在线免费观看| 国产免费久久精品| 中文字幕在线亚洲精品| 一卡二卡欧美日韩| 超碰在线97免费| 91麻豆免费在线观看| 污污免费网站| 精品国产麻豆免费人成网站|