Redis面试题整理(全)

Redis是一个内存中的key-value存储系统,支持多种数据结构如string、list、set等,并提供原子操作。它的使用场景包括缓存、消息队列等。Redis具有持久化功能,如RDB和AOF,确保数据丢失时能恢复。此外,Redis支持哨兵系统进行故障转移和复制,以及集群方案以扩展内存和提高可用性。尽管早期版本是单线程模型,但Redis6.0开始引入多线程来优化网络IO处理,但命令执行核心仍保持单线程。
摘要由CSDN通过智能技术生成

Redis面试题整理:

什么是Redis?

解析:Redis是一个key-value存储系统,它支持存储的value类型相对更多,包括string、list、set、zset(sorted set --有序集合)和hash。这些数据结构都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中,Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。


Redis都有哪些使用场景?

解析:Redis使用场景如下:

1. Redis是基于内存的nosql数据库,可以通过新建线程的形式进行持久化,不影响Redis单线程的读写操作
2. 通过list取最新的N条数据
3. 模拟类似于token这种需要设置过期时间的场景
4. 发布订阅消息系统
5. 定时器、计数器

Redis有哪些功能?

解析:
1、基于本机内存的缓存 :当调用api访问数据库时,假如此过程需要2秒,如果每次请求都要访问数据库,那将对服务器造成巨大的压力,如果将此sql的查询结果存到Redis中,再次请求时,直接从Redis中取得,而不是访问数据库,效率将得到巨大的提升,Redis可以定时去更新数据(比如1分钟)。

2、 如果电脑重启,写入内存的数据是不是就失效了呢,这时Redis还提供了持久化的功能。

3、哨兵(Sentinel)和复制 :Sentinel可以管理多个Redis服务器,它提供了监控、提醒以及自动的故障转移功能;复制则是让Redis服务器可以配备备份的服务器;Redis也是通过这两个功能保证Redis的高可用;

4、集群(Cluster):单台服务器资源总是有上限的,CPU和IO资源可以通过主从复制,进行读写分离,把一部分CPU和IO的压力转移到从服务器上,但是内存资源怎么办,主从模式只是数据的备份,并不能扩充内存; 现在我们可以横向扩展,让每台服务器只负责一部分任务,然后将这些服务器构成一个整体,对外界来说,这一组服务器就像是集群一样。


Redis支持的数据类型有哪些?

解析:Redis支持的数据类型如下:

1. 字符串
2. hash
3. list
4. set
5. zset

Redis取值存值问题?

解析:Redis取值存值问题如下:

1. 先把Redis的连接池拿出来
	JedisPool = new JedisPool(new JedisPoolConfig(),"127.0.0.1");
	Jedis jedis = pool.getResource();	

2. 存取值

	jedis.set("key","value");
	jedis.get("key");
	jedis.del("key");
	//给一个key叠加value
	jedis.append("key","value2");//此时key的值就是value + value2;
	//同时给多个key进行赋值:
	jedis.mset("key1","value1","key2","value2");

3、对map进行操作
	
	Map<String,String> user = new HashMap();
	user.put("key1","value1");
	user.put("key2","value2");
	user.put("key3","value3");
	//存入
	jedis.hmset("user",user);
	//取出user中key1 
	List<String> nameMap = jedis.hmget("user","key1");
	//删除其中一个键值
	jedis.hdel("user","key2");
	//是否存在一个键
	jedis.exists("user");
	//取出所有的Map中的值:
	Iterator<String> iter = jedis.hkeys("user").iterator();
	while(iter.next()){
	    jedis.hmget("user",iter.next());
	}


Redis为什么是单线程的?

解析:Redis支持的数据类型如下:

1. 代码更清晰,处理逻辑更简单;
2. 不用考虑各种锁的问题,不存在加锁和释放锁的操作,没有因为可能出现死锁而导致的性能问题;
3. 不存在多线程切换而消耗CPU;
4. 无法发挥多核CPU的优势,但可以采用多开几个Redis实例来完善;

Redis真的是单线程的吗?

解析:Redis支持的数据类型如下:

1. Redis6.0之前是单线程的,Redis6.0之后开始支持多线程;
2. redis内部使用了基于epoll的多路服用,也可以多部署几个redis服务器解决单线程的问题;
3. redis主要的性能瓶颈是内存和网络;
4. 内存好说,加内存条就行了,而网络才是大麻烦,所以redis6内存好说,加内存条就行了;
5. 而网络才是大麻烦,所以redis6.0引入了多线程的概念,
6. redis6.0在网络IO处理方面引入了多线程,如网络数据的读写和协议解析等,
7. 需要注意的是,执行命令的核心模块还是单线程的。

Redis持久化有几种方式?

解析:Redis支持的数据类型如下:

1. redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)
2. RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
3. AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来。
4. 在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
5. 其实RDB和AOF两种方式也可以同时使用,在这种情况下,
6. 如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。

Redis和 memecache 有什么区别?

解析:Redis和 memecache 有什么区别如下:

1. Redis相比memecache,拥有更多的数据结构和支持更丰富的数据操作。
2.1)Redis支持key-value,常用的数据类型主要有String、Hash、List、Set、Sorted Set。
3.2)memecache只支持key-value。
4. 内存使用率对比,Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于memecache。
5. 性能对比:Redis只使用单核,memecache使用多核。
6. Redis支持磁盘持久化,memecache不支持。
7. Redis可以将一些很久没用到的value通过swap方法交换到磁盘。
8. Redis支持分布式集群,memecache不支持。

Redis支持的 java 客户端都有哪些?

解析:Redis支持的 java 客户端都有:

1. Redisson
2. Jedis
3. lettuce 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北顾丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值