I think what you are asking is "Storing a single key whose value is stringified array" vs "Storing multiple keys where value of each one is an object"?
The first option is great if most of the times you access all the messages in the array. This is also good if you need all/most properties of the objects in each access.
In this case you have multiple keys whose values are hashes and then you track all the keys in a SET.
HMSET message:{id} message "message" to_send 2
SADD messages {id}
The major advantage is that you don't have to parse JSON anymore. Each key represents a Redis Hash. The disadvantage is that you can't do this if your objects have deep nesting. Another drawback is that if you need to access all the messages and all the properties in them it may be slower.
So, the bottomline is choose the method which involves less queries (depends on your use case).