MyISAM is the worst offender for updating individual rows on concurrency. First thing you want to do is use InnoDB to be able to execute
UPDATEs in parallel. InnoDB may have lower insertion rate, but that can be solved by reducing its durability setting (
innodb_flush_log_at_trx_commit = 2). That, combined with a large enough buffer pool, will make most of your updates on-memory only.
If that is still too slow for a single row, memcached is certainly one solution to buffer queries, and it is even integrated into MySQL 5.6. Operations in memcached are guaranteed to be done atomically, so on that side that wouldn't be a concurrency problem. However, reading, adding plus 1 on client code, and updating the result is not guaranteed to be atomic, so you should control concurrency on application side (syncronization/locking)- Java has very good support for that, PHP doesn't, although it can be done. That can be too much overhead if the cache server is over the network.
One trick to avoid concurrency problems (works for DB tables and any other system) is to do partitioning: instead of having one counter, having several per value to prevent blocking problems on write. When calculating the final number, just add up the different rows into one.