【字节跳动后端一面(2024-7-8)】字节的一面你能答出几道题呢?下面包含了我自己的理解,希望能帮助到你;

1.分库分表的思想,你是怎样选取路由键的呢?

我的理解:
什么时候需要分库呢?一般是单个数据库的连接压力太大了,影响到了性能,所有需要将不同数据分别存放在不同的数据库中,这样可以大大提高应用的响应;
什么时候需要分表呢?一般是单表的数据量过大,影响单表的查询性能,这个时候可以把单表的数据按照一定规则进行分表设计,比如:对主键id进行取模或者一致性hash算法映射到不同表中,或者按照创建时间进行分表;
我们需要根据具体的业务需求来设计路由键,比如订单表中,我们可以这样设计,将用户id拼接在订单id中,这样就可以确保某个用户的订单都会路由在同一个库,同一个表中;

2.MySQL扫表和索引机制,哪些情况需要用到索引?

我的理解:
在进行数据库查询的时候索引失效了,或者查询并没有走索引,这个时候就会进行全表扫描,对于数据量不大的情况下没有什么影响,但是数据增多的时候查询效率会降低很多。
有以下情况可能会出现全表扫描:

  • 1.使用了like操作符;
  • 2.使用了非等值操作;
  • 3.使用了or操作符;
  • 4.使用了相关函数;
  • 5.强制类型转化;
  • 6.使用null值;
    MySQL使用了B+数作为索引结构,B+数作为N叉数,大大降低了数的高度,也就是IO的次数,B+数所有的数据都是存在叶子节点,所以查询很稳定。当数据量很大的时候需要进行查询优化就可以建立某些字段作为索引减少查询时间。

4.Innodb的结构?一页的大小,为什么这样设计,有什么用处?

我的理解:
我用一个例子来解释一下页的用处:如果每次查询的数据都是一条的情况下,查出A这条数据,该数据会放在缓存中,下一次在查询A的时候直接拿缓存的值就可以了,当查询A的下一条数据B的数据的时候,会在去进行一次IO拿到B的数据,这样IO会过于频繁,如果是每次查询的数据都是一整页(16KB:大小适中不会造成内存的浪费),当下次去查询B的数据的时候,直接拿缓存的值就行了,不用在次进行IO操作,这样做大大减少了IO的次数,提高了整体的性能。

5.redis,mysql数据不一致解决方案?

我的理解:
1.先操作缓存:延时双删;先删除缓存,在更新数据库,延时一下在删除缓存;
延时双删

2.先操作数据库:先更新数据库,在删除缓存,最终一致性;
先操作数据库

3.利用RabbitMq:在前面两种情况中都可能出现删除不成功的情况,这个时候可以引入RabbitMq异步重新删除;
4.利用cannel:监听MySQL的binglog日志,当出现修改的时候对缓存进行删除操作;

6.如何将db中的明文字段加密,要求平缓无感知。

我的理解:(不太清楚)
应该是可以用mybatis内置的AES加密进行加密,或者利用后置处理器,将配置文件中的账号密码在后置处理器中进行解密。

7.数据交换场景使用哪种进程通信方式最合适?

我的理解:
这个不太清楚。进程的通信方式有以下几种:

  • 管道:管道的通信方式效率低,不适合进程间频繁的交换数据,
  • 消息队列:涉及到内核态用户态频繁切换;不太适合大数据间的数据交换,在内核中每个消息体都有一个最大长度限制。
  • 功效内存:共享内存机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中,这样AB进程就可以操作这一块内存,不需要数据在用户态和内核态的拷贝。
  • Socket:适合跨主机间的进程通信;

8.讲讲使用哪种线程池最合适?

我的理解

  • 1.CachedThreadPool
    线程池的核心线程数为0,最大线程数为Integer.MAX_VALUE。
    使用SynchronousQueue作为任务队列,这是一个无界但不存储元素的队列,每个插入操作必须等待另一个线程的移除操作,因此当提交新任务时,若没有空闲线程可用,则会创建新的线程执行任务。
    当线程空闲超过60秒后会被终止并从线程池中移除,从而达到动态调整线程数量的目的。
/**
 - Creates a thread pool that creates new threads as needed, but
 - will reuse previously constructed threads when they are
 - available.  These pools will typically improve the performance
 - of programs that execute many short-lived asynchronous tasks.
 - Calls to {@code execute} will reuse previously constructed
 - threads if available. If no existing thread is available, a new
 - thread will be created and added to the pool. Threads that have
 - not been used for sixty seconds are terminated and removed from
 - the cache. Thus, a pool that remains idle for long enough will
 - not consume any resources. Note that pools with s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值