1. 什么是redis?
答:是C语言编写的,支持网络(即需要端口支持),基于内存也可以持久化的key-value数据库。本质是服务器-客户端软件程序。
2. redis和hashmap的区别?
答:redis独立部署,能存放的value类型也比hashmap多。而一个定义好的hashmap只能支持一种value类型。
3. redis支持什么数据类型?
答:string,int,list(元素可重复,可以实现list和stack的功能,可用于关注列表/粉丝列表等场景),set(元素不重复,可以取交集等,可用于共同好友/共同关注等场景),sorted set(带有排序功能,可用于排行榜等场景),hash(约等于hashmap),geo(可用于地理场景的位置),stream(类似mq的应用,可以支持发布订阅)。
4. redis处于保护模式应该如何解决?
答:默认只允许本地的服务器进行访问,修改bind=0.0.0.0(允许公网所有用户访问),但是这样会有安全问题。
5. redis的性能和什么有关?
答:和服务器的CPU性能以及是否使用了pipeline进行批量操作。可以使用官方推荐的方式进行测试。
6. 如何用redis实现订单支付的功能?
答:订单支付涉及到超时的问题,可以在redis中创建一个临时订单,有15分钟的超时时间,如果超时之后未支付redis会发送expired的事件,如果用户在规定时间内支付了,则删除redis中该订单的id,当该订单id在redis中被删除的时候,可以监听redis系统事件del,从而修改数据库的订单。需要通过config进行文件配置。此时请注意redis是可以存放多个不同的数据库,可以通过下标来筛选。
7. redis的stream框架原理是怎么样的?
答:首先如果只是普通的发布定义模式,消费者只能收到启动之后的消息。但是stream则允许存储一些消息,使得消费者可以从offset去读取自己想要的消息,可以通过XDEL来删除处理了的消息。还可以通过consumer group来增强处理消息的能力,此时需要XACK来确认已经处理了消息,如果没有确认,则该消息会被扔回去(pending),需要XCLAIM来重新消费,具体概念和kafka接近。因为可能没有消息,主动读取的时候可能会造成消费者阻塞,阻塞到设定的时间,则返回空。

8. redis的持久化方式有什么?
答:有两种,一种是将当前内存数据做二进制快照,另一种是将执行过的命令存下来回放,两种持久化方式都有策略,根据写入频率来批量操作。



9. redis如何进行内存管理?
答:内存达到某个阈值的时候,需要采取某个内存策略。内存在某些情况下会压缩存储的信息,因为压缩需要用CPU,所以只有当数量低于某个程度的时候才会进行压缩。大小超出压缩范围,溢出后redis自动将其转换为正常大小。
10. redis如何处理过期数据?


11. redis的回收策略是什么?



12. redis的主从复制策略是什么?


13. redis的主从复制流程是什么?
答:全量是指将快照发送过来,增量是指将命令发送过来。如果从服务器之前跟的是同一个主服务器,则增量发送命令,如果换了主服务器,则需要全量发送快照。主从复制可以用于数据安全的方面,只允许读从服务器,而不允许修改;同时可以提高服务器的吞吐量;最后还可以通过把持久化功能挪到从服务器,将持久化对主服务器的影响减少。
当主服务器挂了之后,不要设置自动重启,因为主服务器的数据都丢失了,从服务器也会丢失。此时要么需要将从服务器备份的快照主动挪到主服务器,要么设置从服务器为主服务器,将主服务器变为从服务器。





14. redis上如何监控每个服务器的运行命令?
答:使用monitor就可以监控主从,例如读写分离是否正确。
15. redis的哨兵机制是什么样的?
答:为了实现高可用,能够自动切换主从服务器,redis添加了哨兵机制,类似于zookeeper,一群哨兵去ping主从服务器,当一群(而不仅仅是一个)哨兵都同意主服务器出现问题(因为有可能是哨兵自己的网络问题,而不是主服务器出现问题),则开始切换主从服务器。客户端只有当不知道谁是主服务器的时候才会和哨兵联系,如果和主服务器正常交流的时候是不会经过哨兵的。哨兵通过主服务器,可以知道主服务器上面的配置,就能知道从服务器的地址。




