diff options
| author | Vishvananda Ishaya <vishvananda@gmail.com> | 2013-03-01 09:39:02 -0800 |
|---|---|---|
| committer | Vishvananda Ishaya <vishvananda@gmail.com> | 2013-03-01 10:02:34 -0800 |
| commit | 844123e2197358a2aeb39feb7275305f55b03e38 (patch) | |
| tree | 702c6c25314477821db57df2855a490831081da5 /openstack/common | |
| parent | eaab5fae2502198e9fa57d0d90a7204a2bd83b16 (diff) | |
| download | oslo-844123e2197358a2aeb39feb7275305f55b03e38.tar.gz oslo-844123e2197358a2aeb39feb7275305f55b03e38.tar.xz oslo-844123e2197358a2aeb39feb7275305f55b03e38.zip | |
Add simple in-memory cache from nova.
Nova's simple in-memory cache replicates the memcache interface,
so clients can cache things in memcache or in memory using
the same commands. Using memcached requires having the client
library installed and the memcached_servers config option set.
Callers can also pass in a list of memcached servers when they
initialize the client.
Change-Id: I831142a36797b04006cba4792df803e09f6fd69b
Diffstat (limited to 'openstack/common')
| -rw-r--r-- | openstack/common/memorycache.py | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/openstack/common/memorycache.py b/openstack/common/memorycache.py new file mode 100644 index 0000000..23847e6 --- /dev/null +++ b/openstack/common/memorycache.py @@ -0,0 +1,96 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Super simple fake memcache client.""" + +from oslo.config import cfg + +from openstack.common import timeutils + +memcache_opts = [ + cfg.ListOpt('memcached_servers', + default=None, + help='Memcached servers or None for in process cache.'), +] + +CONF = cfg.CONF +CONF.register_opts(memcache_opts) + + +def get_client(memcached_servers=None): + client_cls = Client + + if not memcached_servers: + memcached_servers = CONF.memcached_servers + if memcached_servers: + try: + import memcache + client_cls = memcache.Client + except ImportError: + pass + + return client_cls(memcached_servers, debug=0) + + +class Client(object): + """Replicates a tiny subset of memcached client interface.""" + + def __init__(self, *args, **kwargs): + """Ignores the passed in args.""" + self.cache = {} + + def get(self, key): + """Retrieves the value for a key or None. + + this expunges expired keys during each get""" + + now = timeutils.utcnow_ts() + for k in self.cache.keys(): + (timeout, _value) = self.cache[k] + if timeout and now >= timeout: + del self.cache[k] + + return self.cache.get(key, (0, None))[1] + + def set(self, key, value, time=0, min_compress_len=0): + """Sets the value for a key.""" + timeout = 0 + if time != 0: + timeout = timeutils.utcnow_ts() + time + self.cache[key] = (timeout, value) + return True + + def add(self, key, value, time=0, min_compress_len=0): + """Sets the value for a key if it doesn't exist.""" + if self.get(key) is not None: + return False + return self.set(key, value, time, min_compress_len) + + def incr(self, key, delta=1): + """Increments the value for a key.""" + value = self.get(key) + if value is None: + return None + new_value = int(value) + delta + self.cache[key] = (self.cache[key][0], str(new_value)) + return new_value + + def delete(self, key, time=0): + """Deletes the value associated with a key.""" + if key in self.cache: + del self.cache[key] |
