В настоящее время я использую хранилище ключей для этой цели (memcachedb). что вы можете сделать, это добавить ключ, такой как 'messageread_ {message.id} _ {user.id}', установленный на любое выбранное вами значение (я просто использую int 1), а затем использовать клиент memcached, чтобы сделать getmulti для всех сообщения, которые есть у пользователя (в виде массива ключей, опубликованного выше). любой возвращаемый ключ читается:)
Я использую этот метод с 60-секундным кешем самого запроса, чтобы дать пользователям непрочитанное количество сообщений с отличными результатами.
http://memcachedb.org/
Первоначально я использовал проверку наивысшего типа идентификатора и вскоре после этого переключился на многоуровневую систему комментариев, что сделало спор с наивысшим идентификатором в этом контексте (так как вы могли в конечном итоге увидеть комментарий и пропустить тот, который является ответом). до сих пор этот метод был очень быстрым.
чтобы сделать что-то подобное, вам нужно установить клиент memcache или memcached из pecl здесь http://pecl.php.net/package/memcache и здесь http://pecl.php.net/package/memcached соответственно. выполните установку memcachedb (потребуется окно с доступом к оболочке) и запустите службу.
клиентский псевдокод будет работать примерно так:
// получать сообщения, частью которых является пользователь
код ...
// построить массив ключей memcachedb из этого списка, установить ключ в message_id для ссылки позже
$keys = array();
foreach($mresult as $current){
$keys[$current['message_id']] = 'messageread_'.$current['message_id'].'_'.$myid;
}
// используя php-клиент memcached
$result = $memcacheobj->getMulti($keys);
getmulti возвращает ассоциативный массив в структуре 'memcachekey' => 'memcachevalue'
// зациклить результат, удалив найденные результаты из ключей
foreach($keys as $key => $val){
if(isset($result[$val])) unset($keys[$key]);
}
// очистка для получения массива непрочитанных сообщений, переворачивание массива для установки значений в message_id, сброс ключей массива с помощью array_values (необязательно)
$unread = array_values(array_flip($keys));
теперь у вас есть массив непрочитанных сообщений в структуре:
массив (
0 => 12,
1 => 23,
так далее...
)
это всего лишь грубый макет процесса, я уверен, что некоторая очистка может быть сделана, чтобы оптимизировать это:)