忧桑ing:题解:
goroutine内存泄漏的情况?如何避免
goroutine内存泄漏基本上是因为异常导致阻塞, 可以导致阻塞的情况
1 死锁, goroutine 等待的锁发生了死锁情况
2 chan没有正常被关闭,导致读取读chan的goroutine阻塞
如何避免
1 避免死锁
2 正常关闭
3 使用context管理goroutine, 超时结束goroutine
协程和线程的区别
主要的区别在于协程是用户级的并非单位, 不需要进入到内核态处理. 所以协程更加轻量级, 不占用内核资源.
slice和array的区别,讲一下底层的结构
array本质是一个固定数组, 内存层面就是一块固定的内存区域,不会改变, 传递的时候是拷贝一份完整数据.
slice本质上是一个动态数组的封装,底层指向不是一个固定内存,可以重新指向新的内存,传递的时候底层指向相同的内存.
channel的用途和使用上要注意的点,底层的结构是怎样的
channel是golang中协程之间的数据交互的重要工具,相当于与进程内的一个消息队列.
注意点: 最重要的是chan的close处理, 不然很容易出现异常, 1写数据goroutine中调用close, 2不要多次调用close, 3使用信号通知chan close了
底层结构: 环形队列(缓存数据, 无缓存的时候用不上), 读goroutine 队列(链表), 写goroutine 队列(链表), 锁
orm框架的优缺点
orm封装了对数据库的操作,并且自动转换内存数据结构和数据库字段, 优点是方便,开发效率高, 缺点是有些场景性能低, 复杂对像转换处理起来不方便.
操作系统内核态和用户态的区别,何时进入内核态or用户态
内核态: 高权限,执行系统操作,操作资源,调度管理等等
用户态: 低权限,执行用户程序操作
进入内核态: 中断(系统调用, 时间片到期等)
进入用户态: 内核态处理完成,调度用户线程处理程序
tcp和udp的区别,他们的报头结构,tcp的三次握手和四次握手的中间状态有哪些
tcp: 可靠(数据顺序接收, 数据不丢, 数据不重复), 面向连接, 字节流(需要), 性能低
udp: 不可靠, 数据包, 性能高
三次握手/四次挥手 11种状态
查看22道真题和解析0 点赞 评论 收藏
分享
忧桑ing:基础知识问题题解
1. 缓存击穿怎么解决的,介绍下多个方案,
缓存击穿是热点key不在缓存中(主要是热点key失效导致),导致大量请求到数据库中,导致数据库压力变大深圳宕机.
解决方案: 1)热点key不过期 2)热点key续期 3)热点key预加载 4) 请求数据库时,先获取锁,避免同时请求到数据库
2.缓存一致性怎么解决
数据修改:修改数据加分布式锁
缓存删除
先改后删
延时双删(业界主要的方案)
3 如何用redis实现一个分布式布隆过滤器
使用bitmap数据实现, 具体可以使用Redisson 或者 Redis 4.0的布隆过滤器插件
4 读扩散和写扩散的区别,它们的应用场景有哪些。
读扩散: 存一份数据, 每个用户都读该数据, 读取性能可能导致瓶颈
写扩散: 每个用户写一份数据, 各自读取自己的数据, 写性能可能导致瓶颈
常见的读写扩散应用场景是feed流, 例如微博, Twitter, im群聊等
4. 如何设计一个朋友圈功能,采用读扩散和写扩散的区别。现在比如说有一个大v,粉丝量很高,该采用写扩散还是读扩散,如何进行优化
粉丝量很高: 基本采用读扩散, 因为写的数据太多,存储成本高, 优化: 对活跃用户采用写扩散, 不活跃客户端采用读扩散
5. redis实现分布式锁在哪些情况下会失效?
客户端长时间阻塞导致锁失效问题
6. 死锁问题如何产生?如何排查和解决死锁?我们日常编码过程中可以怎么去避免
死锁问题是互相等待产生的 (互斥、请求与保持、不可抢占、循环等待)
排查和解决死锁: 工具排查, 人工检查.
编码中如何避免: 注意加锁顺序
查看14道真题和解析0 点赞 评论 收藏
分享
查看34道真题和解析0 点赞 评论 收藏
分享
查看30道真题和解析0 点赞 评论 收藏
分享
AAA专业长城贴瓷砖...:为什么是三战字节呀
查看23道真题和解析0 点赞 评论 收藏
分享
查看49道真题和解析0 点赞 评论 收藏
分享
TOBY😈:跪了呀
,我下周一也面飞书好害怕
查看24道真题和解析0 点赞 评论 收藏
分享
创作者周榜
更多
关注他的用户也关注了: