@@ -59,6 +59,10 @@ def __init__(self, mapping=None, capacity=None, expires_in=None, lock=None,
59
59
self ._expires_in = expires_in
60
60
self ._lock = Lock () if lock is None else lock
61
61
62
+ def _peek (self ):
63
+ # Returns (sequence, timestamps) without triggering maintenance
64
+ return self ._mapping .get (self ._INDEX , ([], {}))
65
+
62
66
def _validate_key (self , key ):
63
67
if key == self ._INDEX :
64
68
raise ValueError ("key {} is a reserved keyword in {}" .format (
@@ -85,7 +89,7 @@ def _set(self, key, value, expires_in):
85
89
# This internal implementation powers both set() and __setitem__(),
86
90
# so that they don't depend on each other.
87
91
self ._validate_key (key )
88
- sequence , timestamps = self ._mapping . get ( self . _INDEX , ([], {}) )
92
+ sequence , timestamps = self ._peek ( )
89
93
self ._maintenance (sequence , timestamps ) # O(logN)
90
94
now = int (time .time ())
91
95
expires_at = now + expires_in
@@ -136,7 +140,7 @@ def __getitem__(self, key): # O(1)
136
140
self ._validate_key (key )
137
141
with self ._lock :
138
142
# Skip self._maintenance(), because it would need O(logN) time
139
- sequence , timestamps = self ._mapping . get ( self . _INDEX , ([], {}) )
143
+ sequence , timestamps = self ._peek ( )
140
144
expires_at , created_at = timestamps [key ] # Would raise KeyError accordingly
141
145
now = int (time .time ())
142
146
if not created_at <= now < expires_at :
@@ -155,22 +159,22 @@ def __delitem__(self, key): # O(1)
155
159
with self ._lock :
156
160
# Skip self._maintenance(), because it would need O(logN) time
157
161
self ._mapping .pop (key , None ) # O(1)
158
- sequence , timestamps = self ._mapping . get ( self . _INDEX , ([], {}) )
162
+ sequence , timestamps = self ._peek ( )
159
163
del timestamps [key ] # O(1)
160
164
self ._mapping [self ._INDEX ] = sequence , timestamps
161
165
162
166
def __len__ (self ): # O(logN)
163
167
"""Drop all expired items and return the remaining length"""
164
168
with self ._lock :
165
- sequence , timestamps = self ._mapping . get ( self . _INDEX , ([], {}) )
169
+ sequence , timestamps = self ._peek ( )
166
170
self ._maintenance (sequence , timestamps ) # O(logN)
167
171
self ._mapping [self ._INDEX ] = sequence , timestamps
168
172
return len (timestamps ) # Faster than iter(self._mapping) when it is on disk
169
173
170
174
def __iter__ (self ):
171
175
"""Drop all expired items and return an iterator of the remaining items"""
172
176
with self ._lock :
173
- sequence , timestamps = self ._mapping . get ( self . _INDEX , ([], {}) )
177
+ sequence , timestamps = self ._peek ( )
174
178
self ._maintenance (sequence , timestamps ) # O(logN)
175
179
self ._mapping [self ._INDEX ] = sequence , timestamps
176
180
return iter (timestamps ) # Faster than iter(self._mapping) when it is on disk
0 commit comments