redis分布式锁

Redis分布式锁——悲观锁实现,以秒杀系统为例

冷暖自知 提交于 2019-11-27 08:06:55
Redis分布式锁——悲观锁实现,以秒杀系统为例 分布式锁 Redis命令介绍 代码实现 AbstractLock基类 实现类 上面使用到的Redis工具类 测试 输出结果 分布式锁 分布式锁是一种用来安全访问分布式机器上变量的安全方案,一般用在全局id生成、秒杀系统、全局变量共享、分布式事务等。一般会有两种实现方案,一种是悲观锁的实现,一种是乐观锁的实现。悲观锁的并发性能差,但是能保证发生脏数据的可能性小一点。 Redis命令介绍 使用Redis实现分布式锁,有两个重要函数需要介绍: SETNX命令 ( SET if N ot e X ists) 语法: SETNX key value 功能: 当前仅当key不存在,将key的值设为value,并返回1;若给定的key已经存在,则SETNX不做任何动作,并返回0。 GETSET命令 (这是一个原子命令!) 语法: GETSET key value 功能: 将给定key的值设为value,并返回key的旧值(old value);当key存在但不是字符串类型时,返回一个错误;当key不存在时,返回nil。 GET命令 语法: GET key 功能: 返回key所关联的字符串值,如果key不存在那么返回特殊值nil,如果key 储存的值不是字符串类型,返回一个错误。 DEL命令 语法: DEL key [key…] 功能:

Redis全面解析

本小妞迷上赌 提交于 2019-11-27 02:26:07
1、什么是Redis? Redis是BSD协议,是一个高性能的key-value非关系型数据库。 2、redis单线程问题 所谓的单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。 redis采用多路复用机制:即多个网络socket复用一个io线程,实际是单个线程通过记录跟踪每一个Sock(I/O流)的状态来同时管理多个I/O流. 3、Redis特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据,同时还提供String,list,set,zset,hash等数据结构的存储。 Redis支持数据的备份,即master-slave模式的数据备份。 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。 丰富的特性 – Redis还支持 publish/subscribe, 通知, 设置key有效期等等特性。 4、Redis作用 因为是存在内存中,可以减轻数据库压力,查询内存比查询数据库效率高。 5、Redis应用场景 token生成、验证码、共享session、分布式锁、自增id 6

redis面试全面总结

喜夏-厌秋 提交于 2019-11-27 01:36:58
一、你用redis的应用场景是什么? 秒杀的库存扣减,APP首页的访问流量高峰,缓存,排行榜,短信验证码(限流),点赞、好友等相互关系的存储,限时业务的运用 二、redis与memecache有区别? 1、集群: redis 和memcached都支持集群 2、数据类型 Redis支持的数据类型要丰富得多,Redis不仅仅支持简单的k/v类型的数据,同时还提供String,List,Set,Hash,Sorted Set,pub/sub,Transactions数据结构的存储。其中Set是HashMap实现的,value永远为null而已 memcache支持简单数据类型,需要客户端自己处理复杂对象 3、持久性 redis支持数据落地持久化存储,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。 memcache不支持数据持久存储 4、分布式存储 redis支持master-slave复制模式 memcache可以使用一致性hash做分布式 5、value大小不同 memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用 6、数据一致性不同 Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。 而在100k以上的数据中

Redis的那些最常见面试问题

不想你离开。 提交于 2019-11-26 23:45:43
  1.什么是redis?    Redis 是一个基于内存的高性能key-value数据库。    2.Reids的特点      Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性      能最快的Key-Value DB。    Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消      息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。    Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。    3.使用redis有哪些好处?    (1) 速度快,因为数据存在内存中,类似于HashMap

乐观、悲观锁、redis分布式锁

懵懂的女人 提交于 2019-11-26 23:40:31
悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。 乐观锁 总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。 来源: https://www.cnblogs.com/wzjwffg/p/11335460.html

Redis实现分布式锁

我是研究僧i 提交于 2019-11-26 23:05:33
写一个定时任务,然后把demo放在三台机器上,定时推送信息,客户端保证只能接收到一条 1、IBaseRedisDao public interface IBaseRedisDao { public String get(String key); public Boolean set(String key, String value); public Long delete(String key); public Boolean exists(final String key); public Boolean expire(String key, Long expireTime); public Boolean setnx(final String key, final String value); public Void setrange(final String key, final String value, final Long offset); } 2、BaseRedisDao import javax.annotation.Resource; import org.springframework.dao.DataAccessException; import org.springframework.data.redis.connection.RedisConnection

Redis面试题汇总

