2020-02-10 03:57:35 +00:00
Django Cachalot
2014-09-26 14:53:44 +00:00
===============
Caches your Django ORM queries and automatically invalidates them.
2020-02-10 03:57:35 +00:00
Documentation: http://django-cachalot.readthedocs.io
2014-10-28 23:05:08 +00:00
----
2014-09-29 21:47:58 +00:00
2016-10-24 18:44:32 +00:00
.. image :: http://img.shields.io/pypi/v/django-cachalot.svg?style=flat-square&maxAge=3600
2014-10-20 17:35:21 +00:00
:target: https://pypi.python.org/pypi/django-cachalot
2020-08-10 21:15:13 +00:00
.. image :: https://img.shields.io/pypi/pyversions/django-cachalot
:target: https://django-cachalot.readthedocs.io/en/latest/
2021-05-13 04:27:14 +00:00
.. image :: https://github.com/noripyt/django-cachalot/actions/workflows/ci.yml/badge.svg
:target: https://github.com/noripyt/django-cachalot/actions/workflows/ci.yml
2014-09-29 21:47:58 +00:00
2018-05-05 00:30:50 +00:00
.. image :: http://img.shields.io/coveralls/noripyt/django-cachalot/master.svg?style=flat-square&maxAge=3600
:target: https://coveralls.io/r/noripyt/django-cachalot?branch=master
2014-09-29 21:47:58 +00:00
2018-05-05 00:30:50 +00:00
.. image :: http://img.shields.io/scrutinizer/g/noripyt/django-cachalot/master.svg?style=flat-square&maxAge=3600
:target: https://scrutinizer-ci.com/g/noripyt/django-cachalot/
2014-10-20 17:35:21 +00:00
2020-11-09 02:01:14 +00:00
.. image :: https://img.shields.io/discord/773656139207802881
:target: https://discord.gg/WFGFBk8rSU
2020-02-10 03:57:35 +00:00
2020-07-09 22:33:05 +00:00
----
Table of Contents:
- Quickstart
- Usage
- Hacking
- Benchmark
- Third-Party Cache Comparison
- Discussion
2020-02-12 05:52:12 +00:00
Quickstart
----------
2023-04-04 19:14:29 +00:00
Cachalot officially supports Python 3.7-3.11 and Django 3.2, 4.1, 4.2 with the databases PostgreSQL, SQLite, and MySQL.
2021-05-13 04:27:14 +00:00
2021-05-13 16:56:49 +00:00
Note: an upper limit on Django version is set for your safety. Please do not ignore it.
2020-02-12 05:52:12 +00:00
2020-07-09 20:57:41 +00:00
Usage
2020-07-09 22:33:05 +00:00
-----
2020-07-09 20:57:41 +00:00
#. `` pip install django-cachalot ``
#. Add `` 'cachalot', `` to your `` INSTALLED_APPS ``
#. If you use multiple servers with a common cache server,
2020-07-09 22:33:05 +00:00
`double check their clock synchronisation <https://django-cachalot.readthedocs.io/en/latest/limits.html#multiple-servers> `_
2020-07-09 20:57:41 +00:00
#. If you modify data outside Django
– typically after restoring a SQL database – ,
2020-07-09 22:33:05 +00:00
use the `manage.py command <https://django-cachalot.readthedocs.io/en/latest/quickstart.html#command> `_
#. Be aware of `the few other limits <https://django-cachalot.readthedocs.io/en/latest/limits.html#limits> `_
2020-07-09 20:57:41 +00:00
#. If you use
`django-debug-toolbar <https://github.com/jazzband/django-debug-toolbar> `_ ,
you can add `` 'cachalot.panels.CachalotPanel', ``
to your `` DEBUG_TOOLBAR_PANELS ``
#. Enjoy!
Hacking
-------
To start developing, install the requirements
and run the tests via tox.
Make sure you have the following services:
* Memcached
* Redis
* PostgreSQL
* MySQL
For setup:
#. Install: `` pip install -r requirements/hacking.txt ``
#. For PostgreSQL: `` CREATE ROLE cachalot LOGIN SUPERUSER; ``
#. Run: `` tox --current-env `` to run the test suite on your current Python version.
2020-08-10 21:15:13 +00:00
#. You can also run specific databases and Django versions: `` tox -e py38-django3.1-postgresql-redis ``
2020-07-09 20:57:41 +00:00
2020-07-09 22:33:05 +00:00
Benchmark
---------
Currently, benchmarks are supported on Linux and Mac/Darwin.
You will need a database called "cachalot" on MySQL and PostgreSQL.
Additionally, on PostgreSQL, you will need to create a role
called "cachalot." You can also run the benchmark, and it'll raise
errors with specific instructions for how to fix it.
#. Install: `` pip install -r requirements/benchmark.txt ``
#. Run: `` python benchmark.py ``
The output will be in benchmark/TODAY'S_DATE/
TODO Create Docker-compose file to allow for easier running of data.
2020-02-10 03:57:35 +00:00
Third-Party Cache Comparison
----------------------------
There are three main third party caches: cachalot, cache-machine, and cache-ops. Which do you use? We suggest a mix:
2020-11-09 02:01:14 +00:00
TL;DR Use cachalot for cold or modified <50 times per minutes (Most people should stick with only cachalot since you
2020-02-10 03:57:35 +00:00
most likely won't need to scale to the point of needing cache-machine added to the bowl). If you're an enterprise that
already has huge statistics, then mixing cold caches for cachalot and your hot caches with cache-machine is the best
2020-08-10 21:15:13 +00:00
mix. However, when performing joins with `` select_related `` and `` prefetch_related `` , you can
get a nearly 100x speed up for your initial deployment.
2016-09-29 17:40:32 +00:00
2020-02-10 03:57:35 +00:00
Recall, cachalot caches THE ENTIRE TABLE. That's where its inefficiency stems from: if you keep updating the records,
then the cachalot constantly invalidates the table and re-caches. Luckily caching is very efficient, it's just the cache
invalidation part that kills all our systems. Look at Note 1 below to see how Reddit deals with it.
2014-09-26 14:53:44 +00:00
2020-02-10 03:57:35 +00:00
Cachalot is more-or-less intended for cold caches or "just-right" conditions. If you find a partition library for
Django (also authored but work-in-progress by `Andrew Chen Wang`_ ), then the caching will work better since sharding
the cold/accessed-the-least records aren't invalidated as much.
2014-09-26 14:53:44 +00:00
2020-11-09 02:01:14 +00:00
Cachalot is good when there are <50 modifications per minute on a hot cached table. This is mostly due to cache invalidation. It's the same with any cache,
2020-02-10 03:57:35 +00:00
which is why we suggest you use cache-machine for hot caches. Cache-machine caches individual objects, taking up more in the memory store but
invalidates those individual objects instead of the entire table like cachalot.
2016-09-06 09:39:00 +00:00
2020-02-12 05:52:12 +00:00
Yes, the bane of our entire existence lies in cache invalidation and naming variables. Why does cachalot suck when
stuck with a huge table that's modified rapidly? Since you've mixed your cold (90% of) with your hot (10% of) records,
you're caching and invalidating an entire table. It's like trying to boil 1 ton of noodles inside ONE pot instead of
100 pots boiling 1 ton of noodles. Which is more efficient? The splitting up of them.
2020-02-10 03:57:35 +00:00
Note 1: My personal experience with caches stems from Reddit's: https://redditblog.com/2017/01/17/caching-at-reddit/
Note 2: Technical comparison: https://django-cachalot.readthedocs.io/en/latest/introduction.html#comparison-with-similar-tools
2016-09-06 09:39:00 +00:00
Discussion
----------
2020-11-09 02:01:14 +00:00
Help? Technical chat? `It's here on Discord <https://discord.gg/WFGFBk8rSU> `_ .
2020-02-10 03:57:35 +00:00
2020-11-09 02:01:14 +00:00
Legacy chats:
- https://gitter.im/django-cachalot/Lobby
- https://join.slack.com/t/cachalotdjango/shared_invite/zt-dd0tj27b-cIH6VlaSOjAWnTG~II5~qw
2020-02-10 03:57:35 +00:00
2020-02-10 04:35:22 +00:00
.. _Andrew Chen Wang: https://github.com/Andrew-Chen-Wang
.. image :: https://raw.github.com/noripyt/django-cachalot/master/django-cachalot.jpg