Template Hook + Caching
Yes, sort of. As soon as the rendering template hits a {% cache %} tag, Craft grabs the outputted content from the cache table in the database and ignores all other template logic until the {% endcache %} tag. 

So, the results of the PHP-based query will be cached with the rest of whatever is between the tags only for use in that instance as HTML.

If your hook is called anywhere else, Craft will make the PHP query again, as the query itself is not cached independently. In order to accomplish that (if you want), you will need to implement some plugin-level cacheing using the Cache Service.

For cache invalidation, here is what Brandon has to say:

Any time ElementCriteriaModel::find() et al. is called within {% cache %} tags, it will be recorded, however you will have to manually register any elements that should be associated with the cache, using this code:

// Don't initialize the CacheService if we don't have to
$cacheService = craft()-&gt;getComponent('templateCache', false);

if ($cacheService)
{
    $cacheService-&gt;includeElementInTemplateCaches($elementId);
}