redis分布式锁

关于Redis的十个高频面试问题

匿名 (未验证) 提交于 2019-12-03 00:44:02
    文件来自大神的分析,小弟引用。希望更多的资源能被更多的人分享到!!! 一.Redis有哪些数据结构? 字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。 如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog、Geo、Pub/Sub。 如果你说还玩过Redis Module,像BloomFilter,RedisSearch,Redis-ML,你在面试官心中的评分就会激增 二. 使用过Redis分布式锁吗,它是什么回事? 先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。 这时候对方会告诉你说你回答得不错,然后接着问如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样? 这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你需要抓一抓自己得脑袋,故作思考片刻,好像接下来的结果是你主动思考出来的,然后回答:我记得set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!对方这时会显露笑容,心里开始默念:摁,这小子还不错 三. 假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来? 使用keys指令可以扫出指定模式的key列表。 对方接着追问

redis 集群,分布式

匿名 (未验证) 提交于 2019-12-03 00:44:02
其他方案: http://www.infoq.com/cn/news/2014/11/open-source-redis-cache?utm_source=infoq&utm_medium=related_content_link&utm_campaign=relatedContent_articles_clk http://haiziwoainixx.iteye.com/blog/2087154 分布式锁: http://blog.csdn.net/u013970991/article/details/52722680 主从复制,读写分离 从库作为读库,主库作为写库(默认),实现自动同步,实现冗余备份,读写分离 redis-server --port 6380 --slaveof 127.0.0.1 6379 或者运行时使用命令:slaveof ip port 停止作为从库 slaveof no one 查看主从信息:info replication 登录从库查看:redis-server ―port port redis-cli -p port 从数据登录有密码的主库:从库配置文件设置masterauth 过程: 从数据库启动时,发送SYNC给主库,主库收到命令会保存快照,在保存快照期间的命令缓存,完成后,主库把欢唱和快照发给从库(从网络直接发送,不经过硬盘,需要手动开启)

redis实现分布式锁原理解析

