Are you defining dependencies between the keys somehow so that keys invalidated further down in the hierarchy propagate up to invalidations all the way up the stack?
Whoa—I can’t believe this #cache_key and :touch stuff was introduced years ago and I somehow completely missed it. This is the most useful and elegant thing ever!
We do this to invalidate multiple keys at once. All related keys are created based on a master key (well, the value of that key). Once that is changed, all keys are invalidated.