GAEを使う必ずみんな意識するのがDataStoreへのアクセスをいかに減らすか。
それすなわちキャッシュの使い方なり!
と考えているわけですが、やることなんて以下の2点だと思います。
・Model.put()するときにはmemcache.set()しろ
・Model.get()するまえにmemcache.get()しろ
そこで、db.Modelを拡張しました。
まず、ModelAbsというdb.Modelを継承した中間のクラスを作って。
==========
class ModelAbs(db.Model):
def put_with_cache(self,key_name):
self.put()
memcache.set(key=key_name,value=self)
return self.key()
@classmethod
def get_with_cache(cls,key_names,**kwargs):
if isinstance(key_names,list) == False:
key_names = [str(key_names)]
models = list()
for key_name in key_names:
ent = memcache.get(key=key_name)
if ent == None:
ent = cls.get_by_key_name(key_names=key_name)
memcache.set(key=key_name,value=ent)
models.append(ent)
if len(key_names) > 1:
return models
else:
return models[0]
==========
そのModelAbsを継承したエンティティのクラスを作りました。
==========
class SPOTS(ModelAbs):
update = db.DateTimeProperty(required=True)
USDJPY = db.StringProperty(multiline=False)
EURJPY = db.StringProperty(multiline=False)
EURUSD = db.StringProperty(multiline=False)
AUDJPY = db.StringProperty(multiline=False)
GBPJPY = db.StringProperty(multiline=False)
NZDJPY = db.StringProperty(multiline=False)
CADJPY = db.StringProperty(multiline=False)
CHFJPY = db.StringProperty(multiline=False)
HKDJPY = db.StringProperty(multiline=False)
GBPUSD = db.StringProperty(multiline=False)
USDCHF = db.StringProperty(multiline=False)
ZARJPY = db.StringProperty(multiline=False)
==========
基本的にdb.Modelのkey_nameでの読み書きになります。
==========
class MainHandler(webapp.RequestHandler):
def get(self):
now = datetime.datetime.now() + datetime.timedelta(hours=9)
str_now = datetime.datetime.strftime(now,'%Y%m%d%H%M')
key = 'SPOTS:'+str_now
rate = commons.GetCurrentRate()
spot = models.SPOTS(key_name=key,
update=now,
USDJPY = rate['USDJPY'],
EURJPY = rate['EURJPY'],
EURUSD = rate['EURUSD'],
AUDJPY = rate['AUDJPY'],
GBPJPY = rate['GBPJPY'],
NZDJPY = rate['NZDJPY'],
CADJPY = rate['CADJPY'],
CHFJPY = rate['CHFJPY'],
HKDJPY = rate['HKDJPY'],
GBPUSD = rate['GBPUSD'],
USDCHF = rate['USDCHF'],
ZARJPY = rate['ZARJPY'])
ds_key = spot.put_with_cache(key_name=key)
entity = spot.get_with_cache(key_names=key)
self.response.out.write(str(key)+'<改行>')
self.response.out.write(str(ds_key)+'<改行>')
self.response.out.write(str(entity.key())+'<改行>')
self.response.out.write(str(rate))
==========
これでたくさんのif文を書かずにシンプルにキャッシュが利用出来るようになりました。
コメント
コメントを投稿