redis分布式锁

史上最全阿里 Java 面试题总结

与世无争的帅哥 提交于 2019-11-28 16:14:15
以下为大家整理了阿里巴巴史上最全的 Java 面试题,涉及大量 Java 面试知识点和相关试题。 JAVA基础 JAVA中的几种基本数据类型是什么,各自占用多少字节。 String类能被继承吗,为什么。 String,Stringbuffer,StringBuilder的区别。 ArrayList和LinkedList有什么区别。 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字 段,当new的时候,他们的执行顺序。 用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们 内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。 JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何 设计。 有没有有顺序的Map实现类,如果有,他们是怎么保证有序的。 抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口 么。 继承和聚合的区别在哪。 IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型。 反射的原理,反射创建类实例的三种方式是什么。 反射中,Class.forName和ClassLoader区别 。 描述动态代理的几种实现方式,分别说出相应的优缺点。 动态代理与cglib实现的区别。

redis 正确实现分布式锁的正确方式

陌路散爱 提交于 2019-11-28 16:11:53
前言 最近在自己所管理的项目中,发现redis加锁的方式不对,在高并发的情况有问题。故在网上找搜索了一把相关资料。发现好多都是互相抄袭的,很多都是有缺陷的。好多还在用redis 的 setnx命令来实现分布式锁。其实redis 中的set命令本身就已经集成了setnx命令的功能了,而且比其还强大。这里,我使用 redis-cli 客户端 结合lua脚本 原生 的实现redis 分布式锁。 准备材料 redis-server redis-cli LUA 与 REDIS 的关系 从 redis2.6.0 开始, redis 内部就内置了lua解释器。lua也就是成了redis扩展的一种解决方案了。 格式: eval scripts num [keys ...] [argv ...] eval : redis中执行lua脚本的命令 scripts : lua脚本,不必一定得是lua函数 num : keys 的个数,用于区分 keys 和 argv ;没有keys,则写0 keys: 可变数组,一般用于表示redis 的键,下标从1 开始 argv: 可变数组,一般用于表示redis 的值,下标从1 开始 redis 与 lua 的交互 分两种情况: redis 执行 lua 脚本 : 使用 redis中的 eval命令 即可 lua & redis lua 接收 redis

分布式锁实现

廉价感情. 提交于 2019-11-28 15:03:18
在微服务开发中常用的分布式有redis,zookeeper实现,下面就基于这两种分布式锁实现做一个总结: 1,zookeeper的分布式锁实现 基于ZooKeeper分布式锁的流程 在zookeeper指定节点(locks)下创建临时顺序节点node_n 获取locks下所有子节点children 对子节点按节点自增序号从小到大排序 判断本节点是不是第一个子节点,若是,则获取锁;若不是,则监听比该节点小的那个节点的删除事件 若监听事件生效,则回到第二步重新进行判断,直到获取到锁 具体实现 下面就具体使用java和zookeeper实现分布式锁,操作zookeeper使用的是apache提供的zookeeper的包。 通过实现Watch接口,实现process(WatchedEvent event)方法来实施监控,使CountDownLatch来完成监控, 在等待锁的时候使用CountDownLatch来计数,等到后进行countDown,停止等待,继续运行。 以下整体流程基本与上述描述流程一致,只是在监听的时候使用的是CountDownLatch来监听前一个节点。 (1) pom.xml <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3

redis面试总结(二)

人走茶凉 提交于 2019-11-28 13:08:37
7.redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗? 考点分析 在前几年,redis 如果要搞几个节点,每个节点存储一部分的数据,得 借助一些中间件 来实现,比如说有 codis ,或者 twemproxy ,都有。有一些 redis 中间件,你读写 redis 中间件,redis 中间件负责将你的数据分布式存储在多台机器上的 redis 实例中。 这两年,redis 不断在发展,redis 也不断的有新的版本,现在的 redis 集群模式,可以做到在多台机器上,部署多个 redis 实例,每个实例存储一部分的数据,同时每个 redis 实例可以挂 redis 从实例,自动确保说,如果 redis 主实例挂了,会自动切换到 redis 从实例顶上来。 现在 redis 的新版本,大家都是用 redis cluster 的,也就是 redis 原生支持的 redis 集群模式,那么面试官肯定会就 redis cluster 对你来个几连炮。要是你没用过 redis cluster,正常,以前很多人用 codis 之类的客户端来支持集群,但是起码你得研究一下 redis cluster 吧。 如果你的数据量很少,主要是承载高并发高性能的场景,比如你的缓存一般就几个 G,单机就足够了

