Java-中间件-1
1. Redis
1.1 Redis可以用来做什么?
参考答案
- Redis最常用来做缓存,是实现分布式缓存的首先中间件;
- Redis可以作为数据库,实现诸如点赞、关注、排行等对性能要求极高的互联网需求;
- Redis可以作为计算工具,能用很小的代价,统计诸如PV/UV、用户在线天数等数据;
- Redis还有很多其他的使用场景,例如:可以实现分布式锁,可以作为消息队列使用。
1.2 Redis和传统的关系型数据库有什么不同?
参考答案
Redis是一种基于键值对的NoSQL数据库,而键值对的值是由多种数据结构和算法组成的。Redis的数据都存储于内存中,因此它的速度惊人,读写性能可达10万/秒,远超关系型数据库。
关系型数据库是基于二维数据表来存储数据的,它的数据格式更为严谨,并支持关系查询。关系型数据库的数据存储于磁盘上,可以存放海量的数据,但性能远不如Redis。
1.3 Redis有哪些数据类型?
参考答案
- Redis支持5种核心的数据类型,分别是字符串、哈希、列表、集合、有序集合;
- Redis还提供了Bitmap、HyperLogLog、Geo类型,但这些类型都是基于上述核心数据类型实现的;
- Redis在5.0新增加了Streams数据类型,它是一个功能强大的、支持多播的、可持久化的消息队列。
1.4 Redis是单线程的,为什么还能这么快?
参考答案
- 对服务端程序来说,线程切换和锁通常是性能杀手,而单线程避免了线程切换和竞争所产生的消耗;
- Redis的大部分操作是在内存上完成的,这是它实现高性能的一个重要原因;
- Redis采用了IO多路复用机制,使其在网络IO操作中能并发处理大量的客户端请求,实现高吞吐率。
关于Redis的单线程架构实现,如下图:

1.5 Redis在持久化时fork出一个子进程,这时已经有两个进程了,怎么能说是单线程呢?
参考答案
Redis是单线程的,主要是指Redis的网络IO和键值对读写是由一个线程来完成的。而Redis的其他功能,如持久化、异步删除、集群数据同步等,则是依赖其他线程来执行的。所以,说Redis是单线程的只是一种习惯的说法,事实上它的底层不是单线程的。
1.6 set和zset有什么区别?
参考答案
set:
- 集合中的元素是无序、不可重复的,一个集合最多能存储232-1个元素;
- 集合除了支持对元素的增删改查之外,还支持对多个集合取交集、并集、差集。
zset:
- 有序集合保留了集合元素不能重复的特点;
- 有序集合会给每个元素设置一个分数,并以此作为排序的依据;
- 有序集合不能包含相同的元素,但是不同元素的分数可以相同。
1.7 说一下Redis中的watch命令
参考答案
很多时候,要确保事务中的数据没有被其他客户端修改才执行该事务。Redis提供了watch命令来解决这类问题,这是一种乐观锁的机制。客户端通过watch命令,要求服务器对一个或多个key进行监视,如果在客户端执行事务之前,这些key发生了变化,则服务器将拒绝执行客户端提交的事务,并向它返回一个空值。
1.8 说说Redis中List结构的相关操作
参考答案
列表是线性有序的数据结构,它内部的元素是可以重复的,并且一个列表最多能存储2^32-1个元素。列表包含如下的常用命令:
- lpush/rpush:从列表的左侧/右侧添加数据;
- lrange:指定索引范围,并返回这个范围内的数据;
- lindex:返回指定索引处的数据;
- lpop/rpop:从列表的左侧/右侧弹出一个数据;
- blpop/brpop:从列表的左侧/右侧弹出一个数据,若列表为空则进入阻塞状态。
1.9 你要如何设计Redis的过期时间?
参考答案
- 热点数据不设置过期时间,使其达到“物理”上的永不过期,可以避免缓存击穿问题;
- 在设置过期时间时,可以附加一个随机数,避免大量的key同时过期,导致缓存雪崩。
1.10 Redis中,sexnx命令的返回值是什么,如何使用该命令实现分布式锁?
参考答案
setnx命令返回整数值,当返回1时表示设置值成果,当返回0时表示设置值失败(key已存在)。
一般我们不建议直接使用setnx命令来实现分布式锁,因为为了避免出现死锁,我们要给锁设置一个自动过期时间。而setnx命令和设置过期时间的命令不是原子的,可能加锁成果而设置过期时间失败,依然存在死锁的隐患。对于这种情况,Redis改进了set命令,给它增加了nx选项,启用该选项时set命令的效果就会setnx一样了。
采用Redis实现分布式锁,就是在Redis里存一份代表锁的数据,通常用字符串即可。采用改进后的setnx命令(即命令)实现分布式锁的
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本面试宝典均来自校招面试题目大数据进行的整理


