Распределённая многоуровневая схема кэширования g2cache
Описание архитектуры программного обеспечения
Основные моменты:
Модуль | Функционал | Характеристики | Внимание |
---|---|---|---|
Локальный интерфейс | Быстрое кэширование в оперативной памяти | Ответы на уровне наносекунд и миллисекунд; короткий срок годности | Реализует интерфейс LocalCache, следует контролировать использование памяти |
Внешний интерфейс | Внешнее быстрое кэширование, например Redis | Быстрая скорость доступа, достаточное количество места | Реализует интерфейс OutCache |
LoadDataSourceFunc | Внешние источники данных | Внешняя функция загрузки, гибкость, защита от параллелизма | Необходимо самостоятельно обрабатывать panic |
PubSub | Внешнее кэширование публикаций/подписок | Внешнее кэширование может быть реализовано по выбору | Поддерживается только при наличии реализации |
локальный интерфейс быстрого кэширования в оперативной памяти
// Локальное кэширование в оперативной памяти с высокой скоростью доступа
type LocalCache interface {
Get(key string, obj interface{}) (*Entry, bool, error) // obj представляет внутреннюю структуру реального объекта
Set(key string, e *Entry) error // локальное хранилище должно устанавливать Entry.Obsolete
Del(key string) error
ThreadSafe() // Нужно обеспечивать потокобезопасность
Close()
}
```внешний интерфейс внешнего кэша, стоит отметить, что внешнему кэшу требуется реализовать интерфейс публикаций/подписок, так как g2cache поддерживает распределённое многоуровневое кэширование
```go
// Внешнее кэширование имеет более высокую скорость доступа, например Redis
type OutCache interface {
Get(key string, obj interface{}) (*Entry, bool, error) // obj представляет внутреннюю структуру реального объекта
Set(key string, e *Entry) error // внешнее хранилище должно устанавливать Entry.Expiration
Subscribe(data chan *ChannelMeta) error
Publish(gid string, key string, action int8, data *Entry) error
Del(key string) error
ThreadSafe() // Нужно обеспечивать потокобезопасность
Close()
}
внешнее кэширование публикаций/подписок
// Только внешнее хранилище публикаций/подписок
type PubSub interface {
Subscribe(data chan *ChannelMeta) error
Publish(gid string, key string, action int8, data *Entry) error
}
функция загрузки исходных данных LoadDataSourceFunc
, пожалуйста, обрабатывайте panic
самостоятельно и возвращайте её в виде ошибки
Функция загрузки поддерживает возврат типов string
, map
, slice
, struct
, ptr
// Не бросайте panic, пожалуйста, верните ошибку
type LoadDataSourceFunc func() (interface{}, error)
``````Кэш-эффект - начальный
```markdown
[G2CACHE] 2021/04/21 11:46:21 [traceback] ключ:[['g2cache-key:61']] => [ данные из источника ]
[G2CACHE] 2021/04/21 11:46:21 [traceback] ключ:[['g2cache-key:222']] => [ данные из источника ]
[G2CACHE] 2021/04/21 11:46:21 [traceback] ключ:[['g2cache-key:61']] => [ данные из локального хранилища ]
[G2CACHE] 2021/04/21 11:46:21 [traceback] ключ:[['g2cache-key:183']] => [ данные из источника ]
[G2CACHE] 2021/04/21 11:46:22 [traceback] ключ:[['g2cache-key:83']] => [ данные из источника ]
[G2CACHE] 2021/04/21 11:46:22 [traceback] ключ:[['g2cache-key:18']] => [ данные из источника ]
[G2CACHE] 2021/04/21 11:46:22 [traceback] ключ:[['g2cache-key:103']] => [ данные из локального хранилища ]
[G2CACHE] 2021/04/21 11:46:22 [traceback] ключ:[['g2cache-key:90']] => [ данные из источника ]
[G2CACHE] 2021/04/21 11:46:22 [traceback] ключ:[['g2cache-key:170']] => [ данные из источника ]
[G2CACHE] 2021/04/21 11:46:22 [traceback] ключ:[['g2cache-key:101']] => [ данные из источника ]
[G2CACHE] 2021/04/21 11:46:22 [traceback] ключ:[['g2cache-key:165']] => [ данные из источника ]
[G2CACHE] 2021/04/21 11:46:23 [traceback] статистика [локальное] процент попаданий [[5. 8824]]
[G2CACHE] 2021/04/21 11:46:23 [traceback] статистика [внешнее] процент попаданий [[1. 9608]]
[G2CACHE] 2021/04/21 11:46:23 [traceback] статистика [источник данных] процент попаданий [[90. 1961]]
Кэш-эффект - N минут позже
[G2CACHE] 2021/04/21 12:26:53 [traceback] ключ:[['g2cache-key:106']] => [ данные из внешнего хранилища ]
[G2CACHE] 2021/04/21 12:26:53 [traceback] ключ:[['g2cache-key:136']] => [ данные из источника ]
[G2CACHE] 2021/04/21 12:26:53 [traceback] ключ:[['g2cache-key:100']] => [ данные из локального хранилища ]
[G2CACHE] 2021/04/21 12:26:53 [traceback] ключ:[['g2cache-key:219']] => [ данные из источника ]
```[G2CACHE] 2021/04/21 12:26:53 [traceback] ключ:[['g2cache-key:13']] => [данные из локального хранилища]
[G2CACHE] 2021/04/21 12:26:53 [traceback] ключ:[['g2cache-key:200']] => [данные из локального хранилища]
[G2CACHE] 2021/04/21 12:26:53 [traceback] ключ:[['g2cache-key:172']] => [данные из источника]
[G2CACHE] 2021/04/21 12:26:53 [traceback] статистика [локальное] процент попаданий [[45. 3865]]
[G2CACHE] 2021/04/21 12:26:53 [traceback] статистика [внешнее] процент попаданий [[6. 7332]]
[G2CACHE] 2021/04/21 12:26:53 [traceback] статистика [источник данных] процент попаданий [[48. 1297]] Кэш-эффект — N+M минут после
```markdown
[G2CACHE] 2021/04/21 13:18:53 [debug] ключ:[['g2cache-key:2']] => [попадание в локальное хранилище]
[G2CACHE] 2021/04/21 13:18:53 [debug] ключ:[['g2cache-key:2']] => [попадание во внешнее хранилище]
[G2CACHE] 2021/04/21 13:18:53 [debug] ключ:[['g2cache-key:113']] => [попадание в локальное хранилище]
[G2CACHE] 2021/04/21 13:18:53 [debug] ключ:[['g2cache-key:113']] => [попадание во внешнее хранилище]
[G2CACHE] 2021/04/21 13:18:53 [debug] ключ:[['g2cache-key:43']] => [попадание в локальное хранилище]
[G2CACHE] 2021/04/21 13:18:53 [debug] ключ:[['g2cache-key:43']] => [попадание во внешнее хранилище]
[G2CACHE] 2021/04/21 13:18:53 [debug] статистика [локальное] процент попаданий [[82. 3877]]
[G2CACHE] 2021/04/21 13:18:53 [debug] статистика [внешнее] процент попаданий [[16. 2689]]
[G2CACHE] 2021/04/21 13:18:53 [debug] статистика [источник данных] процент попаданий [[1. 3641]]
```### Пример использования
`go get -u gitee.com/kelvins-io/g2cache@v4.0.5`
#### Моделирование тестирования
Измените конфигурацию Redis в `example/main.go`, запустите `sh example-run.sh`.
#### Описание веток
1. Ветка `copyobj` поддерживает возврат конкретного объекта, это незавершённая версия.
2. Ветка `dev` возвращает сериализованное значение объекта Get, переходная версия.
3. Ветка `master` предоставляет только локальную реализацию sync.Map, ранняя версия.
4. Ветка `release` предоставляет выпускную версию, имеет значительные отличия от `copyobj`.
#### Участие в проекте
1. Создайте форк этого репозитория.
2. Создайте новую ветку `Feat_xxx`.
3. Добавьте изменения.
4. Создайте pull request.
#### Общение и сотрудничество
QQ группа:
[](https://gitee.com/kelvins-io)
Электронная почта:
1225807605@qq.com
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )