GAE's Memcache
Memcache 是高效能、分散式的記憶體物件快取系統。存放在Memcache內的資料若一段時間不訪問,或是可供快取的空間用完時,快取的內容即會過時。
首先需先將google.appengine.ext.db import進來。
from google.appengine.api import memcache
要將資料存放到Memcache時,可以呼叫memcache.set方法,帶入資料的Key、Value、以及Timeout的時間 (Timeout的時間可以省略,若要指定需注意到這邊是以秒為單位)。
memcache.set(key, value, timeout)
要將資料從Memcache讀出,可以呼叫memcache.get方法,帶入所要取出的資料鍵值。若有對應的資料存放在Memcache則會將值回傳,若無則會回傳None。
value = memcache.get(key) if value: #Data still cached ... else: #Data without cached ...
除了單一值的存取外,Memcache也支援多值的存取。使用上會像下面這樣:
memcache.set_multi({key1: value1, key2: value2}) values = memcache.get_multi([key1, key2]) value1 = values[key1] value2 = values[key2]
存放改呼叫memcache.set_multi方法,用Dictionary帶入多筆Key/Value配對進去。取出資料則是改呼叫memcache.get_multi方法,用陣列帶入多筆鍵值。
實際看個簡單的例子:
from google.appengine.api import memcache import webapp2 class MainHandler(webapp2.RequestHandler): def get(self): memcache.set("name", "LevelUp") value = memcache.get("name") self.response.write(value + "<br/>") memcache.set_multi({"name": "LevelUp", "url": "httlp://www.dotblogs.com.tw/larrynung"}) values = memcache.get_multi(["name", "url"]) self.response.write(values["name"] + "<br/>") self.response.write(values["url"] + "<br/>") application = webapp2.WSGIApplication([ ('/', MainHandler) ])
運行起來會像下面這樣:
再進一步將筆者GAE's Python Datastore API這篇的範例套用Memcache,讓用GQL讀取出的資料可以存放在Memcache中,可以像下面這樣撰寫:
from google.appengine.api import memcache from google.appengine.ext import db import webapp2 import uuid class Article(db.Model): id = db.StringProperty(required=True) name = db.StringProperty() content = db.TextProperty() class Blog(db.Model): id = db.StringProperty(required=True) name = db.StringProperty(required=True) url = db.LinkProperty(required=True) articleIDs = db.StringListProperty() class MainHandler(webapp2.RequestHandler): def get(self): self.response.write("<html><body>") blogs = db.GqlQuery("select * from Blog Limit 1") if not blogs or blogs.count() == 0: blog = Blog(id=str(uuid.uuid1()), name="LevelUp", url="http://www.dotblogs.com.tw/larrynung") articleID = str(uuid.uuid1()) Article(id=articleID, name="hello", content="hello world").put() blog.articleIDs = [articleID] blog.put() self.response.write("Blog data saved...<br/><br/>") self.redirect("/") return blog = memcache.get("blog") if blog: self.response.write("Cached blog data...<br/><br/>") else: self.response.write("Blog data loading...<br/><br/>") blog = Blog.gql("Limit 1")[0] self.response.write("Save blog data to memcache...<br/><br/>") memcache.set("blog", blog, 5) self.response.write(blog.name + "<br/>") self.response.write(blog.url + "<br/>") for articleID in blog.articleIDs: article = Article.gql("where id = :1", articleID)[0] self.response.write(article.name + "</br>") self.response.write(article.content + "</br>") self.response.write("<br/>") self.response.write("</body></html>") application = webapp2.WSGIApplication([ ('/', MainHandler) ])
第一次運行就會將資料讀出後存放進Memcache。
再次運行就會改由Memcache中讀取。