Adicionar vs definir no Memcached


17

Não entendo a diferença entre ADD e SET Alguma pista? Parece que ADD inclui SET ou que ADD retorna false se algo estiver lá e SET apenas substitui. Obrigado!

Edição: Minha pergunta específica é: "Quando você usa adicionar em vez de definir ou definir em vez de adicionar?"

Respostas:


22

Você já tem a resposta para sua primeira pergunta: a intenção ADDé trabalhar apenas quando uma chave ainda não existe, enquanto SETexiste para atualizar o valor, independentemente de ela já existir. Se você conhece o SQL, é (aproximadamente) a diferença entre as INSERTconsultas ( ADD) e UPDATE( SET).

Em relação à sua pergunta do adendo, você usaria o que melhor se adequar ao seu objetivo. Eu diria que essa SETseria a operação mais comum, porque é mais comum que você queira apenas dizer "Eu quero que a chave footenha o valor bare não me importo se ela já existe ou não". No entanto, haveria ocasiões (menos frequentes) em que seria necessário saber que uma chave ainda não está no cache.

Um exemplo que vem à mente quando ADDseria apropriado é armazenar sessões no memcache (o que, a propósito, eu não recomendo) - se você estiver gerando seus IDs de sessão aleatoriamente (ou via hash), não deseja para criar uma nova sessão com a mesma chave que uma existente, pois isso concederia a um usuário acesso aos dados de outro usuário. Nesse caso, ao criar a sessão, você usaria ADDe, se ela retornasse um status de falha, seria necessário gerar um novo ID da sessão e tentar novamente. A atualização da sessão, é claro, seria usada à SETmedida que o usuário avançasse em seu aplicativo.


1
Talvez eu esteja um pouco confuso aqui, mas na sua comparação com o SQL, se "add" for comparado a INSERT, "set" será comparado a REPLACE em vez de UPDATE.
Matteo

2
Daí o uso da palavra "aproximadamente". Se você quer ser realmente meticuloso, REPLACEnem é SQL ... é "a linguagem pouco inspirada em SQL que o MySQL entende" (sorrir)
womble

3

Além da resposta acima pela identificação do usuário 'womble', considere também os seguintes pontos:

  1. Possibilidade de uma condição de corrida com 'set' em oposição a 'add'. Veja abaixo o link para uma resposta de Nick Johnson: /programming/13234556/using-memcache-add-instead-of-set

  2. Se você sabe que 'add' serve, não use 'set'. Isso evita o envio de dados pela rede, pois são chamadas RPC . E praticamente todo o tempo é consumido pelo tráfego da rede, em vez de procurar o par de valores-chave no memcache. Portanto, se você puder evitar o melhor tráfego de rede, nesse caso, o tempo de resposta será mais rápido.


Consulte Appstats ( https://developers.google.com/appengine/docs/python/tools/appstats (do Google)) e para entender o ponto 2 acima, mais, assista a http://www.youtube.com/watch ? v = bvp7CuBWVgA de Guido Van Rossum (@Google)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.