redis分布式锁

redis语法与命令

给你一囗甜甜゛ 提交于 2020-03-08 19:04:36
一、简述 Redis支持的键值类型有:String字符类型、map散列类型、list列表类型、set集合类型、sortedset有序集合类型。接下来对这些键值类型在使用上进行总结,并介绍下Keys命令,虽然语法简单,但由于数量过多,还需要我们多多实践。 二、String字符类型 1、赋值 语法:SET key value 127.0.0.1:6379> set test 123 OK 2、取值 语法:GET key 127.0.0.1:6379> get test "123“ 3、取值并赋值 语法:GETSET key value 127.0.0.1:6379> getset s2 222 "111" 127.0.0.1:6379> get s2 "222" 4、设置/获取多个键值 语法: MSET key value [key value …] MGET key [key …] 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 OK 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379> mget k1 k3 1) "v1" 2) "v3" 5、删除 语法:DEL key 127.0.0.1:6379> del test (integer) 1 6、数值增减 a. 递增数字 当存储的字符串是整数时

Redis复习篇

橙三吉。 提交于 2020-03-08 15:15:31
1.Redis(简单的,高效的,分布式,基于内存的缓存机制) 1.1 性能极高: 读 110000次/s 写 81000次/s 1.2 丰富的数据类型: String,List,Hash,Set,Ordered Set 1.3 Redis操作都是具有原子性的 1.4 Redis单个Key能存入512M大小 2.Redis 数据类型 2.1 String 2.1.1 String类型常用命令: 赋值语法: set key value:设置Key的值,如果key已经存在则覆盖。 ++setnx key value:只有key不存在时设置key的值(解决分布式锁方案之一)。++ 取值语法: get key : 获取key对应的值,如果key不存在则返回nil。 getrange key start end :对获取key对应的值进行截取。 getbit key offset :对key所存储的字符串值,获取指定偏量上的位(bit)。 mget [key1,key2…] : 获取给定一个或多个key的值。 getset key value : 该语法用于设定key的值并返回旧值。 strlen key :返回key存储字符串的长度。 删除语法: del key : 删除指定的key,如果存在返回数字类型。 自增自减: incr key : incr命令将key的值增一。如果key不存在

谁有115资源分享

℡╲_俬逩灬. 提交于 2020-03-08 08:40:08
基于 Redis 实现 CAS 操作 Intro 在 .NET 里并发情况下我们可以使用 Interlocked.CompareExchange 来实现 CAS (Compare And Swap) 操作,在分布式的情景下很多时候我们都会使用 Redis ,最近在改之前做的一个微信小游戏项目,之前是单机运行的,有些数据存储是基于内存的,直接基于对象操作的,最近要改成支持分布式的,于是引入了 redis,原本基于内存的数据就要迁移到 redis 中存储,原来的代码里有一些地方使用了 Interlocked.CompareExchange 来实现 CAS 操作,迁移到 redis 中之后也需要类似的功能,于是就想基于 redis 实现 CAS 操作。 CAS CAS (Compare And Swap) 通常可以使用在并发操作中更新某一个对象的值,CAS 是无锁操作,CAS 相当于是一种乐观锁,而直接加锁相当于是悲观锁,所以相对来说 CAS 操作 是会比直接加锁更加高效的。 Redis Lua redis 从 2.6.0 版本开始支持 Lua 脚本,Lua 脚本的执行是原子性的,所以我们在实现基于 redis 的分布式锁释放锁的时候或者下面要介绍的实现CAS 操作的,要执行多个操作但是希望操作是原子操作的时候就可以借助 Lua 脚本来实现(也可以使用事务来做) 基于 Redis Lua

使用Redis单实例实现分布式锁

