redis分布式锁

redis基础

笑着哭i 提交于 2020-01-01 14:31:36
文章目录 Redis 常见问题 关于的知识点总结成了思维导图 1、什么是 Redis? 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性能问题和解决方案: 10、redis 过期键的删除策略? 11、Redis 的回收策略(淘汰策略)? 12、为什么 edis 需要把所有数据放到内存中? 13、Redis 的同步机制了解么? 14、Pipeline 有什么好处,为什么要用 pipeline? 15、是否使用过 Redis 集群,集群的原理是什么? 16、Redis 集群方案什么情况下会导致整个集群不可用? 17、Redis 支持的 Java 客户端都有哪些?官方推荐用哪个? 18、Jedis 与 Redisson 对比有什么优缺点? 19、Redis 如何设置密码及验证密码? 20、说说 Redis 哈希槽的概念? 21、Redis 集群的主从复制模型是怎样的? 22、Redis 集群会有写操作丢失吗?为什么? 23、Redis 集群之间是如何复制的? 24、Redis 集群最大节点个数是多少? 25

Redis常见面试题

房东的猫 提交于 2019-12-31 23:44:52
1、什么是Redis?   Redis 是一个基于内存的高性能key-value数据库,不过在系统中一般充当高速缓存的角色。 2、为什么Redis需要把所有数据放到内存中?    访问内存的速度远高于访问硬盘的速度,如果不将数据放在内存中,磁盘I/O速度将严重影响Redis的性能。在内存越来越便宜的今天,Redis将会越来越受欢迎。 3、对Redis的访问为什么是单进程单线程的   Redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。Redis的开发者认为Redis的性能瓶颈不在CPU,而是网络等因素。所以采取单线程的方式是最快的。单线程能够有效避免CPU切换的开销,另外I/O多路复用技术也有效的提升了访问速度。 4、Reids的特点(Redis的好处) 访问速度快。原因归结为三个方面:一是数据存储在内存中;二是对数据的访问是单线程操作,避免了不必要的IO开销;三是底层的数据结构合理,类似于hashMap,存取的时间复杂度为O(1)。 拥有丰富数据类型。支持string,list,hash ,set,sorted set五种类型 支持事务。拥有与传统数据库不同的独特的事务特性。在Redis中,一个事务中所有命令操作具有原子性 可以持久化缓存数据。拥有AOF和RDB两种持久化方式,保证系统重启数据不丢失 拥有成熟的可扩展,高可用的分布式解决方案。像Redis

Redis安装和使用

核能气质少年 提交于 2019-12-30 04:29:29
简介 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、一个高性能的key-value数据库。并提供多种语言的API。说到Key-Value数据库NoSQL数据库可以想到MongoDB。 和Memcached类似,但是它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 用redis就要有数据丢失的准备。 通过homebrew安装redis brew install redis 安装的文件保存在/usr/local/bin下 运行 sudo redis-server 检测 运行后自动在后台运行,关闭后也会继续运行。可以使用端口检测命令来查看。 lsof -i tcp:6379    连接redis redis-cli 存值 set name pgy    设置缓存时间

NoSQL那些事--Redis

