WeakRef dictionary by itself is essentially the same as no cache. Added
a fixed length deque to keep track of some keys
most of the key,value pairs we want to cache are not weak-referenceable,
get around this limitation by using both weakkey and weakvalue dicts