0%

背景

系统里使用redis里watch-multi-exec一种CAS机制来控制并发的更新操作,目前使用的场景:

  1. chat里的房间信息(e.g. 成员变化)
  2. session系统的会话信息,涉及到的更新场景较多(e.g. 会话状态变化、聊天时间、评价、虚商等)
  3. mcc里员工信息(e.g. 工作状态、服务的会话)
  4. 但一直以来,都是开发人员自行维护了单机redis来实现上面一套,存在一定的风险,而公司运维维护了一套在底层storage上有一层类似codis的代理中间件,watch/multi/exec事务有关的命令不支持。
Read more »

问题

之前猫眼电影面试官,曾经问过我服务端起多少个NIO线程(boss)?

  • 默认情况下,Netty服务端起多少线程?何时启动
  • Netty是如何解决jdk空轮询bug的
  • Netty如何保证异步串行无锁化
Read more »

ByteBuf的释放

byteBuf.release(); ->release0(int decrement),最终会走到PoolByteBuf#deallocate()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private boolean release0(int decrement) {

int oldRef = refCntUpdater.getAndAdd(this, -decrement);

//过去的引用值和减去的值相等,引用为0,就可以被释放了
if (oldRef == decrement) {
//具体释放逻辑
deallocate();
return true;
}
if (oldRef < decrement || oldRef - decrement > oldRef) {
// Ensure we don't over-release, and avoid underflow.
refCntUpdater.getAndAdd(this, decrement);
throw new IllegalReferenceCountException(oldRef, -decrement);
}
return false;
}
Read more »

毕业前夕提升系列(二):Netty总结(6)——subPage的分配

前言:之前是大于一个pageSize(8k)则在一个PoolChunk(6M)里进行分配,

前面逻辑还是跟page级别内存分配类似:

  1. 内存规格化,将需要分配的内存进行两倍化(page、subPage级别规格)

  2. 首先是从cache上分配

  3. 如果cache上无法分配的话,从poolChunkList上分配

    1. 若chunk为null(首次), chunk(初始化depth、memory数组、PoolSubpage数组)
    Read more »