One case first

A report page gets 120 reads each second. A cache answers 9 of every 10 of them. Only the one read in ten that the cache cannot answer goes on to the database: 120 reads times one tenth is 12 reads each second.

The rule: the database sees only the reads the cache misses. Everything below is this rule, seen from more sides.

Change it and watch

Two values matter here. Move them and see the load on the database change beside them.

Reads that reach the database:

Try this: set the hit rate to 0. Then to 100. What does the database see at each end?

Follow one read

Step through the path of one read. The blue box is where the read is now.

flowchart LR
  client[client]:::k1 --> cache[(cache)]
  cache --> db[(database)]
client (now) --> cache --> database
The client asks the cache first.
flowchart LR
  client[client]:::k2 --> cache[(cache)]:::k1
  cache -->|miss| db[(database)]
client --> cache (now, a miss) --> database
The cache has no copy. This is a miss, so it asks the database.
flowchart LR
  client[client]:::k2 --> cache[(cache)]:::k2
  cache --> db[(database)]:::k1
  db -->|answer, kept| cache
client --> cache --> database (now) --answer, kept--> cache
The database answers. The cache keeps a copy of the answer.
flowchart LR
  client[client]:::k2 --> cache[(cache)]:::k1
  cache -->|hit| client
  db[(database)]
client --> cache (now, a hit) --> client; the database is not asked
The next read for the same report is a hit. The database is not asked.