匿名 (未验证) 提交于 2019-12-03 00:44:02
Ŀ¼ 分布式锁,是控制分布式系统之间同步访问共享资源的一种方式 。在分布式系统中,常常需要协调各个系统之间的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。 使用的是redisson框架操作redis命令。redisson实现了redlock算法,提供了异步,公平性等高级功能。添加maven依赖。 <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.11.1</version> </dependency> java实现的基于单机模式redis的分布式锁,集群模式于该模式类似,可靠性更高 public class RedisConfig { private static int count = 0; // 代表分布式环境下要争夺得资源 private String address = "127.0.0.1:6379"; private String password = "961113"; // private String poolSize= "20"; // private String database= "10"; public

Redis API

匿名 (未验证) 提交于 2019-12-03 00:44:02
redis-server # 使用默认配置 ps-ef I grep redis netstat-antpl I grep redis redis-cli-h ip-p port ping redis-server -p 6380 redis-server /path/to/conf daemonize 是否是守护进程(nolyes) port Redis 对外端口号 logfile Redis系统日志 dir Redis工作目录 config get * keys keys * key 后面可以使用正则表达式,但是一般推荐在生产环境中使用这个命令 bdsize 计算key的总数 exists 判断是否存在 存在就返回1,不存在就返回0 del key-value 删除指定的key-value 成功删除1 不存在0 expire expire key seconds 设置seconds秒后过期 ttl 查看剩余的过期时间 persist 去掉过期时间 -2 代表不存在 -1代表存在,但是没有设置过期时间 type type key 返回key的过期时间 上面的命令出了keys 是O(n),其他全都是O(1). 单线程为什么这么快? 1、纯内存2、非阻塞IO 3、避免线程切换和竟态消耗 一次只运行一次命令 拒绝长命令 缓存,分布式锁,计数器。 get key

redis三个框架

匿名 (未验证) 提交于 2019-12-03 00:43:02
Jedis api 在线网址:http://tool.oschina.net/uploads/apidocs/redis/clients/jedis/Jedis.html redisson 官网地址:https://redisson.org/ redisson git项目地址:https://github.com/redisson/redisson lettuce 官网地址:https://lettuce.io/ lettuce git项目地址:https://github.com/lettuce-io/lettuce-core 概念:   Jedis:是Redis的Java实现客户端,提供了比较全面的Redis命令的支持,   Redisson:实现了分布式和可扩展的Java数据结构。   Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。 优点:   Jedis:比较全面的提供了Redis的操作特性   Redisson:促使使用者对Redis的关注分离,提供很多分布式相关操作服务,例如,分布式锁,分布式集合,可通过Redis支持延迟队列   Lettuce:主要在一些分布式缓存框架上使用比较多 可伸缩: Jedis:使用阻塞的I/O,且其方法调用都是同步的,程序流需要等到sockets处理完I/O才能执行

基于Redis的分布式锁

匿名 (未验证) 提交于 2019-12-03 00:43:02
Redis分布式锁 1、锁场景 需要对同一共享资源进行写操作 对资源的访问是互斥的 任务通过竞争获取锁才能才能对该资源进行操作(竞争锁) 当有一个任务对资源进行操作时(占有锁) 其他任务不能对该资源进行操作(任务阻塞) 直到该任务操作结束(释放锁) 竞争锁 -> 占有锁 -> 任务阻塞 -> 释放锁 graph LR A(竞争锁) -->B(占有锁) B(占有锁) --> C[任务阻塞] C[任务阻塞] --> D[释放锁] 2、实现思路 加锁: 通过setnx向特定的key写入一个随机值,并设置失效时间,写值成功即加锁成功 1、必须给锁设置失效时间:避免死锁 2、加锁时,每个节点产生一个随机字符串:避免误删锁 3、写入随机值与设置失效时间同一命令:保证原子性 解锁: 匹配随机值,删除redis上特定的key数据,保证获取数据,判断一致性,以及删除数据也是原子性 if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end 3、代码实现 1、RedisTemplate实现 基于RedisTemplate简单封装的RedisHelper,这不是重点 实现Lock接口,完成加锁解锁的redis操作 1、tryLock:加锁操作(注意设置有效时间防止死锁

redis分布式锁(避免死锁)

匿名 (未验证) 提交于 2019-12-03 00:43:02
package com.example.demo.dao.redis; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import javax.annotation.Resource; @Slf4j @Component public class RedisLock { @Resource private StringRedisTemplate redisTemplate; /** * 加锁 * * @param value 当前时间+超时时间 * @return 是否拿到锁 */ public boolean lock(String key, String value) { //setnx命令 if (Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(key, value))) { return true; } String currentValue =

Redis系列文章总结:ASP.Net Core 中如何借助CSRedis实现一个安全高效的分布式锁

匿名 (未验证) 提交于 2019-12-03 00:43:02
原文: Redis系列文章总结:ASP.Net Core 中如何借助CSRedis实现一个安全高效的分布式锁 引言:最近回头看了看之前和同事一起开发的.Net Core 2.1的项目,其中在多处用到Redis实现的分布式锁,虽然在OnResultExecuting方法中做了防止死锁的处理,但在某些场景下还是会发生死锁的问题,下面我只展示部分代码: 问题: (1)这里setnx设置的值“1”,我想问,你最后del的这个值一定是你自己创建的吗? (2)图中标注的步骤1和步骤2不是原子操作,会有死锁的概率吗? 大家可以思考一下先,下面让我们带着这两个问题往下看,下面介绍一下使用Redis实现分布式锁常用的几个命令。 一、使用Redis实现分布式锁常见的几个命令 命令:SETNX key value 说明:将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。 时间复杂度:O(1) 返回值:设置成功,返回1 ; 设置失败,返回 0 命令:GETSET key value 说明:将给定 key 的值设为 value ,并返回 key 的旧值(old value)。当 key 存在但不是字符串类型时,返回一个错误。 时间复杂度:O(1) 返回值

redis缓存

匿名 (未验证) 提交于 2019-12-03 00:43:02
Redis 作为数据查询 Redis 作为资源的存储 redis mysql缓存模式一般采用cache Aside Pattern模式(该模式不是能够实现,缓存实现写入到数据库中,如果需要这样的,可以使用ignite缓存): 失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中 命中:应用程序从cache中取数据,取到后返回 更新:先把数据存到数据库中,成功后,再让缓存失效(更新数据库时,并不更新Redis缓存,而是在失效操作)。 作为缓存,需要应对几个问题 缓存穿透,缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。 key不存在时,大量的数据进来查询DB 缓存雪崩,某个时间点上,大量缓存都失效了,大量请求落在数据库上,而数据库无法承受造成雪崩 缓存击穿,在并发的情况下,大量请求同时请求某一个key,而该key失效了,并发的请求就会落在数据库上,而后压垮数据库 解决这些问题的方法: 有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中

使用Redlock实现分布式锁

匿名 (未验证) 提交于 2019-12-03 00:26:01
之前写过一篇文章 《如何在springcloud分布式系统中实现分布式锁?》 ,由于自己仅仅是阅读了相关的书籍,和查阅了相关的资料,就认为那样的是可行的。那篇文章实现的大概思路是用setNx命令和setEx配合使用。 setNx是一个耗时操作,因为它需要查询这个键是否存在,就算redis的百万的qps,在高并发的场景下,这种操作也是有问题的。关于redis实现分布式锁,redis官方推荐使用redlock。 一、redlock简介 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段。实现高效的分布式锁有三个属性需要考虑: 安全属性:互斥,不管什么时候,只有一个客户端持有锁 效率属性A:不会死锁 效率属性B:容错,只要大多数redis节点能够正常工作,客户端端都能获取和释放锁。 Redlock是redis官方提出的实现分布式锁管理器的算法。这个算法会比一般的普通方法更加安全可靠。关于这个算法的讨论可以看下 官方文档 。 二、怎么用java使用 redlock 在pom文件引入redis和redisson依赖: <!-- redis--> < dependency > < groupId > org.springframework.boot </ groupId > < artifactId > spring-boot-starter-data-redis </