In my understanding, IOLib and usocket have almost same abstraction level.
IOLib uses OS-backend sockets, on the other hand usocket uses Lisp-runtime-backend socket.
I just wonder which is a better choice for particular use cases.
For example, a server which needs great concurrency, or a client which focuses on portability, etc.
I think, this blogpost answers your question.
To sum up, if you’re writing a library, which should work on all platforms and implementations (with a reasonable definition of “all”), use usocket. For other use-cases on the Unix platform, IOLib is probably more versatile. For example, it supports Unix domain sockets, as well as non-blocking IO.
By the way, I had ported cl-redis from usocket to IOLib and back – the API is very similar, although slightly different.