pre-load cache into RAM

Change-Id: I98f36969a55634fdea46caf18a5619d7480d120d
Signed-off-by: Doug Hellmann <doug@doughellmann.com>
This commit is contained in:
Doug Hellmann 2018-05-03 12:21:10 -04:00
parent 0628825403
commit 4e25b3f101

View File

@ -10,8 +10,12 @@
# License for the specific language governing permissions and limitations
# under the License.
import collections
import logging
import shelve
LOG = logging.getLogger(__name__)
class Cache:
"""Data cache with transparent key management
@ -27,9 +31,15 @@ class Cache:
def __init__(self, filename):
self._shelf = shelve.open(filename)
self._memory = {}
LOG.debug('loading cache into RAM')
for key in self._shelf:
self._memory[key] = self._shelf[key]
LOG.debug('loaded %d items from cache', len(self._memory))
self._data = collections.ChainMap(self._memory, self._shelf)
def __contains__(self, key):
return self._mk_key(key) in self._shelf
return self._mk_key(key) in self._data
def _mk_key(self, key):
return ':'.join(str(k) for k in key)
@ -38,9 +48,11 @@ class Cache:
self._shelf[self._mk_key(key)] = value
def __getitem__(self, key):
return self._shelf[self._mk_key(key)]
return self._data[self._mk_key(key)]
def __delitem__(self, key):
real_key = self._mk_key(key)
if real_key in self._shelf:
del self._shelf[real_key]
if real_key in self._memory:
del self._memory[real_key]