You can use W3TC or WP Supercache with fragment caching as seen in the following answers:
If you're using full page cache, obviously the user session variables will get tossed within the page render specifically. However, you can wrap your session bits in dynamic fragment tags as illustrated in the answers above and they should work just fine. You can also access your session information in hooks that precede the actual cache rendering if you need to do some sort of pre-processing for the dynamic bits.
Sourcing from @Rarst's answer here for W3TC:
<!-- mfunc any PHP code --><!-- /mfunc -->
<!-- mfunc -->any PHP code<!-- /mfunc -->
<!-- mclude path/to/file.php --><!-- /mclude -->
<!-- mclude -->path/to/file.php<!-- /mclude -->