redis常见的面试题
redis和memched有什么区别,为什么单线程的redis比多线程的memched效率高
string:ky类型
hash:字典redis的哈希结构可以使你像在数据库中更新一个属性一样只修改某一项属性值
list:实现消息队列
set:利用唯一性
zset:可以进行排序,可以实现数据的持久化
数据持久化:
redis通过RDB(Redis DataBase)与AOF(Append Only File)持久化,可以将内存中的数据保存到硬盘中,然后重启之后在读取数据
RDB:
是在达到指定的时间或者 操作次数之后,自动将内存中的数据写入到磁盘中(数据恢复时一致性和完整性较差,因为也许最后一次备份前就宕机了,适合数据量较大的时候数据恢复使用)
AOF:
是日志形式,当数据写入内存中的时候,在日志文件下记录了所有写操作,(数据量较大时候,数据的恢复缓慢)
注意:如果不需要持久化的功能,可以关闭,如果想达到持久化的效果,建议两者都使用(RDB、AOF)
memched不支持数据的持久性的存储
redis中的主从复制是如何实现的,redis的集群模式是如何实现的,redis的key是如何寻址的
主从复制:
a:从服务器连接主服务器,发送SYN命令(写缓存命令)
b:主服务器接收到SYNC命令之后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有命令;BGSAVE命令用于在后台异步保存当前数据库的数据到磁盘
c:主服务器BGSAVE执行完成之后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令
d:从服务器接收到快照文件后丢弃所有的旧数据,加载进入到所有的快照
e:主服务器快照发送完毕之后开始向从服务器发送缓冲区中的命令
f:从服务器完成对快照的载入,开始接受命令请求,并执行来自主服务器缓冲区的写命令
集群模式:
redis集群中内置了16384个哈希槽,当需要在redis集群中放置一个kv键值对的时候,redis先对key使用crc16算法算出一个结果,然后把这个结果对16384求余数,这样每个key都会对应一个编号在0-16384之间的哈希槽,redis会根据节点数量大致均等的将哈希槽映射到不同的节点
寻址:
redis采取链表的方式来存储多个哈希碰撞的键。也就是说,当根据key的哈希值找到该列表后,如果列表的长度大于1,那么我们需要遍历这个链表来找到我们所查找的key,当然,一般情况下链表的长度都是1,所以时间复杂度可以看作是1。我们知道如果哈希表数量达到了一个很大的量级的时候,那么冲突的链的元素数量就会很大,这个时候查询的效率就会变的很慢,因为取值的时候redis会遍历链表。而随着数据量的缩减,也会产生一定的内存浪费。redis在设计的时候充分考虑了字段的增加和缩减,为了优化数据量增加时候的查询效率和缩减时候的内存利用率。redis进行了一系列的操作,而这个操作过程也就被称为了rehash
redis中的分布式锁
什么是分布式锁:
分布式锁是控制分布式系统和不同系统之间共同访问共享资源的一种锁的实现,如果不同的系统或者同一个系统不同主机之间共享了某个资源的时候,往往需要互斥来防止干扰来保持一致性
实现思想:
1、获取锁的时候,使用setnx加锁,并使用expire命令锁添加一个超时时间,超过这个时间就自动释放锁,锁的value值是一个随机生成的UUID,通过此在释放锁的时候进行判读
2、获取锁的时候还设置一个获取的超时时间,若超过这个时间就放弃获取锁
3、释放锁的时候,通过UUID判断是不是该锁,如果只这个锁,就执行delete进行锁的释放