面试集锦(一)redis与nginx

redis的概念

redis是一个基于内存的key-value的nosql数据库

redis的数据结构及应用场景

(1)string: key-value形式,用作会话缓存及全页缓存

(2)hash:字典

(3)list: 列表,实现消息队列

(4)set:集合,利用唯一性可以用于排序,可以数据持久化

(5)sorted set: 有序集合,用于实现优先队列,给每条消息加上唯一的序号,可以用作排行榜和计数器

redis分布式锁

原生实现

(1)setnx命令,返回1则获得锁

(2)如果为0,则使用get命令获得锁的超时时间,当超时时间小于当前时间时,说明已经过期,再使用getset命令加锁即可

(3)锁是由某个程序加的,必须由哪个程序释放,如果不释放会死锁。(最坏的情况就是超时自动删除key)

分布式

redission实现,其中的lock方法已经避免了死锁

解锁:使用del命令

会出现的问题:在分布式情况下,A进程获取到锁,在超时时间内没有完成,导致锁自动释放了,此时B进程获得锁,然后释放就会出现B将A的释放

解决办法:在解锁的时候判断锁是不是自己加的,所以在加锁的时候需要传递一个参数value,将此参数作为key的value,解锁时只要对比value是否相等就行了。

在设置redis集群并设置master/slave情况下可以避免一个redis down后所有锁失效的情况

jedis和redission的区别

(1)两个都是redis的客户端,是redis的实现框架

(2)jedis调用的都是redis暴露的api,所以支持的方法多

(3)redission进行了封装,方法较少,多用于分布式环境,解决了分布式锁的问题

(4)redission是线程安全的,jedis是不安全的

redis分布式与主从配置

主从同步

1.master为主,slave为从,一般只有一个master

2.Master可读可写,Slaver只读不写

3.当master挂掉时,可以通过slave of no one命令将Slaver升级为Master,手动方式

4.可以通过sentinel哨兵模式监控Master,当Master挂掉时自动选举Slaver变为Master,其它Slaver自动重连新的 Master

5.Master写入后立即返回,几乎同时将写入异步同步到各个Slaver,所以基本上延迟可以忽略

哨兵模式

哨兵的作用就是监控redis主、从数据库是否正常运行,主出现故障自动将从数据库转换为主数据库。(哨兵是一个单独的进程)

    新的主刚被选出来,老的主恢复,这时老的主会变为新的从

    新的主被选出来一会一会老的主才回复,不会变为新主的从节点,而是一个独立的节点。(当然可以通过哨兵的配置文件修改为从节点)

其实sentinel也应该做成集群,防止sentinel挂掉。

集群

一个 redis 集群包含 16384 个哈希槽(hash slot),数据库中的每个数据都属于这16384个哈希槽中的一个。集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽。集群中的每一个节点负责处理一部分哈希槽。(这里可采用一致性hash算法。)

集群至少需要3主3从,且每个实例使用不同的配置文件,主从不用配置,集群会自己选。当1个主故障,大家会给对应的从投票,把从立为主,若没有从数据库可以恢复则redis集群就down了

nginx

1.用作反向代理服务器,服务请求到nginx,由nginx负责转发到内部服务器

2.负载均衡服务器,集群环境下修改配置环境即可

    方法:轮询,ip hash,权重,随机,最小连接数

3.用作http服务器,指向静态资源(如文件服务器)




你可能感兴趣的:(面试集锦(一)redis与nginx)