Actually, I liked the problem, so I implemented a complete solution in the spirit of my earlier answer:
http://pastebin.com/6iazSKG9
A simple solution, an unsafe thread or something else, but fun and a good starting point, I think.
Edit: some development, on request
See unit test for use.
There are two interfaces: DataStructure<K,V> and Query<V> . The DataStructure behaves like a map (and in my implementation, it actually works with an internal map), but it also provides reusable and immutable query objects that can be combined as follows:
Query<String> combinedQuery = structure.and( structure.or( structure.search("blue"), structure.search("red") ), structure.not( structure.search("green") ) );
(A query that searches for objects marked as (blue or red) AND NOT green). This query is reused, which means that its results will change whenever the backup card changes (sort of like an iTunes smart playlist).
Request objects are already thread safe, but there is no backup card, so there is room for improvement. In addition, queries can cache their results, but that probably means the interface needs to be expanded to provide a cleanup method (like the disconnect method in Wicket models), which would not be very pretty.
As for licensing: if someone wants this code, I will gladly put it on SourceForge, etc ....
Sean