diff --git a/pytools/persistent_dict.py b/pytools/persistent_dict.py
index ed1e80310ff64bc585cc77ebc43cb1d260433805..4e6d64cbafb097dc433225eaaf5a9f5d6fc29ec2 100644
--- a/pytools/persistent_dict.py
+++ b/pytools/persistent_dict.py
@@ -556,8 +556,15 @@ class _PersistentDictBase:
             except ImportError:
                 import appdirs
 
+            if sys.platform == "darwin" and os.getenv("XDG_CACHE_HOME") is not None:
+                # appdirs and platformdirs do not handle XDG_CACHE_HOME on macOS
+                # https://github.com/platformdirs/platformdirs/issues/269
+                cache_dir = join(os.getenv("XDG_CACHE_HOME"), "pytools")
+            else:
+                cache_dir = appdirs.user_cache_dir("pytools", "pytools")
+
             container_dir = join(
-                    appdirs.user_cache_dir("pytools", "pytools"),
+                    cache_dir,
                     "pdict-v4-{}-py{}".format(
                         identifier,
                         ".".join(str(i) for i in sys.version_info)))
diff --git a/pytools/test/test_persistent_dict.py b/pytools/test/test_persistent_dict.py
index d0b32c069c449aeddb52922f4bbfc73da97da460..21092820ed6bdc09fa0e20c977126b109421b335 100644
--- a/pytools/test/test_persistent_dict.py
+++ b/pytools/test/test_persistent_dict.py
@@ -582,6 +582,28 @@ def test_attrs_hashing():
     assert keyb(MyAttrs2("hi", 1)) != keyb(MyAttrs("hi", 1))
 
 
+def test_xdg_cache_home():
+    import os
+    xdg_dir = "tmpdir_pytools_xdg_test"
+
+    assert not os.path.exists(xdg_dir)
+
+    try:
+        old_xdg_cache_home = os.getenv("XDG_CACHE_HOME")
+        os.environ["XDG_CACHE_HOME"] = xdg_dir
+
+        PersistentDict("pytools-test")
+
+        assert os.path.exists(xdg_dir)
+    finally:
+        if old_xdg_cache_home is not None:
+            os.environ["XDG_CACHE_HOME"] = old_xdg_cache_home
+        else:
+            del os.environ["XDG_CACHE_HOME"]
+
+        shutil.rmtree(xdg_dir)
+
+
 if __name__ == "__main__":
     if len(sys.argv) > 1:
         exec(sys.argv[1])