16. Redis哨兵流程中问题有哪些?
-
哨兵如何知道redis主从信息
1 -
什么是master主观下线(sdown)
2 -
什么是master客观下线(odown)
3 -
哨兵之间如何通信?
4 -
哪个哨兵负责故障转移?
请查看文档
5 -
slave的选举机制?
5 -
最终主从切换的流程是什么?
6
17. 哨兵应该如何配置?
答:不推荐只部署两个哨兵,因为出现问题的时候无法判断客观下线。所以官方推荐第二个图。但是即使是第二个图,也是会出现问题的。当出现网络分区(即网络不能连接的时候),例如master和两个从服务器失去联系,此时master还能正常运作,两个从服务器发现不能连接主服务器,此时两个从服务器就会开始选举,导致有两个master在运行。
所谓的强一致和非强一致(即最终一致),强一致代表时时刻刻都一样,非强一致代表在网络分区结束之后,数据会进行合并,在最后选择版本号较高的数据,使得所有主从服务器数据一致。

18. 为什么需要分片存储?
答:分配存储先用哈希获取分片所在的位置,然后进行存储,redis会把服务器分成16383个槽,将不同的槽分配到不同的服务器,槽只是用于映射,不用存存储数据。客户端只需要连接到其中一个服务器即可,第一次如果连接错了,服务器会返回正确的分片服务器地址给客户端让客户端重新连接。也可以让客户端存储哈希分片的算法,让客户端自己计算和缓存。假如增加了服务器,服务器返回位置错误,则客户端需要更新自己的缓存信息,获取新的服务器算法。
集群模式下,读写分离默认是不行的,需要手动设置。集群模式推荐集群机器大小不超过1000个,因为机器之间会有通讯和交流,需要消耗带宽。
读写分离的时候,会出现主从数据不一致的状况。







20. redis集群模式是否可以替代哨兵?
答:是。因为实现了自动高可用。
21. 为什么nosql不能完全代替sql?
答:因为在网络分区的时间内可能会数据不一致,丢失写操作。提高了性能,但是不能维持一致性。
22. redis集群开源方案还有什么?
答:除了官方的集群方案,还可以豌豆荚开源的codis,twitter开发的twemproxy,但是两者都处于不活跃的状态。
23. redis如何做监控?
- 用monitor监控,只是用来debug,因为开启的话会降低性能。
- 可以用info命令来查看信息。
-
redis live可以用来图形化监控,建议和redis服务器分开部署,因为redis live需要存储监控的数据,一般是存储在redis上面,所以在redis live上面需要额外多开一个redis服务。
info
24. redis集群的重定向是根据什么来执行的?
答:moved重定向和ask重定向对比, 两者都是客户端单重定向
- moved:槽已经确定转移
- ask:槽还在迁移中
24. HyperLogLogs是什么?
答:请看
25. redis常见的五种基本数据类型是什么?
- String
- List
- Hash
- set
- zset
26. 如何查看redis是否在正常运行?
答:用ping这个命令即可,不是CMD里面的ping,是redis cli自带的ping
27. AOF是Redis的一种持久化方式,并且可以人为的改动持久化之后的数据
28. 考虑采用两级缓存架构的原因可能有哪些?
- 减少网络消耗
- 提高数据访问速度
29. redis的集群数量最多为多少个?
答:16384个。
30. redis中stream和pub/sub的区别是什么?
与redis的pub/sub不同,pub/sub多个客户端是收到相同的数据,而stream的多个客户端是竞争关系,每个客户端收到的数据是不相同的
pub/sub中一旦触发数据获取,不会记录下上一次拿的位置,意味着客户端无法重复去拿以前的数据,而blpop方式一旦pop,数据就会永久的删除,也无法重复去拿以前的数据。而Stream会永久的存放数据,并且客户端会保留上一次拿的id,甚至通过修改id可以拿回以前的数据。和kafka的机制类似。
Stream提供了消费者组(kafka也有),不同组接收到的数据完全一样(前提是条件一样),但是组内的消费者则是竞争关系(还是和kafka一样)。
31. redis的什么机制或者数据结构可以在一定场景代替mq?
- stream
- pub/sub
- List







