The block cache is for block data, the table cache is for table metadata, which is a different file (I believe). The block cache is, by default, 8MB. It uses a sharded LRU eviction scheme and is multi-threaded. There are 16 random (based on hash) shards, and each shard is LRU. So it's combining random eviction (which is proven to be within 2* optimal or something like that), and LRU, which is pretty good for the compaction jobs. As far as I can tell it's a pretty good scheme.
See cache.h and cache.cc. The leveldb options should allow you to set a custom cache.