面经整理2

127 阅读5分钟

1.Redis为什么这么快

Redis 基于内存,内存的访问速度比磁盘快很多; Redis 基于 Reactor 模式设计开发了一套高效的事件处理模型,主要是单线程事件循环和 IO 多路复用; Redis 内置了多种优化过后的数据类型/结构实现,性能非常高。 Redis 通信协议实现简单且解析高效。

2.redis(分布式缓存)常见数据结构及区别

image.png

1)5种基础数据类型

①String字符串

应用场景:

需要存储常规数据的场景(缓存session、token、图片地址、序列化后的对象,相比较于hash存储更节省内存,相关命令:set、get)

需要计数的场景(用户单位时间的请求数、页面单位时间的访问数,相关命令:set、get、incr、decr)

分布式锁(使用setnx key value命令可以实现一个最简易的分布式锁)

image.png

②List列表(双向链表)

redis中的list其实就是链表数据结构的实现

应用场景:

信息流展示(最新文章、最新动态,相关命令:LPUSH、LRANGE)

消息队列(功能过于简单,不推荐) image.png

③哈希

redis中的hash是一个string类型的kv(键值对)的映射表。

应用场景:

对象数据存储场景(用户信息、商品信息、文章信息、购物车信息,相关命令:HSET、HMSET、HGET、HMGET)

image.png

④Set集合

redis中的set类型是一种无序集合,集合中的元素没有先后顺序但都唯一(有点像HashSet)

应用场景:

需要存放的数据不能重复的场景(网站UV统计(数据量巨大还是HyperLogLog更合适)、文章点赞、动态点赞等场景,相关命令:SCARD获取集合数量)

需要获取多个数据源交集、并集和差集的场景 (共同好友(交集)、音乐推荐(差集)、订阅号推荐(差集+交集)等场景,相关命令:SINTER(交集)、SINTERSTORE (交集)、SUNION (并集)、SUNIONSTORE(并集)、SDIFF(差集)、SDIFFSTORE (差集))

需要随机获取数据源中的元素的场景(抽奖系统、随机点名,相关命令:SPOP不允许重复中奖、SRANDMEMBER允许重复中奖) image.png

⑤Sorted Set有序集合

类似于set,但是比set增加了一个权重参数score,使得集合中的元素能够按照score有序排列

应用场景:

需要随机获取数据源中的元素根据某个权重进行爱旭的场景(直播间送礼排行榜、微信步数排行榜,相关命令:ZRANGE (从小到大排序)、 ZREVRANGE (从大到小排序)、ZREVRANK (指定元素排名))

需要存储的数据有优先级或者重要程度的场景(优先级任务队列,相关命令:ZRANGE (从小到大排序)、 ZREVRANGE (从大到小排序)、ZREVRANK (指定元素排名)) image.png

2)3种特殊数据类型

①Bitmap位图

应用场景:需要保存状态信息(0/1即可表示)的场景(用户签到情况、用户活跃情况、用户行为统计,相关命令:SETBIT、GETBIT、BITCOUNT、BITOP)

②HyperLogLog基数统计

应用场景:数据量巨大(百万、千万级别以上)的计数场景(热门网站每日访问ip数统计、热门帖子uv统计,相关命令:PFADD、PFCOUNT)

③Geospatial地理位置

应用场景:需要管理使用地理空间数据的场景(附近的人,相关命令: GEOADD、GEORADIUS、GEORADIUSBYMEMBER)

3.redis持久化

1)RDB:redis中的默认持久化方式,通过定期将内存中的数据集快照写入磁盘来实现持久化。

2)AOF:通过保存Redis服务器接收到的写命令来记录每次写操作的数据变更。 什么是AOF持久化 ①写入操作记录:Redis在接收到客户端的写命令(set、incr等)时,并不立即将数据写入内存,而是先将命令追加到AOF文件的末尾。 ②文件同步(每个写命令后立即同步;每秒同步一次;不同步,依赖于操作系统缓存 同步函数:fsync) ③恢复过程:当Redis重启时,会读取AOF文件中的命令,并一次重新执行这些命令,从而将数据恢复到最新的状态

AOF优点:①数据安全性②不会像RDB一样新版本不兼容③AOF以一种易于理解的格式包含所有操作的日志,可以导出轻松分析。

RDB优点:①恢复大数据集的时候,RDB速度更快②文件较小

4.SpringMVC三层架构含义

1)表现层 负责接收客户端请求,向客户端响应结果 2)业务层(service层) 负责业务逻辑处理,事务应该放到业务层来控制 3)持久层(dao层) 持久层就是和数据库交互,对数据库表进行增删改查的

5.可重复读怎么解决幻读问题?

MVCC(多版本并发控制)和锁机制(间隙锁(Gap Locks))

  • MVCC 主要用于提供可重复读隔离级别下的数据一致性保证,适用于大多数业务场景,特别是需要读取一致性数据的场合。
  • 间隙锁 主要用于可重复读串行化隔离级别,用于防止幻读现象的发生,特别是在使用范围查询(Range Query)或者不唯一索引扫描时使用。

6.==和.equals的区别

==对于基本类型和引用类型的作用效果是不同的 对基本数据类型来说,==比较的是值 对引用数据类型;来说,==比较的是对象的内存地址

7.进程、线程和协程的区别

进程:系统级别的执行单元,具有独立的内存和资源管理 线程:进程内的执行单元,共享进程的内存和资源,管理开销较小 协程:更轻量级的执行单元,通过协作式调度和挂起恢复机制实现高效的异步编程

目的:协程、线程和进程都旨在实现并发执行,使得程序可以同时处理多个任务,提高效率和响应速度。 上下文切换:所有这些机制都涉及上下文切换,但方式和开销有所不同。线程和进程的切换由操作系统进行,而协程的切换通常由程序或库进行,开销较低。