the-algorithm/tweetypie/common/src/scala/com/twitter/tweetypie/caching/ValueSerializer.scala

48 lines
1.8 KiB
Scala

package com.twitter.tweetypie.caching
import com.twitter.io.Buf
import com.twitter.util.Time
/**
* How to store values of type V in cache. This includes whether a
* given value is cacheable, how to serialize it, when it should
* expire from cache, and how to interpret byte patterns from cache.
*/
trait ValueSerializer[V] {
/**
* Prepare the value for storage in cache. When a [[Some]] is
* returned, the [[Buf]] should be a valid input to [[deserialize]]
* and the [[Time]] will be used as the expiry in the memcached
* command. When [[None]] is returned, it indicates that the value
* cannot or should not be written back to cache.
*
* The most common use case for returning None is caching Try
* values, where certain exceptional values encode a cacheable state
* of a value. In particular, Throw(NotFound) is commonly used to
* encode a missing value, and we usually want to cache those
* negative lookups, but we don't want to cache e.g. a timeout
* exception.
*
* @return a pair of expiry time for this cache entry and the bytes
* to store in cache. If you do not want this value to explicitly
* expire, use Time.Top as the expiry.
*/
def serialize(value: V): Option[(Time, Buf)]
/**
* Deserialize a value found in cache. This function converts the
* bytes found in memcache to a [[CacheResult]]. In general, you
* probably want to return [[CacheResult.Fresh]] or
* [[CacheResult.Stale]], but you are free to return any of the
* range of [[CacheResult]]s, depending on the behavior that you
* want.
*
* This is a total function because in the common use case, the
* bytes stored in cache will be appropriate for the
* serializer. This method is free to throw any exception if the
* bytes are not valid.
*/
def deserialize(serializedValue: Buf): CacheResult[V]
}