mirror of
https://github.com/pocoproject/poco.git
synced 2025-10-17 19:25:53 +02:00
extended caching framework with configurable thread safeness
This commit is contained in:
@@ -56,15 +56,15 @@
|
||||
namespace Poco {
|
||||
|
||||
|
||||
template <class TKey, class TValue, class TStrategy>
|
||||
template <class TKey, class TValue, class TStrategy, class TMutex = FastMutex, class TEventMutex = FastMutex>
|
||||
class AbstractCache
|
||||
/// An AbstractCache is the interface of all caches.
|
||||
{
|
||||
public:
|
||||
FIFOEvent<const KeyValueArgs<TKey, TValue > > Add;
|
||||
FIFOEvent<const TKey> Remove;
|
||||
FIFOEvent<const TKey> Get;
|
||||
FIFOEvent<const EventArgs> Clear;
|
||||
FIFOEvent<const KeyValueArgs<TKey, TValue >, TEventMutex > Add;
|
||||
FIFOEvent<const TKey, TEventMutex> Remove;
|
||||
FIFOEvent<const TKey, TEventMutex> Get;
|
||||
FIFOEvent<const EventArgs, TEventMutex> Clear;
|
||||
|
||||
typedef std::map<TKey, SharedPtr<TValue > > DataHolder;
|
||||
typedef typename DataHolder::iterator Iterator;
|
||||
@@ -90,7 +90,7 @@ public:
|
||||
/// Adds the key value pair to the cache.
|
||||
/// If for the key already an entry exists, it will be overwritten.
|
||||
{
|
||||
FastMutex::ScopedLock lock(_mutex);
|
||||
typename TMutex::ScopedLock lock(_mutex);
|
||||
doAdd(key, val);
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ public:
|
||||
/// Adds the key value pair to the cache. Note that adding a NULL SharedPtr will fail!
|
||||
/// If for the key already an entry exists, it will be overwritten.
|
||||
{
|
||||
FastMutex::ScopedLock lock(_mutex);
|
||||
typename TMutex::ScopedLock lock(_mutex);
|
||||
doAdd(key, val);
|
||||
}
|
||||
|
||||
@@ -106,7 +106,7 @@ public:
|
||||
/// Removes an entry from the cache. If the entry is not found,
|
||||
/// the remove is ignored.
|
||||
{
|
||||
FastMutex::ScopedLock lock(_mutex);
|
||||
typename TMutex::ScopedLock lock(_mutex);
|
||||
Iterator it = _data.find(key);
|
||||
doRemove(it);
|
||||
}
|
||||
@@ -114,7 +114,7 @@ public:
|
||||
bool has(const TKey& key) const
|
||||
/// Returns true if the cache contains a value for the key.
|
||||
{
|
||||
FastMutex::ScopedLock lock(_mutex);
|
||||
typename TMutex::ScopedLock lock(_mutex);
|
||||
return doHas(key);
|
||||
}
|
||||
|
||||
@@ -123,21 +123,21 @@ public:
|
||||
/// even when cache replacement removes the element.
|
||||
/// If for the key no value exists, an empty SharedPtr is returned.
|
||||
{
|
||||
FastMutex::ScopedLock lock(_mutex);
|
||||
typename TMutex::ScopedLock lock(_mutex);
|
||||
return doGet (key);
|
||||
}
|
||||
|
||||
void clear()
|
||||
/// Removes all elements from the cache.
|
||||
{
|
||||
FastMutex::ScopedLock lock(_mutex);
|
||||
typename TMutex::ScopedLock lock(_mutex);
|
||||
doClear();
|
||||
}
|
||||
|
||||
std::size_t size()
|
||||
/// Returns the number of cached elements
|
||||
{
|
||||
FastMutex::ScopedLock lock(_mutex);
|
||||
typename TMutex::ScopedLock lock(_mutex);
|
||||
doReplace();
|
||||
return _data.size();
|
||||
}
|
||||
@@ -149,14 +149,14 @@ public:
|
||||
/// In some cases, i.e. expire based caching where for a long time no access to the cache happens,
|
||||
/// it might be desirable to be able to trigger cache replacement manually.
|
||||
{
|
||||
FastMutex::ScopedLock lock(_mutex);
|
||||
typename TMutex::ScopedLock lock(_mutex);
|
||||
doReplace();
|
||||
}
|
||||
|
||||
std::set<TKey> getAllKeys()
|
||||
/// Returns a copy of all keys stored in the cache
|
||||
{
|
||||
FastMutex::ScopedLock lock(_mutex);
|
||||
typename TMutex::ScopedLock lock(_mutex);
|
||||
doReplace();
|
||||
ConstIterator it = _data.begin();
|
||||
ConstIterator itEnd = _data.end();
|
||||
@@ -301,7 +301,7 @@ protected:
|
||||
|
||||
TStrategy _strategy;
|
||||
mutable DataHolder _data;
|
||||
mutable FastMutex _mutex;
|
||||
mutable TMutex _mutex;
|
||||
|
||||
private:
|
||||
AbstractCache(const AbstractCache& aCache);
|
||||
|
@@ -47,8 +47,13 @@
|
||||
namespace Poco {
|
||||
|
||||
|
||||
template <class TKey, class TValue>
|
||||
class AccessExpireCache: public AbstractCache<TKey, TValue, AccessExpireStrategy<TKey, TValue> >
|
||||
template <
|
||||
class TKey,
|
||||
class TValue,
|
||||
class TMutex = FastMutex,
|
||||
class TEventMutex = FastMutex
|
||||
>
|
||||
class AccessExpireCache: public AbstractCache<TKey, TValue, AccessExpireStrategy<TKey, TValue>, TMutex, TEventMutex >
|
||||
/// An AccessExpireCache caches entries for a fixed time period (per default 10 minutes).
|
||||
/// Entries expire when they are not accessed with get() during this time period. Each access resets
|
||||
/// the start time for expiration.
|
||||
|
@@ -51,9 +51,11 @@ namespace Poco {
|
||||
|
||||
template <
|
||||
class TKey,
|
||||
class TValue
|
||||
class TValue,
|
||||
class TMutex = FastMutex,
|
||||
class TEventMutex = FastMutex
|
||||
>
|
||||
class AccessExpireLRUCache: public AbstractCache<TKey, TValue, StrategyCollection<TKey, TValue> >
|
||||
class AccessExpireLRUCache: public AbstractCache<TKey, TValue, StrategyCollection<TKey, TValue>, TMutex, TEventMutex>
|
||||
/// An AccessExpireLRUCache combines LRU caching and time based expire caching.
|
||||
/// It cache entries for a fixed time period (per default 10 minutes)
|
||||
/// but also limits the size of the cache (per default: 1024).
|
||||
|
@@ -47,8 +47,13 @@
|
||||
namespace Poco {
|
||||
|
||||
|
||||
template <class TKey, class TValue>
|
||||
class ExpireCache: public AbstractCache<TKey, TValue, ExpireStrategy<TKey, TValue> >
|
||||
template <
|
||||
class TKey,
|
||||
class TValue,
|
||||
class TMutex = FastMutex,
|
||||
class TEventMutex = FastMutex
|
||||
>
|
||||
class ExpireCache: public AbstractCache<TKey, TValue, ExpireStrategy<TKey, TValue>, TMutex, TEventMutex >
|
||||
/// An ExpireCache caches entries for a fixed time period (per default 10 minutes).
|
||||
/// Entries expire independently of the access pattern, i.e. after a constant time.
|
||||
/// If you require your objects to expire after they were not accessed for a given time
|
||||
|
@@ -51,9 +51,11 @@ namespace Poco {
|
||||
|
||||
template <
|
||||
class TKey,
|
||||
class TValue
|
||||
class TValue,
|
||||
class TMutex = FastMutex,
|
||||
class TEventMutex = FastMutex
|
||||
>
|
||||
class ExpireLRUCache: public AbstractCache<TKey, TValue, StrategyCollection<TKey, TValue> >
|
||||
class ExpireLRUCache: public AbstractCache<TKey, TValue, StrategyCollection<TKey, TValue>, TMutex, TEventMutex >
|
||||
/// An ExpireLRUCache combines LRU caching and time based expire caching.
|
||||
/// It cache entries for a fixed time period (per default 10 minutes)
|
||||
/// but also limits the size of the cache (per default: 1024).
|
||||
|
@@ -47,8 +47,13 @@
|
||||
namespace Poco {
|
||||
|
||||
|
||||
template <class TKey, class TValue>
|
||||
class LRUCache: public AbstractCache<TKey, TValue, LRUStrategy<TKey, TValue> >
|
||||
template <
|
||||
class TKey,
|
||||
class TValue,
|
||||
class TMutex = FastMutex,
|
||||
class TEventMutex = FastMutex
|
||||
>
|
||||
class LRUCache: public AbstractCache<TKey, TValue, LRUStrategy<TKey, TValue>, TMutex, TEventMutex >
|
||||
/// An LRUCache implements Least Recently Used caching. The default size for a cache is 1024 entries
|
||||
{
|
||||
public:
|
||||
|
@@ -47,8 +47,13 @@
|
||||
namespace Poco {
|
||||
|
||||
|
||||
template <class TKey, class TValue>
|
||||
class UniqueAccessExpireCache: public AbstractCache<TKey, TValue, UniqueAccessExpireStrategy<TKey, TValue> >
|
||||
template <
|
||||
class TKey,
|
||||
class TValue,
|
||||
class TMutex = FastMutex,
|
||||
class TEventMutex = FastMutex
|
||||
>
|
||||
class UniqueAccessExpireCache: public AbstractCache<TKey, TValue, UniqueAccessExpireStrategy<TKey, TValue>, TMutex, TEventMutex >
|
||||
/// An UniqueAccessExpireCache caches entries for a given time span. In contrast
|
||||
/// to ExpireCache which only allows to set a per cache expiration value, it allows to define
|
||||
/// expiration per CacheEntry.
|
||||
|
@@ -51,9 +51,11 @@ namespace Poco {
|
||||
|
||||
template <
|
||||
class TKey,
|
||||
class TValue
|
||||
class TValue,
|
||||
class TMutex = FastMutex,
|
||||
class TEventMutex = FastMutex
|
||||
>
|
||||
class UniqueAccessExpireLRUCache: public AbstractCache<TKey, TValue, StrategyCollection<TKey, TValue> >
|
||||
class UniqueAccessExpireLRUCache: public AbstractCache<TKey, TValue, StrategyCollection<TKey, TValue>, TMutex, TEventMutex >
|
||||
/// A UniqueAccessExpireLRUCache combines LRU caching and time based per entry expire caching.
|
||||
/// One can define for each cache entry a seperate timepoint
|
||||
/// but also limit the size of the cache (per default: 1024).
|
||||
|
@@ -47,8 +47,13 @@
|
||||
namespace Poco {
|
||||
|
||||
|
||||
template <class TKey, class TValue>
|
||||
class UniqueExpireCache: public AbstractCache<TKey, TValue, UniqueExpireStrategy<TKey, TValue> >
|
||||
template <
|
||||
class TKey,
|
||||
class TValue,
|
||||
class TMutex = FastMutex,
|
||||
class TEventMutex = FastMutex
|
||||
>
|
||||
class UniqueExpireCache: public AbstractCache<TKey, TValue, UniqueExpireStrategy<TKey, TValue>, TMutex, TEventMutex >
|
||||
/// An UniqueExpireCache caches entries for a given time amount. In contrast
|
||||
/// to ExpireCache which only allows to set a per cache expiration value, it allows to define
|
||||
/// expiration per CacheEntry.
|
||||
|
@@ -51,9 +51,11 @@ namespace Poco {
|
||||
|
||||
template <
|
||||
class TKey,
|
||||
class TValue
|
||||
class TValue,
|
||||
class TMutex = FastMutex,
|
||||
class TEventMutex = FastMutex
|
||||
>
|
||||
class UniqueExpireLRUCache: public AbstractCache<TKey, TValue, StrategyCollection<TKey, TValue> >
|
||||
class UniqueExpireLRUCache: public AbstractCache<TKey, TValue, StrategyCollection<TKey, TValue>, TMutex, TEventMutex >
|
||||
/// A UniqueExpireLRUCache combines LRU caching and time based per entry expire caching.
|
||||
/// One can define for each cache entry a seperate timepoint
|
||||
/// but also limit the size of the cache (per default: 1024).
|
||||
|
Reference in New Issue
Block a user