posts-go/posts/2023-07-30-cache-shenanigan.md

1.3 KiB

Cache shenanigan

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

My default strategy is:

  • Write to database first then to cache second
  • Read from cache first, if not found then read from database second, then re-write to cache
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