Interface KVStore
-
- All Known Subinterfaces:
AtomicKVStore
,CloseableKVStore
,KVTransaction
,ReadTracking
- All Known Implementing Classes:
AbstractKVStore
,ArrayKVStore
,ArrayKVTransaction
,AtomicArrayKVStore
,AtomicKVDatabase
,BerkeleyKVTransaction
,ByteArrayLMDBKVStore
,ByteArrayLMDBKVTransaction
,CachingKVStore
,CachingKVTransaction
,CloseableForwardingKVStore
,FallbackKVTransaction
,ForwardingKVStore
,FoundationKVStore
,FoundationKVTransaction
,LevelDBAtomicKVStore
,LevelDBKVStore
,LevelDBKVTransaction
,LMDBKVStore
,LMDBKVTransaction
,MutableView
,MVMapKVStore
,MVMapSnapshot
,MVStoreAtomicKVStore
,MVStoreKVTransaction
,NavigableMapKVStore
,PrefixKVStore
,PrefixKVTransaction
,RaftKVTransaction
,ReadOnlySpannerView
,ReadWriteSpannerView
,RocksDBAtomicKVStore
,RocksDBKVStore
,RocksDBKVTransaction
,SimpleKVTransaction
,SnapshotKVTransaction
,SnapshotLevelDBKVStore
,SnapshotRocksDBKVStore
,SpannerKVTransaction
,SQLKVTransaction
,UnmodifiableKVStore
,XMLKVTransaction
,XodusKVStore
,XodusKVTransaction
public interface KVStore
General API into a key/value store where the keys are sorted lexicographically as unsigned bytes.Implementations are not required to support accessing keys that start with
0xff
, and if not may throwIllegalArgumentException
if such keys are accessed.Thread Safety
Instances must be thread safe, with the exception of the
Iterator
returned bygetRange()
.Lock-free Counters
Implementations are encouraged to include support for encoding a 64 bit counter in a key/value pair such that the counter can be efficiently adjusted by concurrent transactions without conflict. In practice this means no locking is required to increment or decrement the counter by some amount, as long as it's not necessary to actually directly read or write the counter value in the same transaction. Whether counter adjustments are actually lock-free is implementation dependent, however, the counter methods
encodeCounter()
,decodeCounter()
, andadjustCounter()
must function correctly as specified in all cases.How counters are encoded is specific to the implementation. Clients needing to read or write counter values directly should use
decodeCounter()
andencodeCounter()
, respectively. Counters are removed using the normal methods (i.e.,remove()
andremoveRange()
).
-
-
Method Summary
All Methods Instance Methods Abstract Methods Default Methods Modifier and Type Method Description void
adjustCounter(byte[] key, long amount)
Adjust the counter at the given key by the given amount.default void
apply(Mutations mutations)
Apply all the givenMutations
to this instance.long
decodeCounter(byte[] value)
Decode a counter value previously encoded byencodeCounter()
.byte[]
encodeCounter(long value)
Encode a counter value into abyte[]
value suitable for use withdecodeCounter()
and/oradjustCounter()
.byte[]
get(byte[] key)
Get the value associated with the given key, if any.KVPair
getAtLeast(byte[] minKey, byte[] maxKey)
Get the key/value pair having the smallest key greater than or equal to the given minimum, if any.KVPair
getAtMost(byte[] maxKey, byte[] minKey)
Get the key/value pair having the largest key strictly less than the given maximum, if any.default CloseableIterator<KVPair>
getRange(byte[] minKey, byte[] maxKey)
Iterate the key/value pairs in the specified range in the forward direction.CloseableIterator<KVPair>
getRange(byte[] minKey, byte[] maxKey, boolean reverse)
Iterate the key/value pairs in the specified range.default CloseableIterator<KVPair>
getRange(KeyRange range)
Iterate the key/value pairs in the specified range in the forward direction.void
put(byte[] key, byte[] value)
Set the value associated with the given key.void
remove(byte[] key)
Remove the key/value pair with the given key, if it exists.void
removeRange(byte[] minKey, byte[] maxKey)
Remove all key/value pairs whose keys are in a given range.default void
removeRange(KeyRange range)
Remove all key/value pairs whose keys are in a given range.
-
-
-
Method Detail
-
get
byte[] get(byte[] key)
Get the value associated with the given key, if any.Modifications to the returned
byte[]
array do not affect this instance.- Parameters:
key
- key- Returns:
- value associated with key, or null if not found
- Throws:
IllegalArgumentException
- ifkey
starts with0xff
and such keys are not supportedStaleTransactionException
- if an underlying transaction is no longer usableRetryTransactionException
- if an underlying transaction must be retried and is no longer usableNullPointerException
- ifkey
is null
-
getAtLeast
KVPair getAtLeast(byte[] minKey, byte[] maxKey)
Get the key/value pair having the smallest key greater than or equal to the given minimum, if any.An optional (exclusive) maximum key may also be specified; if
maxKey
is null, there is no upper bound; ifmaxKey <= minKey
, null is always returned.If keys starting with
0xff
are not supported by this instance, andminKey
starts with0xff
, then this method returns null.Modifications to the returned
byte[]
arrays do not affect this instance.- Parameters:
minKey
- minimum key (inclusive), or null for no minimum (get the smallest key)maxKey
- maximum key (exclusive), or null for no maximum (no upper bound)- Returns:
- smallest key/value pair with
key >= minKey
andkey < maxKey
, or null if none exists - Throws:
StaleTransactionException
- if an underlying transaction is no longer usableRetryTransactionException
- if an underlying transaction must be retried and is no longer usable
-
getAtMost
KVPair getAtMost(byte[] maxKey, byte[] minKey)
Get the key/value pair having the largest key strictly less than the given maximum, if any.An optional (inclusive) minimum key may also be specified; if
minKey
is null, there is no lower bound (equivalent to a lower bound of the empty byte array); ifminKey >= maxKey
, null is always returned.If keys starting with
0xff
are not supported by this instance, andmaxKey
starts with0xff
, then this method behaves as ifmaxKey
were null.Modifications to the returned
byte[]
arrays do not affect this instance.- Parameters:
maxKey
- maximum key (exclusive), or null for no maximum (get the largest key)minKey
- minimum key (inclusive), or null for no minimum (no lower bound)- Returns:
- largest key/value pair with
key < maxKey
andkey >= minKey
, or null if none exists - Throws:
StaleTransactionException
- if an underlying transaction is no longer usableRetryTransactionException
- if an underlying transaction must be retried and is no longer usable
-
getRange
CloseableIterator<KVPair> getRange(byte[] minKey, byte[] maxKey, boolean reverse)
Iterate the key/value pairs in the specified range. The returnedIterator
'sremove()
method must be supported and should have the same effect as invokingremove()
on the corresponding key.If keys starting with
0xff
are not supported by this instance, andminKey
starts with0xff
, then this method returns an empty iteration.If keys starting with
0xff
are not supported by this instance, andmaxKey
starts with0xff
, then this method behaves as ifmaxKey
were null.The returned
Iterator
must not throwConcurrentModificationException
; however, whether or not a "live"Iterator
reflects any modifications made after its creation is implementation dependent. Implementations that do make post-creation updates visible in theIterator
, even if the update occurs after some delay, must preserve the order in which the modifications actually occurred.The returned
Iterator
itself is not guaranteed to be thread safe.Invokers of this method are encouraged to
close()
the returned iterators, though this is not required for correct behavior.Modifications to the returned
KVPair
key and valuebyte[]
arrays do not affect this instance.- Parameters:
minKey
- minimum key (inclusive), or null for no minimum (start at the smallest key)maxKey
- maximum key (exclusive), or null for no maximum (end at the largest key)reverse
- true to return key/value pairs in reverse order (i.e., keys descending)- Returns:
- iteration of key/value pairs in the range
minKey
(inclusive) tomaxKey
(exclusive) - Throws:
IllegalArgumentException
- ifminKey > maxKey
StaleTransactionException
- if an underlying transaction is no longer usableRetryTransactionException
- if an underlying transaction must be retried and is no longer usable
-
getRange
default CloseableIterator<KVPair> getRange(byte[] minKey, byte[] maxKey)
Iterate the key/value pairs in the specified range in the forward direction.This is a convenience method, equivalent to:
getRange
(minKey, maxKey, false)
.- Parameters:
minKey
- minimum key (inclusive), or null for no minimum (start at the smallest key)maxKey
- maximum key (exclusive), or null for no maximum (end at the largest key)- Returns:
- iteration of key/value pairs in the range
minKey
(inclusive) tomaxKey
(exclusive) - Throws:
IllegalArgumentException
- ifminKey > maxKey
StaleTransactionException
- if an underlying transaction is no longer usableRetryTransactionException
- if an underlying transaction must be retried and is no longer usable
-
getRange
default CloseableIterator<KVPair> getRange(KeyRange range)
Iterate the key/value pairs in the specified range in the forward direction.This is a convenience method, equivalent to:
getRange
(range.getMin(), range.getMax(), false)
.- Parameters:
range
- range of keys to iterate- Returns:
- iteration of key/value pairs in
range
- Throws:
StaleTransactionException
- if an underlying transaction is no longer usableRetryTransactionException
- if an underlying transaction must be retried and is no longer usableIllegalArgumentException
- ifrange
is null
-
put
void put(byte[] key, byte[] value)
Set the value associated with the given key.- Parameters:
key
- keyvalue
- value- Throws:
IllegalArgumentException
- ifkey
starts with0xff
and such keys are not supportedStaleTransactionException
- if an underlying transaction is no longer usableRetryTransactionException
- if an underlying transaction must be retried and is no longer usableNullPointerException
- ifkey
orvalue
is null
-
remove
void remove(byte[] key)
Remove the key/value pair with the given key, if it exists.- Parameters:
key
- key- Throws:
IllegalArgumentException
- ifkey
starts with0xff
and such keys are not supportedStaleTransactionException
- if an underlying transaction is no longer usableRetryTransactionException
- if an underlying transaction must be retried and is no longer usableNullPointerException
- ifkey
is null
-
removeRange
void removeRange(byte[] minKey, byte[] maxKey)
Remove all key/value pairs whose keys are in a given range.The
minKey
must be less than or equal tomaxKey
; if they equal (and not null) then nothing happens; if they are both null then all entries are deleted.If keys starting with
0xff
are not supported by this instance, then:- If
minKey
starts with0xff
, then no change occurs - If
maxKey
starts with0xff
, then this method behaves as ifmaxKey
were null
- Parameters:
minKey
- minimum key (inclusive), or null for no minimummaxKey
- maximum key (exclusive), or null for no maximum- Throws:
IllegalArgumentException
- ifminKey > maxKey
StaleTransactionException
- if an underlying transaction is no longer usableRetryTransactionException
- if an underlying transaction must be retried and is no longer usable
- If
-
removeRange
default void removeRange(KeyRange range)
Remove all key/value pairs whose keys are in a given range.Equivalent to:
removeRange
(range.getMin(), range.getMax())
.- Parameters:
range
- range to remove- Throws:
IllegalArgumentException
- ifrange
is nullStaleTransactionException
- if an underlying transaction is no longer usableRetryTransactionException
- if an underlying transaction must be retried and is no longer usable
-
encodeCounter
byte[] encodeCounter(long value)
Encode a counter value into abyte[]
value suitable for use withdecodeCounter()
and/oradjustCounter()
.- Parameters:
value
- desired counter value- Returns:
- encoded counter value
- Throws:
StaleTransactionException
- if an underlying transaction is no longer usableRetryTransactionException
- if an underlying transaction must be retried and is no longer usable
-
decodeCounter
long decodeCounter(byte[] value)
Decode a counter value previously encoded byencodeCounter()
.- Parameters:
value
- encoded counter value- Returns:
- decoded counter value
- Throws:
IllegalArgumentException
- ifvalue
is not a valid counter valueStaleTransactionException
- if an underlying transaction is no longer usableRetryTransactionException
- if an underlying transaction must be retried and is no longer usableNullPointerException
- ifvalue
is null
-
adjustCounter
void adjustCounter(byte[] key, long amount)
Adjust the counter at the given key by the given amount.Ideally this operation should behave in a lock-free manner, so that concurrent transactions can invoke it without conflict. However, when lock-free behavior occurs (if at all) depends on the implementation.
If there is no value associated with
key
, orkey
's value is not a valid counter encoding as would be acceptable todecodeCounter()
, then how this operation affectskey
's value is undefined.- Parameters:
key
- keyamount
- amount to adjust counter value by- Throws:
StaleTransactionException
- if an underlying transaction is no longer usableRetryTransactionException
- if an underlying transaction must be retried and is no longer usableNullPointerException
- ifkey
is null
-
apply
default void apply(Mutations mutations)
Apply all the givenMutations
to this instance.Mutations are always to be applied in this order: removes, puts, counter adjustments.
The implementation in
KVStore
simply iterates over the individual changes and applies them viaremove()
(for removals of a single key),removeRange()
,put()
, and/oradjustCounter()
. Implementations that can process batch updates more efficiently are encouraged to override this method.- Parameters:
mutations
- mutations to apply- Throws:
IllegalArgumentException
- ifmutations
is nullUnsupportedOperationException
- if this instance is immutable
-
-