Вместо использования SET для хранения userQuestionsSet
и questionBank
, вы можете использовать растровое изображение (Redis STRING) для хранения этих двух наборов. Затем вы можете использовать BITOP
, чтобы эффективно получить разницу между двумя растровыми изображениями.
ОБНОВЛЕНИЕ
Прежде всего, вам нужно дать каждому вопросу уникальный номер , Затем используйте растровое изображение для хранения userQuestionsSet
и questionBank
. Скажем, у вас есть следующие вопросы в банке: 1: вопрос1 , 2: вопрос2 , 3: вопрос3 , 4: вопрос4 , 5: вопрос5 . И пользователь уже просмотрел question3 :
// initialize question bank: 00111110
SETBIT question-bank 1 1
SETBIT question-bank 2 1
...
SETBIT question-bank 5 1
// user has viewed question3: 00001000
SETBIT user 3 1
Получите разницу между банком вопросов и просматриваемыми пользователем вопросами:
// XOR to get the difference: 00111110 XOR 00001000
BITOP XOR result question-bank user
// 00110110
// questions not viewed: 1, 2, 4, 5
GET result
Когда вы получаете двоичную строку, хранящуюся в В результате вы можете отсканировать строку и произвольно получить 10 вопросов для пользователя.
NOTE
Вы должны быть осторожны, так как SETBIT
может быть дорогой операцией, и вам лучше заранее выделить память для этих растровых изображений. Подробности см. В разделе ПРЕДУПРЕЖДЕНИЕ do c.