1.Redis的常见应用场景。
1. (电商网站)秒杀抢购
2. (视频直播)消息弹幕
3. (游戏应用)游戏排行榜
4. (社交APP)返回最新评论/回复
1. 缓存
2. 排行榜
3. 计数器
4. 最热前N条数据
5. 分布式锁
6. 订阅发布
7. 限速
描述Redis的数据类型。
Redis 支持的数据类型有字符串、散列、列表、集合、有序集合。
Redis数据库的集群架构。
Redis支持三种主要的集群模式,分别是主从复制模式、哨兵模式、集群模式。
(1)主从复制模式
主节点复制形成从节点,主节点(Master)负责处理写入操作,而从节点(Slave)则是主节点的副本,用于处理读取操作和提供数据冗余。
(2)哨兵模式
在主从复制模式的基础上增加了自动故障转移的功能。哨兵节点(Sentinel)监控主节点和从节点的状态,当主节点出现故障时,哨兵会自动将一个从节点升级为新的主节点,并通知其他从节点和客户端新的主节点地址,以此来保证Redis服务的高可用性。
(3)集群模式
Redis集群模式通过数据分片来实现分布式存储。集群中的每个节点负责一部分数据(即一部分哈希槽),并且每个主节点可以有一个或多个从节点。集群模式不仅支持数据的自动分区,还支持主从复制和故障转移,从而实现了高可用性和可扩展性。
Redis的持久化方式是什么?各自的优缺点?
Redis提供两种持久化机制RDB(默认)(通过快照(内存中数据在某一时刻的状态记录)的方式实现持久化,根据快照的触发条件,将内存的数据快照写入磁盘,以二进制的压缩文件进行存储)和AOF机制(以独立日志的方式记录每次写的命令,重启时重新执行AOF文件中的命令恢复数据);
RDB优点:
(1)大规模的数据恢复,并且对数据恢复的完整性要求不高,使用RDB比AOF更高效
(2)以二进制压缩文件的形式存储,占用内存更小
(3)redis使用bgsave命令进行持久化,基本不会影响主进程,保证了redis的高性能
(1)只有一个文件 dump.rdb,方便持久化;
(2)容灾性好,一个文件可以保存到安全的磁盘;
(3)性能最大化,fork子进程来完成写操作,让主进程继续处理命令,所以是IO最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了Redis的高性能;
(4)相对于数据集大时,比 AOF 的启动效率更高;
缺点:
(1)数据安全性低;
(2)RDB 是间隔一段时间进行持久化,如果在持久化时Redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候;
AOF优点:
(1)数据安全,AOF持久化可以配置 appendfsync 属性,有always属性,每进行一次命令操作就记录到AOF文件中一次;
(2)通过append模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题;
(3)AOF机制的rewrite模式。AOF文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall);
缺点:
(1)AOF文件比RDB文件大,且恢复速度慢;
(2)数据集大的时候,比RDB启动效率低;
5.Redis的事务是什么?怎么操作实现?它和传统的MySQL数据库事务有什么不同。
(1)Redis的事务是一组命令的集合,本质是批处理(不会回滚),即将多个指令放入一个队列,并批量顺序执行,且在执行过程中不会被其他客户端的命令请求打断。
(2)
①开启事务: 使用MULTI命令开启事务。
②添加命令: 在MULTI和EXEC之间,命令被添加到事务队列。
③执行事务: 使用EXEC命令执行事务中的所有命令。
④取消事务: 使用DISCARD命令取消事务。
(3)
①命令执行时机:
Redis事务: Redis事务是命令的集合,可以批量提交。但在MULTI和EXEC之间,其他客户端也可以插入命令执行,Redis不会阻塞这些命令的执行。如果在执行事务之前,监视的键被其他客户端修改,整个事务将被取消。
MySQL事务: MySQL事务在开始时会对数据进行锁定,其他事务无法修改受影响的数据,直到当前事务提交或回滚。
②原子性:
Redis事务: Redis事务不支持回滚(ROLLBACK)。如果在事务执行期间出现错误,部分命令可能会执行成功,而另一部分可能失败,Redis事务不会回滚已执行的命令。
MySQL事务: MySQL事务支持回滚操作,如果事务执行失败或被取消,可以回滚到事务开始前的状态。
③持久性:
Redis事务: Redis事务默认情况下不写入磁盘,数据存储在内存中。如果Redis服务器宕机或重启,事务中的数据可能会丢失。
MySQL事务: MySQL事务通过日志机制将数据持久化到磁盘,保证在故障发生时能够恢复数据。
④一致性:
Redis事务: 在Redis事务中,如果一组命令中的某些命令执行失败,可能会导致部分数据变化而另一部分没有变化,从而破坏了数据的一致性。
MySQL事务: MySQL事务能够确保事务内的所有操作要么全部成功,要么全部失败,保持了数据库的一致性。
总体来说,Redis事务主要用于一系列Redis命令的原子性执行,但不具备MySQL事务那样的ACID(原子性、一致性、隔离性、持久性)特性。MySQL事务提供了更强的一致性和持久性,可以在数据完整性方面提供更强的保障。