为君一笑 提交于 2019-12-30 01:22:50
Redis是个流行的内存数据库(in-momery)。接口好用,性能也很强,还支持多种数据结构,加上各种高可用性集群方案,实在是太太太好用了。 但是就是因为太好用了,好用到让很多人都晕了脑子: 用Redis性能就大大提高了 用Redis可以保证原子性 用Redis可以实现事务 用Redis可以当队列 …… 这就好像一个股民,在手机上操作买卖几笔股票,赚了一些,然后感叹道"股市就是为我发财而存在的啊"!!他的下场可想而知。 Redis的种种优势源自于他的设计——简单直接的单线程内存操作。但这些优势是有前提的。 Redis的性能高,吗? Redis的性能非常高。有些评测说用Redis可以达到几十万QPS(比如这里 http://skipperkongen.dk/2013/08/27/how-many-requests-per-second-can-i-get-out-of-redis/ )。大家可能在网文上记住了这个NB的数字,却很少关心这个数值怎么来的。这就像是你买手机评测光看跑分一样不靠谱。 Redis要达到高性能需要做到: Value尽可能的小。一般的测评都会用比较小的value,比如一个整数或者不长的字符串。但是如果用Redis做缓存,那么缓存的大小的可能偏离这个数字。比如一个页面几十KB;再比如,一个5年的市场价格序列数据可能高达几MB

使用Redis的分布式Java锁

こ雲淡風輕ζ 提交于 2019-12-29 00:11:20
通过优锐课的java学习分享中,了解有关分布式锁定以及如何在项目中实现它的更多信息! 什么是分布式锁定? 在多线程程序中,不同的线程可能需要访问相同的资源。但是,允许所有线程同时访问资源可能导致争用情况,错误和其他意外行为。 为了确保没有两个线程可以同时访问同一资源,并确保以可预测的顺序对资源进行操作,程序员使用一种称为锁的机制。每个线程首先获取锁,然后对资源进行操作,最后将锁释放给其他线程。 在Java中,由于多种原因,锁定对象通常比使用同步块更灵活。首先,Lock API可以以不同的方法运行,而同步块完全包含在一个方法中。 另外,如果线程被阻止,则无法访问同步的块。使用Lock,该线程将仅在可用时获取锁。这大大减少了线程等待的时间。另外,当线程正在等待时,可以调用一种方法来中断线程,而当线程正在等待获取同步块时,这是不可能的。 分布式锁定意味着你不仅需要考虑多个线程或进程,还需要考虑在不同计算机上运行的不同客户端。这些单独的服务器必须进行协调,以确保它们中的任何一个在任何给定时间都在使用资源。 基于Redis的分布式Java锁定工具 Redisson框架是用于Java的基于Redis的内存数据网格,可为需要执行分布式锁定的程序员提供多个对象。 下面,我们将讨论每个选项及其之间的区别。 1.锁 RLock接口在Java中实现java.util.concurrent.locks

redis分布式锁

泪湿孤枕 提交于 2019-12-27 04:23:16
1.使用setNx做分布式锁:setnx只能设置一次值,第二次会设置失败 public Boolean setSecondTime ( String key , String value , Long secondTime ) { try { boolean flag = client . setNX ( key , value ) ; client . expire ( key , secondTime , TimeUnit . SECONDS ) ; } catch ( Exception e ) { log . error ( "jimdbservice setSecondTime" , e ) ; } return flag ; } try { if ( boardJimdbService . setSecondTime ( Sale_Task_key , "111" , 8 L ) ) { //TODO } } catch ( Exception e ) { } finally { boardJimdbService . del ( Sale_Task_key ) ; } 来源: CSDN 作者: 诸葛子房_ 链接: https://blog.csdn.net/weixin_43291055/article/details/103709487

redis分布式锁

霸气de小男生 提交于 2019-12-27 01:33:58
如何解决 Redis 的并发竞争 Key 问题 所谓 Redis 的并发竞争 Key 的问题也就是多个系统同时对一个 key 进行操作,但是最后执行的顺序和我们期望的顺序不同,这样也就导致了结果的不同! 推荐一种方案:分布式锁(zookeeper 和 redis 都可以实现分布式锁)。(如果不存在 Redis 的并发竞争 Key 问题,不要使用分布式锁,这样会影响性能) 基于zookeeper临时有序节点可以实现的分布式锁。大致思想为:每个客户端对某个方法加锁时,在zookeeper上的与该方法对应的指定节点的目录下,生成一个唯一的瞬时有序节点。 判断是否获取锁的方式很简单,只需要判断有序节点中序号最小的一个。 当释放锁的时候,只需将这个瞬时节点删除即可。同时,其可以避免服务宕机导致的锁无法释放,而产生的死锁问题。完成业务流程后,删除对应的子节点释放锁。 在实践中,当然是从以可靠性为主。所以首推Zookeeper。 Redis分布式锁 1.设置锁的失效时间为30s 2.开一个后台线程,每隔10s检查是否还持有锁,如果持有,重新给锁赋值30s 3.finally释放锁 4.释放自己加的那把锁 redis分布式代码 @RestController public class RedisDistributedLockController { @Autowired private

最全的Redis解析,赶紧收藏

扶醉桌前 提交于 2019-12-26 22:49:27
在这篇文章中,我们将彻底了解 Redis 的使用场景、Redis 的五种数据结构,以及如何在 Spring Boot 中使用 Redis,文章的最后还会列举面试过程中经常被问到的关于 Redis 的问题以及其解决方案。 Redis 简介 Redis 是一个开源(BSD 许可)、内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合等数据类型。内置复制、Lua 脚本、LRU 收回、事务以及不同级别磁盘持久化功能,同时通过 Redis Sentinel 提供高可用,通过 Redis Cluster 提供自动分区。在实际的开发过程中,多多少少都会涉及到缓存,而 Redis 通常来说是我们分布式缓存的最佳选择。Redis 也是我们熟知的 NoSQL(非关系性数据库)之一,虽然其不能完全的替代关系性数据库,但它可作为其良好的补充。 Redis 使用场景 微服务以及分布式被广泛使用后,Redis 的使用场景就越来越多了,这里我罗列了主要的几种场景。 分布式缓存 :在分布式的系统架构中,将缓存存储在内存中显然不当,因为缓存需要与其他机器共享,这时 Redis 便挺身而出了,缓存也是 Redis 使用最多的场景。 分布式锁 :在高并发的情况下,我们需要一个锁来防止并发带来的脏数据,Java 自带的锁机制显然对进程间的并发并不好使,此时可以利用

【分布式缓存系列】集群环境下Redis分布式锁的正确姿势

匆匆过客 提交于 2019-12-24 12:03:03
一、前言   在上一篇文章中,已经介绍了基于Redis实现分布式锁的正确姿势,但是上篇文章存在一定的缺陷——它加锁只作用在一个Redis节点上,如果通过sentinel保证高可用,如果master节点由于某些原因发生了主从切换,那么就会出现锁丢失的情况: 客户端1在Redis的master节点上拿到了锁 Master宕机了,存储锁的key还没有来得及同步到Slave上 master故障,发生故障转移,slave节点升级为master节点 客户端2从新的Master获取到了对应同一个资源的锁   于是,客户端1和客户端2同时持有了同一个资源的锁。锁的安全性被打破了。针对这个问题。Redis作者antirez提出了RedLock算法来解决这个问题 二、RedLock算法的实现思路   antirez提出的redlock算法实现思路大概是这样的。   客户端按照下面的步骤来获取锁: 获取当前时间的毫秒数T1。 按顺序依次向N个Redis节点执行获取锁的操作。这个获取锁的操作和上一篇中基于单Redis节点获取锁的过程相同。包括唯一UUID作为Value以及锁的过期时间(expireTime)。为了保证在某个在某个Redis节点不可用的时候算法能够继续运行,这个获取锁的操作还需要一个超时时间。它应该远小于锁的过期时间。客户端向某个Redis节点获取锁失败后,应立即尝试下一个Redis节点

19年12月份面试集合【redis】

独自空忆成欢 提交于 2019-12-24 05:11:55
了解缓存穿透、缓存雪崩、缓存击穿以及解决方案 分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁 1、如何保证Redis高可用和高并发? Redis主从架构,一主多从,可以满足高可用和高并发。出现实例宕机自动进行主备切换,配置读写分离缓解Master读写压力。 2、Redis高可用方案具体怎么实施? 使用官方推荐的哨兵(sentinel)机制就能实现,当主节点出现故障时,由Sentinel自动完成故障发现和转移,并通知应用方,实现高可用性。它有四个主要功能: 集群监控,负责监控redis master和slave进程是否正常工作。 消息通知,如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员。 故障转移,如果master node挂掉了,会自动转移到slave node上。 配置中心,如果故障转移发生了,通知client客户端新的master地址。 3、你能说说Redis哨兵机制的原理吗? 通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决。每个sentinel会向其它sentinal、master、slave定时发送消息,以确认对方是否活着,如果发现对方在指定时间内未回应,则暂时认为对方宕机