和redis的IO一定是同步的,任何语言
java方面分两种情况:
1.你是servlet模型进来就是多线程,每个用户session对应一个线程,那么异步的API没有意义也不方便理解和代码组织,同步的API即可。
2. 你是类似netty的eventloop模型,一个线程(eventloop)对应多个用户session,那么IO操作应该进入独立的线程池或者task队列(eventloop/其他线程消耗),那么redis也使用异步API或者至少做成异步的方式调用,这样可以保证不卡主线程(主线程负责处理非IO的其他操作,仅使用CPU和内存,不使用磁盘与网络)
nodejs只有java里面的第二种情况,并且只有一个eventloop(线程),所以必须按照2来做,也就是所有IO异步化,比如100个用户进来在nodejs都是一个线程处理的(这么说不严谨),所以如果你在线程内使用同步API,意味着其他99个用户都要等这个API返回,所以必须把这个API写成异步,不租塞业务线程。实际上这个API背后还有一个nodejs的线程做这个IO操作,收到redis的回复停掉主线程,执行回调函数内的代码块。
有此疑问建议深入学习一下netty,对你理解nodejs很有好处,原理都是类似。
PS:初学java可能会有多线程=高性能的误解,多线程其实是非主流