Until 8.0.0-beta4, cache tag invalidation was the responsibility of each cache bin/backend. This had a number of problems, for example that invalidation need to be called on every bin but their implementation was global.
Cache tag invalidations
This change introduces the cache_tags.invalidator service, that notifies all services with the cache_tags_invalidator service tag (through Drupal\Core\Cache\CacheTagsInvalidatorInterface. Cache backends can also implement that interface and they will be notified as well, but they are no longer required to do so. The Cache::invalidateTags() wrapper still exists, but services can now also inject the invalidator service and use that instead.
Cache backends can remove their invalidateTags() and deleteTags() implementation if they use the checksum implementation. If they want to keep them, they have to implement CacheTagsInvalidatorInterface.
Checksum invalidation
Additionally, there is the new cache_tags.invalidator.checksum (Drupal\Core\Cache\CacheTagsChecksumInterface) service, that cache backends can use if they were using the common checksum implementation instead of having to implement it themself.
To use it, all that cache backend implementations have to do is inject that service through their factory. When a cache item is written, they are to store the list of cache tags and the current checksum (which they can get from the service: $this->checksumProvider->getCurrentChecksum($tags)). When a cache item is loaded, the checksum can be validated with $this->checksumProvider->isValid($cache->checksum, $cache->tags)
Removal of Cache::deleteTags()
Additionally, as part of this refactoring, the deleteTags() method was removed. This is likely the only change that affects cache API consumers. Callers of that method can just switch to invalidateTags().
Before:
Cache::deleteTags(['a', 'b']);
After:
Cache::invalidateTags(['a', 'b']);