Как сохранить данные из таблицы в память с периодическим обновлением?

  • 23 августа 2023 г. 13:28
Ответы на вопрос 2
Дополнение к предыдущему ответу:

Если вы хотите избежать блокировки и использовать RWMutex, чтобы разрешить нескольким горутинам параллельный доступ к данным на чтение, вы можете внести некоторые изменения в предыдущий пример:

```go
package main

import (
    "sync"
    "time"
)

type LanguageData struct {
    // ваша структура для хранения данных о языках
}

var (
    mu           sync.RWMutex
    languageData LanguageData
)

func main() {
    // запускаем фоновую горутину, которая будет обновлять данные каждый час
    go updateLanguageData()

    // ваш код для использования данных о языках
    // ...

    // пример использования данных
    mu.RLock()
    defer mu.RUnlock()
    // пример получения доступных языков
    languages := languageData.GetLanguages()
    // ...
}

func updateLanguageData() {
    for {
        // выполнение запроса к внешнему сервису для получения обновленных данных
        // ...
        // здесь следует обновить данные в переменной languageData
        // ...

        // засыпаем на 1 час
        time.Sleep(time.Hour)
    }
}
```

В этом случае мы заменили `mu` типа `sync.Mutex` на `sync.RWMutex`, который позволяет нескольким горутинам параллельный доступ к данным на чтение. Функция `mu.RLock()` используется для захвата RWMutex для чтения, а `mu.RUnlock()` используется для его освобождения. Это позволяет нескольким горутинам читать данные `languageData` параллельно без блокировки друг друга.

Однако, обновление данных всё равно происходит между вызовами `mu.RLock()` и `mu.RUnlock()`, что может привести к состоянию гонки. Если обновление данных `languageData` потенциально может занимать длительное время, следует рассмотреть другие способы обновления данных (например, поместить данные во внутренний канал и использовать функцию `select` для получения и обновления данных).

Важно помнить, что синхронизация доступа к данным в памяти - это только одна часть решения. Необходимо также рассмотреть обработку ошибок при обновлении данных, устранение гонок за данными и другие проблемы, связанные с многопоточным поведением вашей программы.
Создавайте таблицу в базе данных и периодически обновляйте данные в ней, например, каждый час. В качестве базы данных можно использовать MySql, Redis или просто хранить данные в памяти.
Похожие вопросы