What is the difference between \Drupal::request()->getSession() and \Drupal::service('user.private_tempstore')? As the title suggests, I'm a bit confused about those two methods of creating and accessing a session on Drupal 8. I'm not quite sure when to use the one over the other, could someone point me to the right direction?

My issue started after a Drupal update, where originally I was using this way to start a session for anonymous users on my module:

$request       = \Drupal::request();
$this-&gt;session = $request-&gt;getSession();

$session       = $this-&gt;session-&gt;get('mymodule');


After the update, the above code won't create a session for anonymous user and the only way to make it work was this piece of code:

$tempstore = \Drupal::service('user.private_tempstore')-&gt;get('mymodule_name');
$tempstore-&gt;set('my_variable_name', ['test var' =&gt; 'this is my value']);

echo '&lt;pre&gt;';
print_r($tempstore-&gt;get('my_variable_name'));
echo '&lt;/pre&gt;';


So, even though I've managed to make it work, I'm not quite sure why it did work that way.
The main difference is that session data is stored in the database table sessions and PrivateTempStore in key_value_expire. Session data is preloaded in memory, private tempstore data only when requested. Session data is for small amount of data not exceeding a few megabytes, private tempstore for bigger chunks of data you don't want to have in memory when not needed.

What you've posted is not starting a session, it gets a value. You would need to set a value first to start a session.