@Kagtaviy

Как правильно использовать автоинкремент?

Здравствуйте, не могу понять как правильно использовать incr в redis.
Мне нужно создать пост, у каждого поста есть уникальный id, заголовок, описание.
При создание нового поста нужно присваивать уникальный id, я понял что это делается через incr, но не могу понять как правильно применить это на практике?
Заранее спасибо.
  • Вопрос задан
  • 969 просмотров
Решения вопроса 1
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
INCR можно делать на стороне redis (предполагается клиент https://github.com/garyburd/redigo, как самый популярный)
conn, err := redis.DialURL(YourRedisUrl, yourOptions)
var ID int64
ID=redis.Int64(conn.Do("INCR", "IDcounter"))
или на стороне Go сервера
ID=atomic.AddInt64(&ID, 1)
потом что нибудь вроде
_, err := conn.Do("HMSET", redis.Args{}.Add(ID).AddFlat(&NewPost)...)
Как будет представлен NewPost на стороне Go и на стороне redis вы не описали, поэтому предполагается struct и hash соответственно. ID реализован просто как redis key, а не поле записи, что упрощает индексирование и поиск. Замысел всех плясок с INCR (или sync.atomic.AddInt64() на стороне Go) в том что бы добиться безопасности и консистентности при конкурентном доступе многих goroutine. Если вы будете создавать посты только в одном потоке то ID++ вполне достаточно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@rare
а вы используете редис как основное хранилище? не надо так. лучше создать новый пост в бд и закешировать его в редисе, новый id для вас сгенерит субд (вы же хотите автоинкремент?). А incr нужен для другого, например, чтобы атомарно увеличить значение часто меняющегося счетчика.

UPD: Если вы все же хотите использовать редис как основное хранилище, заведите в нем ключ last_id и каждому новому посту присваивайте id = incr(last_id)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
25 нояб. 2024, в 18:39
30000 руб./за проект
25 нояб. 2024, в 18:35
30000 руб./за проект
25 нояб. 2024, в 18:33
10000 руб./за проект