cache.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file. See the AUTHORS file for names of contributors.
  4. //
  5. // A Cache is an interface that maps keys to values. It has internal
  6. // synchronization and may be safely accessed concurrently from
  7. // multiple threads. It may automatically evict entries to make room
  8. // for new entries. Values have a specified charge against the cache
  9. // capacity. For example, a cache where the values are variable
  10. // length strings, may use the length of the string as the charge for
  11. // the string.
  12. //
  13. // A builtin cache implementation with a least-recently-used eviction
  14. // policy is provided. Clients may use their own implementations if
  15. // they want something more sophisticated (like scan-resistance, a
  16. // custom eviction policy, variable cache sizing, etc.)
  17. #ifndef STORAGE_LEVELDB_INCLUDE_CACHE_H_
  18. #define STORAGE_LEVELDB_INCLUDE_CACHE_H_
  19. #include <stdint.h>
  20. #include "leveldb/export.h"
  21. #include "leveldb/slice.h"
  22. namespace leveldb {
  23. class LEVELDB_EXPORT Cache;
  24. // Create a new cache with a fixed size capacity. This implementation
  25. // of Cache uses a least-recently-used eviction policy.
  26. LEVELDB_EXPORT Cache* NewLRUCache(size_t capacity);
  27. class LEVELDB_EXPORT Cache {
  28. public:
  29. Cache() = default;
  30. Cache(const Cache&) = delete;
  31. Cache& operator=(const Cache&) = delete;
  32. // Destroys all existing entries by calling the "deleter"
  33. // function that was passed to the constructor.
  34. virtual ~Cache();
  35. // Opaque handle to an entry stored in the cache.
  36. struct Handle { };
  37. // Insert a mapping from key->value into the cache and assign it
  38. // the specified charge against the total cache capacity.
  39. //
  40. // Returns a handle that corresponds to the mapping. The caller
  41. // must call this->Release(handle) when the returned mapping is no
  42. // longer needed.
  43. //
  44. // When the inserted entry is no longer needed, the key and
  45. // value will be passed to "deleter".
  46. virtual Handle* Insert(const Slice& key, void* value, size_t charge,
  47. void (*deleter)(const Slice& key, void* value)) = 0;
  48. // If the cache has no mapping for "key", returns nullptr.
  49. //
  50. // Else return a handle that corresponds to the mapping. The caller
  51. // must call this->Release(handle) when the returned mapping is no
  52. // longer needed.
  53. virtual Handle* Lookup(const Slice& key) = 0;
  54. // Release a mapping returned by a previous Lookup().
  55. // REQUIRES: handle must not have been released yet.
  56. // REQUIRES: handle must have been returned by a method on *this.
  57. virtual void Release(Handle* handle) = 0;
  58. // Return the value encapsulated in a handle returned by a
  59. // successful Lookup().
  60. // REQUIRES: handle must not have been released yet.
  61. // REQUIRES: handle must have been returned by a method on *this.
  62. virtual void* Value(Handle* handle) = 0;
  63. // If the cache contains entry for key, erase it. Note that the
  64. // underlying entry will be kept around until all existing handles
  65. // to it have been released.
  66. virtual void Erase(const Slice& key) = 0;
  67. // Return a new numeric id. May be used by multiple clients who are
  68. // sharing the same cache to partition the key space. Typically the
  69. // client will allocate a new id at startup and prepend the id to
  70. // its cache keys.
  71. virtual uint64_t NewId() = 0;
  72. // Remove all cache entries that are not actively in use. Memory-constrained
  73. // applications may wish to call this method to reduce memory usage.
  74. // Default implementation of Prune() does nothing. Subclasses are strongly
  75. // encouraged to override the default implementation. A future release of
  76. // leveldb may change Prune() to a pure abstract method.
  77. virtual void Prune() {}
  78. // Return an estimate of the combined charges of all elements stored in the
  79. // cache.
  80. virtual size_t TotalCharge() const = 0;
  81. private:
  82. void LRU_Remove(Handle* e);
  83. void LRU_Append(Handle* e);
  84. void Unref(Handle* e);
  85. struct Rep;
  86. Rep* rep_;
  87. };
  88. } // namespace leveldb
  89. #endif // STORAGE_LEVELDB_INCLUDE_CACHE_H_