You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
35 lines
1.2 KiB
35 lines
1.2 KiB
# Copyright (C) 2005-2023 Splunk Inc. All Rights Reserved.
|
|
from datetime import datetime
|
|
from hydra import six
|
|
|
|
class MetricsCache(object):
|
|
"""LRU cache for storing metric lists.
|
|
|
|
Instantiated with kwargs:
|
|
max_size - max number of items before expulsion
|
|
expunge_size - number of least-recently accessed items
|
|
to purge when exceeding max_size.
|
|
|
|
Class wraps a dictionary implementing a minimal interface."""
|
|
def __init__(self, max_size=20, expunge_size=10):
|
|
self.d = {}
|
|
self.CACHE_MAX_SIZE = max_size
|
|
self.CACHE_EXPUNGE_SIZE = expunge_size
|
|
if expunge_size >= max_size or max_size <= 2:
|
|
raise ValueError("Bad cache size parameters")
|
|
def __setitem__(self, key, value):
|
|
self.d[key] = [value, datetime.now()]
|
|
if len(self.d) > self.CACHE_MAX_SIZE:
|
|
for _, key in sorted([(v[1], k) for k,v in six.iteritems(self.d)])[:self.CACHE_EXPUNGE_SIZE]:
|
|
del self.d[key]
|
|
def __getitem__(self, key):
|
|
self.d[key][1] = datetime.now()
|
|
return self.d[key][0]
|
|
def __contains__(self, key):
|
|
return key in self.d
|
|
def __len__(self):
|
|
return len(self.d)
|
|
def __delitem__(self, key):
|
|
del self.d[key]
|
|
|