Redis缓存,持久化,高可用

与世无争的帅哥 提交于 2019-11-28 12:43:15
一,Redis作缓存服务器 ​ 本篇博客是接着 上一篇 博客未分享完的技术点。 ​ redis作为缓存服务器是众多企业中的选择之一,虽然该技术很成熟但也是存在一定的问题。就是缓存带来的缓存穿透,缓存击穿,缓存失效问题,继而引用分布式锁。 1.1,缓存穿透 ​ 在如今的项目中大多采用垂直的MVC架构,由service层去调用DAO层,然后DAO层再去查询数据库。而redis作为缓存服务器就是在service层去调用DAO层去查询时先去缓存服务器查询,如果存在则直接返回该数据,否则再去查询数据库。由此可知,这么做大量减少了对磁盘I/O的操作,减轻了数据库的压力。 ​ 现在我们假设一种情况,在数据库中存在有id为1到1000的数据。现在如果有人手动去模拟一个id为1001的请求,那么该数据在缓存服务器中是不存在的,因而便会去查询数据库。那么问题来了,如果是一个大量无效的请求去查询数据库。则势必会对数据库造成难以承受的压力,这种情况就是所谓的缓存穿透。 ​ 那如何解决呢? ​ 1,将查询到的null值直接保存到缓存服务器中,但是这种做法并不推荐,因为如果是大量不同的请求id同样会去查询数据库。 ​ 2,接口的限流,降级与熔断 ​ 在项目中对于重要的接口一定要做限流,对于以上恶意攻击的请求除了要限流,还要做好降级准备,并且进行熔断,这种做法可以有效控制大量无效请求。 ​ 3,布隆过滤器 ​

Redis----NoSql数据库笔记

蹲街弑〆低调 提交于 2019-11-28 10:40:00
介绍:Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API的非关系型数据库。 传统数据库遵循 ACID 规则。而 Nosql(Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称) 一般为分布式而分布式一般遵循 CAP 定理。 Redis支持的数据类型? String字符串: 格式: set key value string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。 string类型是Redis最基本的数据类型,一个键最大能存储512MB。 Hash(哈希) 格式: hmset name key1 value1 key2 value2 Redis hash 是一个键值(key=>value)对集合。 Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 List(列表) Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 格式: lpush name value 在 key 对应 list 的头部添加字符串元素 格式: rpush name value 在 key 对应

蚂蚁金服经典技术面试题:Tomcat+Redis+线程池与锁+MQ实现

拈花ヽ惹草 提交于 2019-11-28 08:10:47
一面:技术面 1.讲一下项目 2.做的主要是Java对吧,讲一下多线程把,用到哪些写一下 3.写了thread和runnable,然后写了线程池,又问了线程池由哪些组件组成,有哪些线程池,分别怎么使用,以及拒绝策略有哪些。 4.什么时候多线程会发生死锁,写一个例子吧,然后我写了一个两个线程,两个锁,分别持有一个,请求另一个的死锁实例。 5.集合类熟悉吧,写一个题目,一个字符串集合,找出pdd并且删除。 6.然后说一下Redis吧,是单线程还是多线程,Redis的分布式怎么做? 7.RPC了解么,我说了主要是协议栈+数据格式+序列化方式,然后需要有服务注册中心管理生产者和消费者。 9.TCP三次握手的过程,如果没有第三次握手有什么问题。 二面:主要问解决问题的思路 1、如果让你实现一个MQ,怎么样保证消息不丢失? 2、硬盘io速度会变慢,有什么解决办法吗? 3、mysql的innodb索引数据结构为什么是b+树,用hash来实现可以吗? 4、分布式事务的实现? 5、如何解决redis和mysql数据一致性? 6、常见的MySQL主从同步方案有哪些?优劣势比较过? 7、先谈秒杀的设计思路? 8、再谈谈秒杀如何防止超卖? 9、你有什么想问我的? 三面 说说HaspMap底层原理?再说说它跟HaspTable和ConcurrentHashMap他们之间的相同点和不同点? 讲讲jdk1