人走茶凉 提交于 2019-11-26 22:07:56
1.AOF和RDB的区别:一个存储执行命令,一个存储数据结果 转自: https://yq.aliyun.com/articles/610418 1、什么是Redis? 答:Redis全称为:Remote Dictionary Server(远程数据服务),是一个基于内存的高性能key-value数据库。 2、Redis的数据类型? 答:Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 我们实际项目中比较常用的是string,hash如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog、Geo、Pub/Sub。 如果你说还玩过Redis Module,像BloomFilter,RedisSearch,Redis-ML,面试官得眼睛就开始发亮了。 3、使用Redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,list,set,Zset,hash等 (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除 4

利用Redis实现排队需求

时光毁灭记忆、已成空白 提交于 2019-11-26 21:18:46
利用Redis实现排队需求 近期在项目中做了一个用户排队等待接入客服的需求,此文记录自己的实现思路与过程,以及一些考虑的异常。 需求 大部分人都有排队等待接入客服的经历,所以需求不难理解:“存在一个在线客服列表,用户发起接入请求时,从客服列表中选择空闲的进行配对接入,如果没有可用客服则用户进入等待队列,每当出现客服空闲时接入等待队列中的第一个用户”。 设计 这部分主要描述自己从需求中理解的实体与关系以及选择它们的存储方式。 实体 从这个需求中分解出来的实体有以下几种: 客服 用户 房间 客服接待用户所处的“空间”称为房间,主要作为客服-用户沟通的载体 等待队列 所有没能进入房间的用户形成的队列,是一个先来先服务(FIFO)的队列 房间这个实体是虚拟出来的,可以让用户与客服直接产生联系,这样就不需要房间实体。 关系 上述实体之间的关系: 客服-房间 房间与客服绑定,伴随客服存在,客服接待用户时房间处于占用状态 用户-房间 用户被接入时,用户与房间处于暂时绑定关系且与客服产生间接关系,构成关系: 客服-房间-用户 用户-等待队列 没能被接入的用户都处于等待队列中 存储 确定实体与关系后,接着考虑如何存储这些实体与关系,有如下几种选择: 内存 列内存这个选项主要是给小白看,因为曾经在一个项目中见到有人这么做的,所以我认为有必要强调一下选内存方案的致命缺点: 无法水平扩展,在Node

基于注解的锁

爷,独闯天下 提交于 2019-11-26 21:15:09
/*--> */ /*--> */ /*--> */ /*--> */ Redisson分布式锁 之前的 基于注解的锁 有一种锁是基本redis的分布式锁,锁的实现我是基于redisson组件提供的RLock,这篇来看看redisson是如何实现锁的。 不同版本实现锁的机制并不相同 引用的redisson最近发布的版本3.2.3,不同的版本可能实现锁的机制并不相同,早期版本好像是采用简单的setnx,getset等常规命令来配置完成,而后期由于redis支持了脚本Lua变更了实现原理。 <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.2.3</version> </dependency> setnx需要配合getset以及事务来完成,这样才能比较好的避免死锁问题,而新版本由于支持lua脚本,可以避免使用事务以及操作多个redis命令,语义表达更加清晰一些。 RLock接口的特点 继承标准接口Lock 拥有标准锁接口的所有特性,比如lock,unlock,trylock等等。 扩展标准接口Lock 扩展了很多方法,常用的主要有:强制锁释放,带有效期的锁,还有一组异步的方法。其中前面两个方法主要是解决标准lock可能造成的死锁问题。比如某个线程获取到锁之后

Redis学习笔记(一):Redis常用数据类型之string、hash和list的命令

六月ゝ 毕业季﹏ 提交于 2019-11-26 21:08:21
微信公众号 redis是日常开发中最常的非关系型数据库,可以说只要是个项目基本都会使用到。常用来做数据缓存、分布式锁等等。redis的基本安装内容就不说了(在之前的博客搭建系列里面有提到redis的安装使用,如果不会的可以看一下),后面更新会说一下其配置文件中主要的配置信息。 redis常用的数据类型str、hash、list、set、zset,但是最常用的应该就是前三种,这篇文章里面就是用来记录和说明这前三种数据类型常使用的命令。虽然在实际开发过程中很少使用这些命令,但是了解这些命令,会更有利于对redis相关API的理解和使用。 redis为什么快 redis为什么速度这么快,这是面试常见的面试题,更是项目中使用它的原因。 redis是使用C语言编写,更接近底层的编程语言 redis是基于内存存储数据,获取和存储数据都是在内存中 redis是单线程处理,没有锁的竞争,减少了性能消耗,虽然是单线程,处理速度上并不慢,因为其是基于内存做处理,没有和磁盘间繁琐的读写IO过程(具体redis单线程原理,后期会再更新博客详细说明) redis数据类型之str 字符串类型是最常用的,可能很多简单小型项目用来缓存数据都只会用到这一种数据类型。 常用命令 set key value [ex seconds] [px milliseconds] [nx|xx] :存储数据,key是键唯一