You could do some optimization, but don't expect too much of it. Each member has an overhead of about 64 bytes on top of the data itself (member-key + the score/float).
So the minimum memory size (without data) would already be around 0.77GB.
See this good answer by Didier Spazia: Redis 10x more memory usage than data
To do your optimization, you can use client-side hashing and/or client-side compression.
About your data design:
The sets have a unix timestamp as the key and a MongoId as a value.
Not quite sure what you mean here. The key
is the correct term for the entire sorted set. What is your member score, and what is your member string? Do you rely on sorting by score? And, also on the lexicographical sorting by string? If both: not much you can do, except for maybe shortening the strings / tokens within the string. You can combine this with serializing your data using the MsgPack format. This is useful if you have numbers inside the string, which use far less bytes when serialized as MsgPack. If you use arrays (and not a serialized dict), you can again safe some space. With ints/floats, make sure your endianness matches the desired sorting though, when you use MsgPack in the member string and you need the lexicographical sorting characteristics of sorted sets.
Hope this helps, TW