1、redis加锁的几种实现
2、Redis面试题总结1
3、Reidis面试总结2
一、 分布式锁的概念
分布式:当业务量、数据量增加时,可以通过任意增加减少服务器数量来解决问题。
集群时代:至少部署两台Redis服务器构成一个小的集群。
集群的目的:
1. 高可用性:在主机挂掉之后,自动故障转移,使前端服务对用户无影响。
2. 读写分离:将主机读压力分流到从机上。
分布式锁:当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。
二、分布式锁使用场景
分布式锁用来解决分布式情况下的多线程并发问题。
有这样一个情境,线程A和线程B都共享某个变量X。
如果是单机情况下(单JVM),线程之间共享内存,只要使用线程锁就可以解决并发问题。
如果是分布式情况下(多JVM),线程A和线程B很可能不是在同一JVM中,这样线程锁就无法起到作用了,这时候就要用到分布式锁来解决。
三、分布式锁的实现(Redis)
分布式锁实现的关键是在分布式的应用服务器外,搭建一个存储服务器,存储锁信息,这时候我们很容易就想到了Redis。首先我们要搭建一个Redis服务器,用Redis服务器来存储锁信息。
在实现的时候要注意的几个关键点:
1、锁信息必须是会过期超时的,不能让一个线程长期占有一个锁而导致死锁;
2、同一时刻只能有一个线程获取到锁。
几个要用到的redis命令:
setnx(key, value):“set if not exits”,若该key-value不存在,则成功加入缓存并且返回1,否则返回0。
get(key):获得key对应的value值,若不存在则返回nil。
getset(key, value):先获取key对应的value值,若不存在则返回nil,然后将旧的value更新为新的value。
expire(key, seconds):设置key-value的有效期为seconds秒。
del(key):删除给定的一个或多个key,不存在的key会被忽略
采用Jedis作为Redis客户端的API,下面是实现代码