Я пытаюсь использовать spymemcached 2.6 с синхронизацией при обновлении и нашел два следующих способа его использования:
используя CASMutation, определяющий CASMutator, который является довольно инвазивным способом его реализации, давайте посмотрим на пример:
public List<Item> addAnItem(final Item newItem) throws Exception { // This is how we modify a list when we find one in the cache. CASMutation<List<Item>> mutation = new CASMutation<List<Item>>() { // This is only invoked when a value actually exists. public List<Item> getNewValue(List<Item> current) { // Not strictly necessary if you specify the storage as // LinkedList (our initial value isn't), but I like to keep // things functional anyway, so I'm going to copy this list // first. LinkedList<Item> ll = new LinkedList<Item>(current); // If the list is already "full", pop one off the end. if(ll.size() > 10) { ll.removeLast(); } // Add mine first. ll.addFirst(newItem); return ll; } }; // The initial value -- only used when there's no list stored under // the key. List<Item> initialValue=Collections.singletonList(newItem); // The mutator who'll do all the low-level stuff. CASMutator<List<Item>> mutator = new CASMutator<List<Item>>(client, transcoder); // This returns whatever value was successfully stored within the // cache -- either the initial list as above, or a mutated existing // one return mutator.cas("myKey", initialValue, 0, mutation); }
или с помощью метода cas
cas(String key, long casId, Object value)
после того, как сделал:
gets(String key, Transcoder<T> tc)
Второй действительно более простой, и я понимаю, почему я буду использовать CASMutation... Мне было бы очень приятно получить отзывы об использовании этого клиента кушетки.