Created
January 2, 2020 03:24
-
-
Save spdrman/02a9bd0d0fa3dd55a004b1ee5b8349d5 to your computer and use it in GitHub Desktop.
golang pattern for database access with cache layer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
type Store interface { | |
GetFollowers(userID string) ([]models.User, error) | |
} | |
type DatabaseStore struct { | |
// wrap sql connection | |
// or any other driver that your database needs | |
} | |
func (s *DatabaseStore) GetFollowers(userID string) ([]models.User, error) { | |
// get users from db | |
// can be any db, e.g. PostgreSQL, CouchDB, MongoDB | |
return users, nil | |
} | |
type CacheStore struct { | |
// embed any other store | |
// this also makes unimplemented store methods just pass through | |
Store | |
// cache internals | |
} | |
func (s *CacheStore) GetFollowers(userID string) ([]models.User, error) { | |
// return user from cache if it's there | |
// if not, get from underlying store | |
user, err = s.Store.GetFollowers(userID) | |
// error check | |
// add user to cache | |
return users, nil | |
} | |
// easily instantiate any configuration you need | |
store := CacheStore{DatabaseStore{DB: db}} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment