2012-03-01 2 views
2

Я использую redis для отслеживания ежедневных просмотров для темы на доске объявлений, которую я создаю. У меня есть другое поле в предметной модели, которое хранит все временные представления для объекта.Итерация через отсортированный набор redis для обновления активной таблицы записей

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

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

Что является элегантным способом перебора всех членов в отсортированном списке и обновления их связанного (по ID) активного объекта записи?

Это, как я добавляю вид на тему:

def self.record_view(id) 
    REDIS.zincrby("views", 1, id) 
end 

Это, как я получаю количество просмотров на тему:

def views 
    REDIS.zscore("views", self.id).to_i 
end 

ответ

4

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

REDIS.zrange('views', 0, -1, withscores: true) 
# => an array, [key1, score1, key2, score2, ...] 

Вы также можете быть умными и использовать ZRANGE с ZCARD для получения данных партиями.

+0

Спасибо за это - было бы необходимо создать хеш, чтобы отличить ключи от баллов? – someoneinomaha

+0

Необходимо - нет. Элементы с четными индексами - это ключи, при нечетных индексах - баллы. Хотя, клиентская библиотека могла бы сделать лучшую работу и преобразовать ее в хэш или, по крайней мере, в массив массивов. –

+0

Еще раз спасибо за вашу помощь ... – someoneinomaha