1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/kelvins-io-g2cache

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 9.8 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 11.03.2025 09:34 f130c24

g2cache

g2cache

Описание

Распределённая многоуровневая схема кэширования 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 группа:  
[![g2cache](g2cache_общение.jpg)](https://gitee.com/kelvins-io)

Электронная почта:
1225807605@qq.com

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/kelvins-io-g2cache.git
git@api.gitlife.ru:oschina-mirror/kelvins-io-g2cache.git
oschina-mirror
kelvins-io-g2cache
kelvins-io-g2cache
release