Q1:redis是单线程的,为什么会有并发问题?
A:redis是单线程的,单个命令执行时是不会有并发问题的。但是例如i++操作,如果在应用程序中采用了多线程,就会有并发问题。
Q2:redis是单线程的,怎么处理并发请求?
A:redis采用IO多路复用来处理并发请求,把多个client请求存放在队列中,采用事件轮询方式处理请求。
Q3:redis事务的是怎么处理的
A: redis采用Multi,Exec来实现事务。Multi标识事务开始,Exec执行命令。redis中的事务能保证一系列指令中间不会插入别的指令。如果有一个操作出错,不会执行回滚。事务执行时会阻塞其它客户端的请求执行。
Q4:redis的watch指令和事务的区别?
A:i++操作分为单个步骤:1、val = get i;2、val=val+1;3、set i。假设 i=1,如果多个连接同时执行第一步,那么在操作执行结束时,i并不是期望的3,很有可能是2。对于这种情况单纯采用Multi,Exec无法得到期望的结果。
Watch命令可用于提供CAS(check-and-set)功能。假设我们通过Watch命令在事务执行之前监控了多个Keys,倘若在Watch之后有任何Key的值发生了变化,Exec命令执行的事务都将被放弃,同时返回Null multi-bulk应答以通知调用者事务执行失败。例如:
WATCH i
val = GET i
val = val + 1
MULTI
SET i $val
EXEC
获取i的值之前先通过WATCH命令监控了该键,此后又将set命令包围在事务中,这样就可以有效的保证每个连接在执行EXEC之前,如果当前连接获取的i的值被其它连接的客户端修改,那么当前连接的EXEC命令将执行失败。这样调用者在判断返回值后就可以获悉val是否被重新设置成功。
Q5:redis是单线程的,再多核机器上怎么使用?
A:可以运行多个redis实例,组成master-slave形式。
Q6:master-slave
1、master可以拥有多个slave
2、多个slave可以连接同一个master外,还可以连接到其他slave
3、主从复制不会阻塞master,在同步数据时,master可以继续处理client请求
4、提高系统的伸缩性