自古美人都是妖i 提交于 2020-03-08 06:33:59
为什么使用redis分布式锁 在同一个jvm进程中时,可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源时候,juc包的锁就无能无力了,这时候就需要分布式锁了。常见的有使用zk的最小版本,redis的set函数,数据库锁来实现。 使用分布式锁 package com.jiaduo.DistributedLock; import java.util.Collections; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; public class DistributedLock { private static final String LOCK_SUCCESS = "OK"; private static final String SET_IF_NOT_EXIST = "NX"; private static final String SET_WITH_EXPIRE_TIME = "PX"; private static final Long RELEASE_SUCCESS = 1L; private static void validParam(JedisPool jedisPool, String

redis常见应用场景

♀尐吖头ヾ 提交于 2020-03-06 15:39:26
1、热点数据的缓存 由于redis访问速度块、支持的数据类型比较丰富,所以redis很适合用来存储热点数据,另外结合expire,我们可以设置过期时间然后再进行缓存更新操作,这个功能最为常见,我们几乎所有的项目都有所运用。 2、限时业务的运用 redis中可以使用expire命令设置一个键的生存时间,到时间后redis会删除它。利用这一特性可以运用在限时的优惠活动信息、手机验证码等业务场景。 3、计数器相关问题 redis由于incrby命令可以实现原子性的递增,所以可以运用于高并发的秒杀活动、分布式序列号的生成、具体业务还体现在比如限制一个手机号发多少条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。 4、排行榜相关问题 关系型数据库在排行榜方面查询速度普遍偏慢,所以可以借助redis的SortedSet进行热点数据的排序。 在奶茶活动中,我们需要展示各个部门的点赞排行榜, 所以我针对每个部门做了一个SortedSet,然后以用户的openid作为上面的username,以用户的点赞数作为上面的score, 然后针对每个用户做一个hash,通过zrangebyscore就可以按照点赞数获取排行榜,然后再根据username获取用户的hash信息,这个当时在实际运用中性能体验也蛮不错的。 5、分布式锁 这个主要利用redis的setnx命令进行,setnx:

收藏慢慢看系列:简洁实用的Redis分布式锁用法

烈酒焚心 提交于 2020-03-06 10:19:41
在微服务中很多情况下需要使用到分布式锁功能,而目前比较常见的方案是通过Redis来实现分布式锁,网上关于分布式锁的实现方式有很多,早期主要是基于Redisson等客户端,但在Spring Boot2.x以上版本中使用Redis时,其客户端库已经默认使用lettuce。 所以本文将直接介绍在Spring Boot2.x以上项目中快速使用Redis分布式锁的功能的方法,希望能够更新你的知识库! Redis分布式锁原理概述 实际上Redis服务本身并不提供分布式锁这样的机制,但是作为全局Key-Value存储系统,客户端可以利用Redis提供的基本功能并通过一定的算法设计来实现分布式锁功能。目前已有不少博客文章及代码库描述了如何使用Redis来实现分布式锁,但是许多实现相对比较简单,安全性也比较低。在Redis的官方文档中推荐了一种叫做RedLock的算法来实现基于Redis的分布式锁功能,现阶段已存在基于该算法的多种语言版本的Redis客户端实现库。其中Java领域最为知名的是Redisson库。但由于Redisson不仅实现了分布式锁功能,还额外实现了一套Redis分布式数据结构,因此会显得比较重,加上最新的基于Spring Boot.2.x以上版本使用Redis时,其客户端库已经默认使用了lettuce(比Redisson、Jedis线程更安全、更轻量级的一种Java

redis分布式锁的实现

爱⌒轻易说出口 提交于 2020-03-06 01:41:01
为什么要用分布式锁 使用场景 xx游戏平台举办了一个回馈用户活动,只要等级达到x等级,即可领取xx装备。可能有些人,有过这样的想,是不是,只要我速度够快,就能领到多份奖品啊,想想都美滋滋。结果,系统显示, 当前操作过于频繁,请稍后再试 。what??? 这个的话,就涉及到了锁。同个账号,当我们的第一次请求到服务器的时候,已经被加上了锁,当还没释放锁的时候,再次请求,则不能拿到锁,只能继续等待。(当然这种场景不一定要用分布式锁进行实现,比如数据库的索引唯一性也可实行,只是举个例子) 说到锁的话,则要从公司系统的架构说起了。一开始,很多公司的系统不是很庞大,为了节省资源,单机即可满足需求。对于这种单机模式的系统,我们可以用java原生的synchronized和lock这两种锁,只要锁住相应的类、对象或者方法等即可简单的时间锁机制。 但随着公司的不断发展,用户量的增加,需要对业务进行拆分。这个时候,微服务就出现了,服务拆分了,同时为了保证高可用,每个服务会根据负载等因素,选择部署不同数量的机器,进行集群管理。 在分布式系统的话,则出现了同个服务,部署在不同的机器上。因为我们上面采用的是基于JVM的锁机制,没法保证同个用户请求的锁都是同个JVM(其实可以通过设置负载均衡策略,根据用户id进行hash之类,让用户落到同一台机器上,但这种很少用,毕竟这个是属于业务的问题)

Redis 5.0部署

半城伤御伤魂 提交于 2020-03-05 18:48:25
前言 redis支持的数据类型: 字符串(string)。 哈希表(hash)。 列表(list)。 集合(set)。 有序集合(zset)。 位图(bitmaps)。 HyperLoglogs、GEO等。 redis特性如下: 速度快:基于内存工作,使用离OS最近的C语言编写,使用单线程架构,预防了多线程可能产生的竞争问题。 基于键值对的数据结构服务器:redis中的值不仅仅可以是字符串,关于其支持的数据类型已经在文章开头列出来了。 丰富的功能: 1.键过期功能,用来实现缓存。 2.发布订阅功能,用来实现消息系统。 3.支持Lua脚本,可以利用Lua创造出新的Redis命令。 4.简单的事务功能,能在一定程度上保证事务的特性。 5.提供了流水线(pipeline)功能,这样客户端能将一批命令一次性传到redis,较少网络开销。 简单稳定。 客户端语言多:支持java、PHP、Python、C、C++、Nodejs等。 数据持久化:redis工作在内存中,支持两种持久化方式:RDB、AOF来写入到硬盘中。 主从复制:Redis提供了复制功能,实现了多个相同数据的redis副本。 高可用和分布式:Redis从2.8版本正式提供了高可用实现redis Sentinel,它能够保证Reids节点的故障发现和故障自动转移,从3.0版本提供了分布式实现Redis Cluster

redis学习总结

旧街凉风 提交于 2020-03-05 10:49:42
什么是redis redis是一个nosql(not only sql不仅仅只有sql)数据库.翻译成中文叫做非关系型型数据库. 关系型数据库:以二维表形式存储数据 非关系型数据库: 以键值对形式存储数据(key, value形式) 是一家意大利的创业公司出的,然后后来这家公司被VMware赞助. redis底层用C语句编写. redis是将数据存放到内存中,由于内容存取速度快所以redis被广泛应用在互联网项目中, redis有点:存取速度快,官方称读取速度会达到30万次每秒,写速度在10万次每秒最有,具体限制于硬件. 缺点:对持久化支持不够良好, 所以redis一般不作为数据的主数据库存储,一般配合传统的关系型数据库使用. redis应用领域 分布式缓存 分布式session 保存博客或者论坛的留言回复等. 总之是用在数据量大,并发量高的情况下 怎么用 redis主要就是使用命令来进行操作,java端在代码中可以使用Jedis来操作redis服务器 redis数据类型 字符串String 列表list redis中使用的是双向循环链表来实现的list,在redis中更像栈 散列Hash 一般应用于将redis作为分布式缓存,存储数据库中的数据对象 集合set set中数据是无序的并且不允许重复 有序集合zset redis会根据分数自动排序,这里可以使用在学生成绩排序,

redis分布式锁可靠吗

断了今生、忘了曾经 提交于 2020-03-05 01:10:00
写在前面的话 2020年2月22日来杭, 杭州天气不错, 晴空万里,气温回暖, 疫情彷佛散去, 而我开始了既定的跳槽, 投简历,刷面试片刻未敢停留。 一周下来也差不多面了10来家公司, 反馈还行, 但是并没有想象中的那么好, 总体来看杭州互联网既没有那么好, 也没有想象的那么槽。 所以小伙伴们适度焦虑就OK, 重要的还是提升自己的硬实力。 下面来讲几个面试碰到的有意思的问题吧。 如何确定分布式锁的释放时间? 描述:就是你在使用分布式锁对代码加一个锁,会不会业务没有执行完,锁释放了? 我脑子一转这种情况肯定不能让他发生,不然不是并发了吗。 此时你需要想一下分布式锁的实现???? setnx??? set? 如果你说setnx我估计是要歇菜的,因为你刚好掉进面试官的一个坑里,我们来看下setnx命令 没有过期时间???没有过期时间意味着锁要我们自己手动释放,看下伪代码 if ( setnx ( 'key' , 1 ) ) { // 1. try{ // 2.业务逻辑 }catch ( Exception e ) { // 3.异常处理 }finally{ // 4. del 'key' } } 假设在上述代码的1或者4处出现异常,或者说是出现error,比如内存溢出,jvm直接不可用,那么这个锁是不是就释放不掉了??别的线程就无法访问这段代码了,这就是死锁的现象。基于这个问题