diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e4accd722d66823a067fe8f2c1212746bc18b076..c6a57b0693161dc88219a4a662d53776a53ea6f0 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -23,6 +23,8 @@ test_api:
     DJANGO_ALLOWED_HOSTS: "localhost"
     DATABASE_URL: "postgresql://postgres@postgres/postgres"
     FUNKWHALE_URL: "https://funkwhale.ci"
+    CACHEOPS_ENABLED: "false"
+
   before_script:
     - cd api
     - pip install -r requirements/base.txt
diff --git a/api/config/settings/common.py b/api/config/settings/common.py
index 1def688241366373a3d495c21358b4bd0a76e7bf..000289e515a154390d2f11b864a8746abee580ad 100644
--- a/api/config/settings/common.py
+++ b/api/config/settings/common.py
@@ -60,6 +60,7 @@ THIRD_PARTY_APPS = (
     'mptt',
     'dynamic_preferences',
     'django_filters',
+    'cacheops',
 )
 
 
@@ -369,6 +370,15 @@ MUSICBRAINZ_CACHE_DURATION = env.int(
     'MUSICBRAINZ_CACHE_DURATION',
     default=300
 )
+CACHEOPS_REDIS = env('CACHE_URL', default=CACHE_DEFAULT)
+CACHEOPS_ENABLED = env.bool('CACHEOPS_ENABLED', default=True)
+CACHEOPS = {
+    'music.artist': {'ops': 'all', 'timeout': 60 * 60},
+    'music.album': {'ops': 'all', 'timeout': 60 * 60},
+    'music.track': {'ops': 'all', 'timeout': 60 * 60},
+    'music.trackfile': {'ops': 'all', 'timeout': 60 * 60},
+    'taggit.tag': {'ops': 'all', 'timeout': 60 * 60},
+}
 
 # Custom Admin URL, use {% url 'admin:index' %}
 ADMIN_URL = env('DJANGO_ADMIN_URL', default='^api/admin/')
diff --git a/api/requirements/base.txt b/api/requirements/base.txt
index d6800f3b50d9d6e662a2514b46f76815f3c8d84d..8ec2517be666538892fc2c769fa999503490f29d 100644
--- a/api/requirements/base.txt
+++ b/api/requirements/base.txt
@@ -58,3 +58,4 @@ python-magic==0.4.15
 ffmpeg-python==0.1.10
 channels>=2,<2.1
 channels_redis>=2.1,<2.2
+django-cacheops>=4,<4.1
diff --git a/api/test.yml b/api/test.yml
index 5e785cb1ac3e20eba418a5d89673a207a84519de..85a3a37f0ed015006cc290aa7edd44dfd95df9a0 100644
--- a/api/test.yml
+++ b/api/test.yml
@@ -13,5 +13,6 @@ services:
       - "DJANGO_ALLOWED_HOSTS=localhost"
       - "DATABASE_URL=postgresql://postgres@postgres/postgres"
       - "FUNKWHALE_URL=https://funkwhale.test"
+      - "CACHEOPS_ENABLED=False"
   postgres:
     image: postgres
diff --git a/changes/changelog.d/117.feature b/changes/changelog.d/117.feature
new file mode 100644
index 0000000000000000000000000000000000000000..2df028edc55b0652a21b35190dac54bf2ddc012f
--- /dev/null
+++ b/changes/changelog.d/117.feature
@@ -0,0 +1 @@
+Use django-cacheops to cache common ORM requests (#117)