~

Cache shenanigan

My notes/mistakes/... when using cache (mainly Redis) from time to time

My default strategy is:

sequenceDiagram
    participant other
    participant service
    participant cache
    participant db

    other ->> service: get data
    activate service
    service ->> cache: get data
    alt exist in cache
        service -->> other: return data
    else not exist in cache
        service ->> db: get data
        alt exist data in db
            service -->> other: return data
        else not exist data in db
            service -->> other: return error not found
        end
    end
    deactivate service

    other ->> service: set data
    activate service
    service ->> db: set data
    service ->> cache: set data
    deactivate service

It's good for general cases, for example with CRUD action.

The bad things happen when cache and database are not consistent. For example what happen if writing database OK then writing cache failed? Now database has new value, but cache has old value Then when we read again, we read cache first with old value, and that is disaster.

Thanks

Feel free to ask me via email or Mastodon.
Source code is available on GitHub Codeberg sourcehut Treehouse GitLab