Same opinion as samdark here, API would be a lot easier to implement with all the methods being at the PoolInterface level (i.e. getItem(string), getItems(string[]), setItem(string, int) deleteItem(string[]), deleteItems(string[]), flush(), clear(), itemExists(string)

This would mean that even with a more complex API including the value object, a default value object implementation proxying its calls ot the PoolInterface would be easy to write and univeral, various implementation vendors would only have to implement the PoolInterface in most case: it's simpler and encapsulate all potential queries to the backend in a unique class. Having the delete() and isHit() methods on the value item is only sugar candy but is non-sensical, the Pool reprensents the backend, not the value, and thus the backend primitives should be implemented at the Pool level, not the value level.