面试必备(背)--Redis八股文系列

1.什么是 redis?

redis: redis 即 Remote Dictionary Server,用中文翻译过来可以理解为远程数据服务或远程字典服务。其是使用 C 语言的编写的 key-value 存储系统。

1.1 redis 适合的场景

  • 缓存:减轻 MySQL 的查询压力,提升系统性能;

  • 排行榜:利用 Redis 的 SortSet(有序集合)实现;

  • 计算器/限速器:利用 Redis 中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等。这类操作如果用 MySQL,频繁的读写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个 API 的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力;

  • 好友关系:利用集合的一些命令,比如求交集、并集、差集等。可以方便解决一些共同好友、共同爱好之类的功能;

  • 消息队列:除了 Redis 自身的发布/订阅模式,我们也可以利用 List 来实现一个队列机制,比如:到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的 DB 压力,完全可以用 List 来完成异步解耦;

  • Session 共享:Session 是保存在服务器的文件中,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登录;采用 redis 保存 Session 后,无论用户落在哪台机器上都能够获取到对应的 Session 信息。

1.2 redis 不适合的场景

数据量太大、数据访问频率非常低的业务都不适合使用 Redis,数据太大会增加成本,访问频率太低,保存在内存中纯属浪费资源。

1.3 redis 为什么这么快?

面试必备(背)--Redis八股文系列_第1张图片

 

2. redis 有哪些数据类型?可以应用在什么场景?

redis 总共有八种数据结构,五种基本数据类型和三种特殊数据类型。

  • 五种基本数据类型

    • string :字符串类型,常被用来存储计数器,粉丝数等,简单的分布式锁也会用到该类型。

    • hashmap :key - value 形式的,value 是一个map。

    • list :基本的数据类型,列表。在 Redis 中可以把 list 用作栈、队列、阻塞队列。

    • set :集合,不能有重复元素,可以做点赞,收藏等。

    • zset :有序集合,不能有重复元素,有序集合中的每个元素都需要指定一个分数,根据分数对元素进行升序排序。可以做排行榜。

  • 三种特殊数据类型

    • geospatial :Redis 在 3.2 推出 Geo 类型,该功能可以推算出地理位置信息,两地之间的距离。

    • hyperloglog :基数:数学上集合的元素个数,是不能重复的。这个数据结构常用于统计网站的 UV。

    • bitmap :bitmap 就是通过最小的单位 bit 来进行0或者1的设置,表示某个元素对应的值或者状态。一个 bit 的值,或者是0,或者是1;也就是说一个 bit 能存储的最多信息是2。bitmap 常用于统计用户信息比如活跃粉丝和不活跃粉丝、登录和未登录、是否打卡等。

3. redis 是单线程还是多线程呢?

  • Redis 在 4.0 的时候引入了多线程来做大缓存的清除处理工作,主要是体现在大数据的异步删除功能上,例如 unlink key、flushdb async、flushall async 等,先清除 key ,接着异步清除对应的 value。

  • 在 Redis 6.0 之前的网络模型都是标准的单线程 reactor 模型。在 6.0 开始引入了一个非标准的多线程 reactor 模型,sub-reactor 此时会使用 socket 读取 client 请求,并处理命令的解析,然后具体写还是在主线程上执行。

3.1 redis 使用了多线程不会有线程安全的问题吗?为什么redis 6.0 之后改多线程呢?

不会,其实 redis 还是使用单线

你可能感兴趣的:(后端,java,面试,redis,面试,jvm,java,后端)