Typically, I would save shopping cart data in the persistent storage.
Because I'm interested to be able to retrieve all shopping carts, even
incomplete ones, to run some data analysis.
However if you don't care about incomplete shopping cart and consider
them as transient data you can safely use the play cache. When you say
"the cache does not guarantee that data you request
are in there", that is not totally true... If you store some data in
cache with an unlimited (or large enough) TTL and you have enough
memory, then your data will always be there.
And if you ask, what happen if the cache don't have enough memory ?
Think that is exactly the same problem when you store your shopping
cart data in a Servlet session object ... If you don't have enough
memory in the JVM it will likely become problematic :)