Redis的分布式锁如何实现
1.加锁:利用setnx指令设置分布式锁,其中key是固定字符串,value是当前的机器码加上线程ID,机器码主要是为了区分不同机器
2.解锁:某个线程获取分布式锁后,执行业务,然后在finally代码块中执行解锁命令。其中解锁前先要判断redis中存储的value是否为当前机器码加上线程ID。只有同一个机器的同一个线程才能解锁成功。
3.finally代码块中,get和del并非原子操作,还是有进程安全问题。可以使用lua脚本,通过redis的eval/evalsha命令来运行。执行也是一个命令(eval/evalsha)去执行的,一条命令没执行完,其他客户端是看不到的。
跳跃表
跳跃表可以理解为分层的链表结构,每一层都是一个链表,链表中的元素是排好序。查找元素时会从高层开始往后找,如果找不到就往下一层找。他的一个查询效率和删除效率都为O(logn),效率比较高。通常是用在Redis中的SortSetS数据结构中。
布隆过滤器
布隆过滤器是用来进行大规模数据过滤的数据结构,可以从大规模的数据中判断当前数据,就是key是否合法。布隆过滤器本质上是一个bit数组,一位对应着一个数据,比起map,set占用空间更少,效率更高。元素在加入布隆过滤器时,会先计算一个哈希值,然后根据哈希值得到数组的下标,然后将下标修改为1。在判断一个元素是否在布隆过滤器时,也会进行哈希计算得到下标,判断当前下标的值是否为1,为1说明存在,不为1则不在。由于不同元素计算出的下标可能相同,所以可能出现误判的情况。但是对于不存在元素,是不会出现误判的。布隆过滤器通常用在防止黑客攻击中。