redis常见问题
1.为什么使用redis?
答:redis是一种典型的nosql即非关系数据库,并且工作在内存中,处理数据效率高,很适合充当整个互联网架构中各级之间的缓存。并且可以减轻访问数据库的压力,海量访问可能造成数据库宕机。redis的存储结构是key-value(五种不同的数据类型,String、hash、list、set、zset),这五种数据结构可以很好地描述实际的业务,不必为了适应关系数据库而做一些抽象。redis还提供了数据持久化。通过主从复制实现了redis高可用。
2.redis的五种数据结构的应用场景?
string、hash:可以实现数据的缓存
list:提供消息队列,在商品秒杀是可以使用
set:集合实现好友、兴趣、课程
zset:排行榜的应用
3.redis工作在内存中是如何实现数据持久化的?
redis持久化的实现,由两种方式构成aof和rdb。
aof是把每次写的操作都已追加的方式记录在文件中刷到磁盘,可以实现每秒同步命令,所以aof的数据一致性强。aof保存的是命令set name xxx。
rdb是每个一段时间进行一次快照,保存到rdb文件中,所以rdb的数据一致性不强,可能造成大量提及丢失。rdb保存的是key-value值。
区别:aof性能高,数据一致性高,但是aof随之数据越来越多,aof的文件大小越大,如何恢复数据可能造成卡顿
4.redis-cluster如何实现的?
引用了槽道原理。将一块完整的内存空间被多个节点分割,每个节点平均分配16384个槽道。并且每个节点通过握手记录彼此节点的信息(基于二级制传输协议优化传输速度)。当一条数据要存入缓存时,通过计算它的key值对16384取模,得到结果,对照每个节点的槽道范围,看是否属于归他管理,如果是则直接调用set命令存储,如果不是则返回客户到指定节点存储。如果某个节点出现宕机,则其余节点会投票。如果该节点实现了主从复制,则会从从节点选出一个作为主节点。如果没有从节点,则会将该节点的槽道平均分配到其余节点。
5.槽道原理如何决定管理权和寻找正确节点?
槽道的结构:槽道是一个虚拟的计算概念,内存保存了2个结构对应一个槽道。
位序列:每个槽道管理者内存中都有二进制,长度为16384,每个下标对应一个二进制值,通过对key值进行计算,对应二进制下标的二进制值是1,则进行管理,如果是0,则不管理。如果不管理通过自索引数组返回给用户指定的节点去存储。
索引数组,数组的长度是16384个元素,每个元素对应引用变量知道槽道号的管理节点信息。