redis 面试题 基础知识篇

牧云@^-^@ 提交于 2019-11-28 07:46:11
1.常见数据类型、常见指令、内部数据结构以及用途? 数据类型 常见指令 内部数据结构 用途 String (字符串) set get incr decr del 通过int/sds()作为存储结构,int存放整形数据,sds存放字节、字符串、浮点型数据 常见的get/set操作,存短信验证码,常规计数,微博数,粉丝数 List (列表) lpush rpush lpop rpop lrange redis3.2前,List类型的value对象内部以linkedlist或者ziplist来实现, 当list的元素个数和单个元素的长度比较小 的时候,采用ziplist(压缩列表)来实现来减少内存占用。 redis3.2后,采用的一种叫quicklist的数据结构来存储list,列表的底层都由quicklist实现 排行榜,最热、活跃度最高的数据、简单的消息队列等功能 Hash (散列) hset heget hexist hdel hashtable、ziplist,数据量小的时候用ziplist,多了用hashtable 存储结构化的用户信息,商品信息之类的对象 Set (集合) sadd spop srem smembers sunion intset(只包含整数型用)、hashtable 实现如共同关注、共同粉丝、共同喜好 Sorted-Set (有序集合) zadd

111

我们两清 提交于 2019-11-28 06:29:50
数据库: B树就是 B-树 B&B+都用到了磁盘块的概念,每块大概4k,利用了磁盘的预读和同一数据块内很有可能一起用到 Redis端口6379 事务四大特性(ACID)原子性(不可再分 要么都发生 要么不发生)、一致性、隔离性、持久性 数据库隔离级别:读取未提交数据=脏读,可以读取其他事务提交的数据 大多数默认级别,不可重复读-MySQL默认,可重读=幻读 InnoDB默认,串行化 读写阻塞。并行依次降低,安全性提高。 innodb和myisam区别:MyIsam-允许没有主键 表锁 不产生死锁 读快 不支持事务操作,外键以及行级锁 保存表行数count直接返回行数 支持全文索引 存储数据文件 索引/数据文件分离 索引文件保存数据地址; InnoDB-没主键或非空唯一索引它会自动生成一个用户不可见的主键 不保存表的行数,count()会遍历整个表,但是加上where俩引擎都一样 不支持全文索引 写较快 并发高 索引和数据一起存在表空间-数据记录本身被存于主索引的叶子节点上 行锁,并发高,可能死锁 表数据文件就是主索引-叶节点包含完整数据记录,数据按照主键聚集,所以InnoDB必须有主键,没有也会 自生成长度6字节的 辅助索引先检索主键再根据主键找到数据 设计主键时长度不能过大因为辅助索引都引用主索引,过大引起辅助索引过大 使用单调的字段,非单调在插入新数据时会为了维持其特性而频

基于redis的分布式锁简单实现

血红的双手。 提交于 2019-11-28 05:40:13
/** * 主要用于在分布式环境下对于共享资源的操作进行锁定 */ public class RedisLock { private RedisTemplate redisTemplate; //获取锁最长等待时间;10秒 private static final long WAIT_TIME_OUT = 10 * 1000; //锁的过期时间;3秒 private static final int LOCK_EXPIRE_TIME = 3 * 1000; public RedisLock(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } /** * 在一定的限定时间内 获取某一类资源或操作的锁 * * @param key 键名(可以随便指定;一般为某一类资源或操作命名) * @return true or false */ public Boolean lock(String key) throws InterruptedException { long timeOut = WAIT_TIME_OUT; while (timeOut > 0) { long expireTime = System.currentTimeMillis() + LOCK_EXPIRE_TIME; Boolean