和redis的IO一定是同步的,任何语言
java方面分两种情况:
1.你是servlet模型进来就是多线程,每个用户session对应一个线程,那么异步的API没有意义也不方便理解和代码组织,同步的API即可。
2. 你是类似netty的eventloop模型,一个线程(eventloop)对应多个用户session,那么IO操作应该进入独立的线程池或者task队列(eventloop/其他线程消耗),那么redis也使用异步API或者至少做成异步的方式调用,这样可以保证不卡主线程(主线程负责处理非IO的其他操作,仅使用CPU和内存,不使用磁盘与网络)
【java|java 异步缓存_为什么redis在java是同步缓存,而在nodejs是异步缓存()】nodejs只有java里面的第二种情况,并且只有一个eventloop(线程),所以必须按照2来做,也就是所有IO异步化,比如100个用户进来在nodejs都是一个线程处理的(这么说不严谨),所以如果你在线程内使用同步API,意味着其他99个用户都要等这个API返回,所以必须把这个API写成异步,不租塞业务线程。实际上这个API背后还有一个nodejs的线程做这个IO操作,收到redis的回复停掉主线程,执行回调函数内的代码块。
有此疑问建议深入学习一下netty,对你理解nodejs很有好处,原理都是类似。
PS:初学java可能会有多线程=高性能的误解,多线程其实是非主流
推荐阅读
- JavaSE|【Java小游戏】俄罗斯方块
- 数据结构|【数据结构】优先级队列 - 堆
- JavaSE|【JavaSE】数组
- 即时通讯源码对企业到底有多重要呢()
- 牛客刷题集锦|『牛客|每日一题』模板栈
- 后端|分布式锁用 Redis 还是 Zookeeper(看完你就明白了)
- #|红黑树的学习
- 笔记|SpringBoot发送邮件(详细学习笔记)
- spring|springboot发送邮件工具类