2009-11-15 43 views
3

任何碰巧在他們的web應用程序中使用這種組合?我在查找某種教程或指導來配置這個時遇到了一些麻煩。也看到我最近開始使用Pylons我不熟悉,所以請保持建議非常新手友好(我甚至沒有使用像Beaker這樣的模塊)。主塔和Memcached

我正在使用MySQL,運行pastie HTTP服務器,剛剛在Debian上安裝了memcached軟件包,使用SQLAlchemy ORM與我的數據庫在我的Pylons應用中進行交互,現在我不知道該怎麼做。

回答

7

memcached是很好的和框架不可知的,你只需要編寫一些代碼來與它進行交互。 memcached的一般思路是:

object = try_memcached() 
if not object: 
    object = real_query() 
    put_in_memcached(object) 

這可能會在你的SQLAlchemy抽象中完成,就你的情況而言。由於我不熟悉您的整個平臺(並且只有memcached),所以我做了一些Google搜索。

This blogger似乎已經將它們一起實施,並有助於提供一個鏈接到他使用的代碼。相關的代碼似乎是這樣,這可能對你有意義:

#!/usr/bin/python 
""" 
memcached objects for use with SQLAlchemy 
""" 
# This program is free software: you can redistribute it and/or modify 
# it under the terms of the GNU General Public License as published by 
# the Free Software Foundation, either version 3 of the License, or 
# (at your option) any later version. 
# 
# This program is distributed in the hope that it will be useful, 
# but WITHOUT ANY WARRANTY; without even the implied warranty of 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
# GNU General Public License for more details. 
# 
# You should have received a copy of the GNU General Public License 
# along with this program. If not, see <http://www.gnu.org/licenses/>. 

import memcache 
import sqlalchemy 
import sqlalchemy.orm 

SQLA_SESSION = sqlalchemy.orm.sessionmaker() 

MEMCACHED_CLIENT = memcache.Client(['127.0.0.1:11211']) 

class DetachedORMObject(object): 
    """ 
    Session-detached object for use with ORM Mapping. As the SQLAlchemy 
    documentation indicates, creating and closing a session is not analogous 
    to creating and closing a database connection. Connections are pooled by 
    the database engine by default. Creating new sessions is of a minimal 
    cost. Also, objects using this wrapper will not likely interact in with 
    the database through the full power of SQLAlchemy queries. 

    """ 
    @classmethod 
    def fetch_by_field(cls, field, value): 
     """Fetch a mapped orm object with the give field and value""" 
     session = SQLA_SESSION() 
     try: 
      class_object = session.query(cls).filter(field == value).one() 
     except sqlalchemy.orm.exc.NoResultFound: 
      class_object = None 
     finally: 
      session.close() 
     return class_object 

    def update(self): 
     """Update the database with the values of the object""" 
     session = SQLA_SESSION() 
     session.add(self) 
     session.commit() 
     session.refresh(self) 
     session.close() 

    def refresh(self): 
     """Refresh the object with the values of the database""" 
     session = SQLA_SESSION() 
     session.add(self) 
     session.refresh(self) 
     session.close() 

    def delete(self): 
     """Delete the object from the database""" 
     session = SQLA_SESSION() 
     session.add(self) 
     session.delete(self) 
     session.commit() 
     session.close() 


class MemcachedObject(object): 
    """ 
    Object Wrapper for serializing objects in memcached. Utilizes an abstract 
    method, get_isntance_key, to understand how to get and set objects that 
    impliment this class. 
    """ 
    @classmethod 
    def get_cached_instance(cls, instance_key): 
     """Retrieve and return the object matching the instance_key""" 
     key = str(cls.__module__ + '.' + cls.__name__ + ':' \ 
      + str(instance_key)) 
     print "Memcached Getting:", key 
     return MEMCACHED_CLIENT.get(key) 

    def set_cached_instance(self, time=0, min_compress_len=0): 
     """Set the cached instance of an object""" 
     print "Memcached Setting:", self.get_cache_key() 
     return MEMCACHED_CLIENT.set(self.get_cache_key(), self, time, \ 
      min_compress_len) 

    def delete_cached_instance(self, time=0): 
     """Wrapper for the memcached delete method""" 
     print "Memcached Deleting:", self.get_cache_key() 
     return MEMCACHED_CLIENT.delete(self.get_cache_key(), time) 

    def get_cache_key(self): 
     """Prepends the full class path of the object to the instance key""" 
     return self.__class__.__module__ + '.' + \ 
      self.__class__.__name__ + ':' + self.get_instance_key() 

    def get_instance_key(self): 
     """Get the instance key, must be implemented by child objects""" 
     raise NotImplementedError \ 
      ("'GetInstanceKey' method has not been defined.") 


class MemcachedORMObject(DetachedORMObject, MemcachedObject): 
    """ 
    Putting it all together now. Implements both of the above classes. Worth 
    noting is the method for checking to see if the fetch_by_field method is 
    invoked using a primary key of the class. The same technique is used to 
    generate an instance key for an instance of the class. 
    """ 
    @classmethod 
    def fetch_by_field(cls, field, value): 
     """Fetch the requested object from the cache and database""" 
     orm_object = None 
     matched_primary_key = True 
     for key in cls._sa_class_manager.mapper.primary_key: 
      if field.key != key.key: 
       matched_primary_key = False 
     if matched_primary_key: 
      orm_object = cls.get_cached_instance('(' + str(value) + ')') 
     if orm_object is None: 
      orm_object = super(MemcachedORMObject, cls). \ 
       fetch_by_field(field, value) 
      if orm_object is not None: 
       orm_object.set_cached_instance() 
     return orm_object 

    def update(self): 
     """Update the object in the database and memcached""" 
     DetachedORMObject.update(self) 
     self.set_cached_instance() 

    def refresh(self): 
     """Refresh the object from the database and memcached""" 
     DetachedORMObject.refresh(self) 
     self.set_cached_instance() 

    def delete(self): 
     """Delete the object from the database and memcached""" 
     DetachedORMObject.delete(self) 
     self.delete_cached_instance() 

    def get_instance_key(self): 
     """Get the instance key, implimenting abstract method in base""" 
     key = [] 
     for column in self._sa_instance_state.manager.mapper.primary_key: 
      key.append('(' + str(getattr(self, column.key)) + ')') 
     return ''.join(key) 

不知道這是否有幫助,但你有它。你可以看到在使用中memcached成語:

if matched_primary_key: 
     orm_object = cls.get_cached_instance('(' + str(value) + ')') 
    if orm_object is None: 
     orm_object = super(MemcachedORMObject, cls). \ 
      fetch_by_field(field, value) 
1

塔建議燒杯中的緩存,它有一個內存緩存後端。見here