美团AI面试
解释一下cookie和session的区别(换题)
- 存储位置:Cookie存储在客户端,Session存储在服务器端。
- 安全性:Session比Cookie更安全,因为Session数据不通过网络传输,而Cookie可以被拦截。
- 容量:Cookie有大小限制(4KB),而Session理论上没有。
- 使用场景:Cookie适合于不需要高度安全性的状态维护,而Session适用于需要更高安全性的场合。
服务器会为每个用户创建一个唯一的Session ID,并将这个ID存储在Cookie中,这样每当用户发起请求时,就会携带这个Session ID,服务器可以根据这个ID找到对应的Session数据。
OSI七层模型,每层的主要功能
物理层:负责在物理媒介上传输未加解释的位流(即0和1)
数据链路层:提供节点间数据帧的可靠传输,负责错误检测和纠正、流量控制以及物理寻址(以太网)
网络层:负责数据包从源到目的地的路由选择
传输层:提供端到端的可靠数据传输服务
会话层:负责建立、管理和终止表示层实体之间的通信会话(RPC)
表示层:处理数据的表示形式,如数据格式化(JSON)
应用层:提供网络服务与最终用户之间的接口(HTTP)
如何查看系统日志文件,常见的日志系统文件有哪些
在Linux/Unix系统中,系统日志文件通常存储在/var/log
目录下,你可以使用文本编辑器(如vim
)或者命令行工具来查看日志文件,除了下面两个还有其他的
- /var/log/syslog 或 /var/log/messages:包含了系统启动以来的所有系统日志信息。
- /var/log/auth.log(Ubuntu/Debian)或 /var/log/secure(Red Hat/CentOS):记录了与安全相关的事件,如登录尝试。
redis如何实现分布式锁,需要考虑哪些问题
分布式锁是在分布式环境中协调多个进程对共享资源的访问,Redis 提供了原子操作,这使得它可以作为一个可靠的分布式锁服务
获取锁:可以设置一个过期时间来防止持有锁的客户端崩溃导致锁无法释放
SETNX lock:resource_name client_id EXPIRE lock:resource_name ttl
释放锁:必须确保只有锁的拥有者才能释放它
WATCH lock:resource_name MULTI IF redis.get(lock:resource_name) == client_id DEL lock:resource_name EXEC
考虑的问题:
死锁:需要设计合理的锁获取策略,如设置锁的获取超时时间
分布式一致性(redis主从复制和故障转移)
异常处理(网络中断或客户端崩溃)
锁的超时时间、公平性
C++中两种自动类型推导
auto
关键字告诉编译器根据变量的初始化表达式自动推导变量的类型。这在声明变量时非常有用,特别是当你不确定变量的确切类型,或者类型比较复杂难以书写时。
decltype
关键字允许你根据一个表达式的类型来定义一个新的类型名。
decltype(auto)
允许你在声明变量的同时推导出变量的类型,并且保留表达式的CV限定符(const和volatile限定符)以及引用类型。这对于确保类型正确性和避免不必要的类型转换特别有用。
C++的函数重载,如何实现
函数具有不同的参数列表(参数的数量、类型或顺序不同)。函数重载使得同一个函数名可以对应多种不同的实现,这增加了代码的可读性和灵活性。
- 二义性:如果多个重载函数对于相同的调用参数都是可行的,那么编译器将无法确定应该选择哪个版本,这会导致编译错误。例如,如果两个函数除了返回类型不同外完全相同,则会导致二义性。
- 隐式转换:如果存在可以从实参到形参的隐式转换,则编译器会尝试这样的转换来匹配函数签名。但是,如果多个函数都可以通过隐式转换来匹配,则可能会导致二义性。
- 默认参数:虽然默认参数可以用来扩展函数的功能,但它们不应用于区分重载函数,因为默认参数并不会改变函数签名。
如何设计一个社交媒体的关注功能和API
1、用户认证:任何社交应用都需要用户认证机制来确保每个用户的身份
2、数据模型:
- 用户(User):存储用户的基本信息,如用户名、密码哈希、邮箱等。
- 关注关系(Follow):表示用户之间的关注关系,包含关注者和被关注者的用户ID。
3、存储方案:
关注关系可以存储在一个表中,该表至少包含以下字段:
- follower_id:关注者的用户ID。
- following_id:被关注者的用户ID。
- created_at:关注关系创建的时间戳。
4、API:关注用户、取消关注、获取用户关注列表、获取关注用户列表
如何高效的处理每个用户的关注列表和被关注列表
索引:对Follows表中的follower_id和following_id列建立索引,以加快查询速度。
查询优化:使用JOIN
语句来获取用户关注列表,同时可以通过分页来减少数据量;类似地,使用JOIN
语句来获取用户的粉丝列表
缓存机制:使用Redis等内存数据库来缓存经常访问的数据