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++
вполне достаточно.