Earlier quoted context omitted.
Threading can help up to a given point but sharing is the way to go.
One of our bottlenecks was really big keys (>1MB) being written and read too often and effectively stealing all the CPU time. That was fixed in the app by reducing the number of operations + compression. Threaded IO will give us a little more room. Other use case involves LUA scripts that operate on 5 different keys, so cluster/proxy is out of question.
I run a fork called KeyDB with multithreading as well as a few optimizations directly around large values (redis does unnecessary copies).
It may work well for your use case. https://github.com/JohnSully/KeyDB