2012-04-23 7 views
1

Я хочу установить некоторые ограничения записи в Redis, и я думал сохранить эти ограничения в хэшах.Наличие локального и удаленного клиента с Redis

Моя первоначальная идея состояла в том, чтобы изменить команды набора, чтобы они проверяли правила, прежде чем писать в Redis. Я думал, что таким образом проверка будет очень быстрой. Конечно, такой подход потребует больше изменений каждый раз, когда Redis будет изменен, и я нахожу немного хардкор, если вы думаете, что речь идет о школьном задании.

Вторая идея заключается в том, что существует 2 типа клиентов Redis. Один в стороне веб-приложения (может быть несколько экземпляров веб-приложения) и один на машине Redis. На основе этой идеи приходят мои вопросы.

  1. бы на 2 клиента (локальный и удаленный) увеличил производительность в comparisson 1 клиент, который сначала проверяют ограничения, а затем пишет в Redis? Или я должен придерживаться одного клиента, который делает все это (phpredis или predis, приложение находится на PHP, с некоторыми изменениями для проверки ограничений)?

  2. Если бы я мог попробовать 2 клиента, в которых язык программирования был бы лучше реализован локальным клиентом (C, Lua или другим)?

ответ

2

Вместо того, чтобы пытаться изменить поведение REDIS себя, я хотел бы попробовать первым реализовать ограничения на стороне сервера сценариев Lua (требуется Redis 2,6 филиал).

Сценарий Lua EVAL может легко выполнить некоторые проверки с данными, уже сохраненными в Redis, перед выполнением фактической операции записи.

Вот пример. Предположим, у нас есть два ключа, представляющих банковские счета, и нам нужно реализовать безопасную транзакцию между учетными записями. Например, мы должны проверить наличие обеих учетных записей, а исходная учетная запись содержит необходимые средства.

# set 2 accounts for John and Bob 
set account:john 100 
set account:bob 20 

# transfer $10 from John to Bob, checking all constraints 
eval "if redis.call('exists',KEYS[2])==1 and redis.call('get',KEYS[1])>=ARGV[1] then 
     redis.call('incrby', KEYS[2], ARGV[1]) 
     redis.call('incrby', KEYS[1], - ARGV[1]) 
     return 1 
     else 
     error('invalid transaction') 
     end" 2 account:john account:bob 10 

Вы найдете документацию о Redis возможности создания сценариев на: http://redis.io/commands#scripting (см команду EVAL первый).

Чтобы ответить на ваш первоначальный вопрос (и если вы не можете использовать Redis 2.6), локальный клиент слегка улучшит производительность, так как он сможет подключиться к Redis с помощью сокетов домена unix (в обход некоторых служебных служебных программ TCP) и сохранить некоторые сетевые обратные вызовы. Но это ценой дополнительной сложности.

+0

Я загрузил ветку 2.6, и я попробовал eval с простыми примерами и, похоже, сработал. Теперь мне нужно работать с реализацией моей проверки ограничений. Спасибо за быстрый ответ и простой пример! –

Смежные вопросы