jenkins-bot has submitted this change and it was merged.

Change subject: Add proper caching for User model
......................................................................


Add proper caching for User model

- JSON is serialization format
- Uses redis

Change-Id: Ib96a5c407864619bd224f96108c1eaa21d7e582f
---
M quarry/web/app.py
M quarry/web/models/user.py
2 files changed, 33 insertions(+), 1 deletion(-)

Approvals:
  Legoktm: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/quarry/web/app.py b/quarry/web/app.py
index 5f122d0..bf7ec17 100644
--- a/quarry/web/app.py
+++ b/quarry/web/app.py
@@ -7,6 +7,7 @@
 import json
 import time
 import os
+import redis
 from celery import Celery
 from celery.exceptions import SoftTimeLimitExceeded
 
@@ -119,10 +120,19 @@
 
 @app.before_request
 def setup_context():
+    setup_redis()
     setup_db()
     setup_user()
 
 
+def setup_redis():
+    g.redis = redis.StrictRedis(
+        host=app.config['REDIS_HOST'],
+        port=app.config['REDIS_PORT'],
+        db=app.config['REDIS_DB']
+    )
+
+
 def setup_replica():
     g.replica = pymysql.connect(
         host=app.config['REPLICA_HOST'],
diff --git a/quarry/web/models/user.py b/quarry/web/models/user.py
index a435217..0fc3e2a 100644
--- a/quarry/web/models/user.py
+++ b/quarry/web/models/user.py
@@ -1,4 +1,5 @@
 from flask import g
+import json
 
 
 class User(object):
@@ -6,8 +7,26 @@
         self.id = id
         self.username = username
 
+    def to_json(self):
+        return json.dumps({
+            'id': self.id,
+            'username': self.username
+        })
+
+    @classmethod
+    def from_json(cls, json_data):
+        data = json.loads(json_data)
+        return cls(data['id'], data['username'])
+
+    @staticmethod
+    def get_cache_key(id):
+        return 'user:id:%s' % (id, )
+
     @classmethod
     def get_by_id(cls, id):
+        user_data = g.redis.get(cls.get_cache_key(id))
+        if user_data:
+            return User.from_json(user_data)
         try:
             cur = g.conn.cursor()
             cur.execute(
@@ -19,7 +38,9 @@
             cur.close()
         if result is None:
             return None
-        return cls(result[0], result[1])
+        user = cls(result[0], result[1])
+        g.redis.set(cls.get_cache_key(id), user.to_json())
+        return user
 
     def save(self):
         try:
@@ -29,5 +50,6 @@
                 ON DUPLICATE KEY UPDATE username=%s""",
                 (self.id, self.username, self.username)
             )
+            g.redis.delete(User.get_cache_key(self.id))
         finally:
             cur.close()

-- 
To view, visit https://gerrit.wikimedia.org/r/150220
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ib96a5c407864619bd224f96108c1eaa21d7e582f
Gerrit-PatchSet: 1
Gerrit-Project: analytics/quarry/web
Gerrit-Branch: master
Gerrit-Owner: Yuvipanda <yuvipa...@gmail.com>
Gerrit-Reviewer: Legoktm <legoktm.wikipe...@gmail.com>
Gerrit-Reviewer: Yuvipanda <yuvipa...@gmail.com>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to