PostgreSQL has the ability to 'register' to streams, so say when a table gets changed you get notified of the change via a pushed message to you, or a direct message can be sent to a stream from elsewhere, it is a classic case that Redis is used for, which is entirely useless if you have PostgreSQL (or heck, even Phoenix PubSub, except PostgreSQL streams can persist the data more easily ^.^).
Creating a database is a hard, and I do mean HARD problem, do it for the learning opportunity, but not for an end task. ^.^
I have each node cache it's own data. Whenever I change, say, permissions of a user I broadcast a message to a Phoenix.PubSub that clears the account permission cache 'now' and so forth. PostgreSQL used as a cache would already be multi-node anyway. ^.^
Also, if the in-memory cache is not shared per node then there is some outside communication, like PostgreSQL/Redis, which kind of defeats the point of the uber-fast-in-memory lookup speeds anyway. Do not worry about duplicating cache data, just use Phoenix.PubSub to send message to synchronize clearing and/or updating them.