精华内容
下载资源
问答
  • 首先咱们先聊聊单机的Redis分布式 第一个最普通的实现方式,就是在 redis 里使用 setnx 命令创建一个 key,这样就算加锁。 SET resource_name my_random_value NX PX 30000 执行这个命令就 ok。 NX:...

    Redis分布式锁

    单机Redis分布式锁
    单机Redis分布式锁

    在这里插入图片描述
    首先咱们先聊聊单机的Redis分布式锁
    在这里插入图片描述
    第一个最普通的实现方式,就是在 redis 里使用 setnx 命令创建一个 key,这样就算加锁。

    SET resource_name my_random_value NX PX 30000
    

    执行这个命令就 ok。

    • NX:表示只有 key 不存在的时候才会设置成功。(如果此时 redis 中存在这个 key,那么设置失败,返回 nil)
    • PX 30000:意思是 30s 后锁自动释放。别人创建的时候如果发现已经有了就不能加锁了。

    释放锁就是删除 key ,但是一般可以用 lua 脚本删除,判断 value 一样才删除:

    -- 删除锁的时候,找到 key 对应的 value,跟自己传过去的 value 做比较,如果是一样的才删除。
    if redis.call("get",KEYS[1]) == ARGV[1] then
        return redis.call("del",KEYS[1])
    else
        return 0
    end
    

    为啥要用 random_value 随机值呢?因为如果某个客户端获取到了锁,但是阻塞了很长时间才执行完,比如说超过了 30s,此时可能已经自动释放锁了,此时可能别的客户端已经获取到了这个锁,要是你这个时候直接删除 key 的话会有问题,所以得用随机值加上面的 lua 脚本来释放锁。

    但是这样是肯定不行的。因为如果是普通的 redis 单实例,那就是单点故障。或者是 redis 普通主从,那 redis 主从异步复制,如果主节点挂了(key 就没有了),key 还没同步到从节点,此时从节点切换为主节点,别人就可以 set key,从而拿到锁。


    集群Redis分布式锁
    集群Redis分布式锁

    RedLock算法
    在这里插入图片描述
    这个场景假设有一个Redis cluster,有5个Redis master实例,然后执行如下步骤获取一把锁:
    1 获取当前时间戳,单位是毫秒
    2 跟上面类似,轮流尝试在每个master节点上创建锁,比如5各节点就要求是3个节点(n/2=1)
    4 客户端计算建立好锁的时间,如果建立锁的时间小于超时时间,就算建立成功了
    5 要是锁建立失败了,那么就依次删除这个锁
    6 只要 别人建立了一把分布式锁,你就得不断轮询去尝试获取锁

    总结:不建议用集群Redis分布式锁,因为太麻烦了,自己也上网查了很多博客,确实很少有用这个锁的,因为计算太麻烦。


    zookeeper分布式锁
    zookeeper分布式锁与Redis分布式锁的比较

    聊完分布式锁,咱们再聊聊分布式事务:以下为本系列博客
    1.两阶段提交方案/XA方案
    2.TCC方案
    3.本地消息表
    4.可靠消息最终一致性
    5.最大努力通知方案

    展开全文
  • 缓存之redis

    2019-10-21 20:10:31
    有用过redis分布式吗?你们怎么用的?知道setnx是怎么实现的吗?setnx底层是有那几个命令组成的以及其中的细节? 你知道redis过期策略有哪些吗?假如让你实现redis的自动过期,你如何实现? 除了redis你还知道其他...

    起源

    面试

    1. redis 有哪些数据类型?他们的应用场景你知道吗或者说你们在项目中怎么使用的?
    2. 有用过redis分布式锁吗?你们怎么用的?知道setnx是怎么实现的吗?setnx底层是有那几个命令组成的以及其中的细节?
    3. 你知道redis过期策略有哪些吗?假如让你实现redis的自动过期,你如何实现?
    4. 除了redis你还知道其他哪些缓存?他们之间的区别呢?

    接下来将针对这几个问题,做一个简单的回答。即自身总结,也为同僚提供一些参考。

    redis有哪些数据结构/类型,以及使用场景;

    数据类型有5个:

    String – Hash – List – Set – sortSet

    • String

    数据结构是简单的key-value类型,value其实不仅是String,也可以是数字.
    常用命令: set,get,decr,incr,mget 等。
    应用场景: String是最常用的一种数据类型,普通的key/ value 存储都可以归为此类。
    个人认为所有的数据如果不显麻烦都可以用String进行存储;如果你用过Memcached的话,其中所有的数据都是string形式进行存储的。


    redis则相比与Memcached 数据结构更多,且提供了get、set、incr、decr 等操作外,Redis还提供了下面一些操作:

    • 获取字符串长度
    • 往字符串append内容
    • 设置和获取字符串的某一段内容
    • 设置及获取字符串的某一位(bit)
    • 批量设置一系列字符串的内容

    • Hash

    常用命令: hget,hset,hgetall ,hincrby,hlen等。
    应用场景: Hash,即可理解为常见的HashMap的操作。平日工作中较多用于存放用户的热点数据信息,例如:姓名,地址,一些业务经常使用的数据;采用HashMap结构可以做到最小更新的特点,而不需要把整个map信息取出来,再进行一次数据整体的覆盖。所有和这个类似的场景都可以采用Hash数据结构进行存储,个人觉得适合存储结构复杂不稳定的【大对象】


    • List

    常用命令: lpush,rpush,lpop,rpop,lrange等。
    应用场景: Redis list 的应用场景非常多,也是 Redis 最重要的数据结构之一。
    比如 twitter 的关注列表,粉丝列表等都可以用 Redis 的 list 结构来实现,还可以做消息队,列息队列不仅被用于系统内部组件之间的通信,同时也被用于系统跟其它服务之间的交互。消息队列的使用可以增加系统的可扩展性、灵活性和用户体验。非基于消息队列的系统,其运行速度取决于系统中最慢的组件的速度(注:木桶效应)。而基于消息队列可以将系统中各组件解除耦合,这样系统就不再受最慢组件的束缚,各组件可以异步运行从而得以更快的速度完成各自的工作。
    此外,当服务器处在高并发操作的时候,比如频繁地写入日志文件。可以利用消息队列实现异步处理。从而实现高性能的并发操作。


    • Set

    常用命令: sadd,spop,smembers,sunion 等。
    应用场景: Redis set 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能提供的。


    • Sorted set

    常用命令: zadd,zrange,zrem,zcard等
    使用场景: Redis sorted set 的使用场景与 set 类似,区别是 set 不是自动有序的,而 sorted set 可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择 sorted set 数据结构,比如你需要存储3个有关联事物时候,常见的用户,消息,消息等级;还可以利用zIncrBy,zRevRange,zAdd,zRevRank,zScore等接口做排行榜

    问题1的参考资料
    原文链接:https://blog.csdn.net/z15818264727/article/details/80166997

    高端的数据类型


    • Bit 位图

    应用场景

    用户的签到记录,签了是1,没签是0,要记录365天。如果使用普通的key/value,每一个用户记录有365条,如果用户上亿,则需要的空间是非常吓人的。

    应对这个问题,Redis 提供了位图数据结构。每天的签到记录只占用1个位,365天就是365位等于46字节(一个稍微长一点的字符串)

    • hyperloglog

    应用场景

    统计网页每天的UV数据,同一个用户一听之内的多次访问只能计数一次。如果你的网页访问量很大,如果采用set的集合来进行统计,非常浪费空间。如果需要统计的页面很多,那需要的空即是惊人的。针对UV 对于老板而言 103万 和 105万并没有多大区别。

    hyperloglog 就是应对这种统计的。提供您不精确的去重计数方案,虽然不精确,但也不是非常离谱,标准误差是0.81%。这样用户统计上述UV非常合适

    • 布隆过滤器

    应用场景

    广泛应用于 内容推送场景下,只推送用户没有看过的内容。类似与B站APP中首页内容刷新机制,能很大程度上保证刷新出来的内容是用户没有看过的。
    其基本原理 则通过 多个 hash函数,以确定某个值是否已经出现过。

    通俗的理解则是:

    在平常的人际交往中,一个人身上往往背负着 不同的标签、绰号、昵称、爱称、乳名等等(这里的这些称为则对应到 布隆过滤器中的hash 函数)。举例:
    姓名:张XX; 绰号:阿三; 昵称:abc;乳名:张安安;等等…
    只有所有的这些都相同的情况下则能确定你就是 咱们说的某某人; 当然其中很有可能出现 不准确的情况,恰好 某个人的特征和你的一样,这种情况则是没法避免的。这种情况也极其少见,所以能很好的适用与 内送刷新推送的场景当中去。
    所以能否避免出现误判(出现重复的情况),则需要依赖与hash算法能否很好的避开这些重复的场景;暴力的就是增加hash 函数的数量、或者提取数据的特征值hash;




    redis之分布式锁

    口水话吐槽一下,可以完全跳过本段


    本人在项目接触到的redis的操作,就是很普通的数据添加使用 和 一个自动过期。在一些场景中为了保证只有一个端或者线程执行某些操作,会使用到setnx的分布式相关的命令。
    然而这很明显在面试的过程中,被 面试官 眼神diss和复杂表情的暗示。尽管这些redis的操作能满足大部分使用。但是只能说明一个问题,你对技术的渴望还没到达一种发疯的境界。只关心表面,就算是表面也应该要看全。而不是简单的数据存储,并没有往高级特性区学习和了解。

    redis 分布式锁

    基础用法,使用redis 自带的setnx命令
    示例: setnx(key,value);

    setnx当且仅当 key 不存在。若给定的 key 已经存在,则 setnx不做任何动作。setnx 是『set if not exists』(如果不存在,则 set)的简写,setnx 具有原子性。

    解释一下,上面是什么意思:setnx本身是个原子操作。要么放入缓存成功,要么失败。
    适用于场景简单,不涉及 高并发 和 锁竞争激烈的 情况。简单的适用这种特性来支持业务逻辑。


    相对 高级 的用法,封装一下 setnx,使得setnx的数据可以自动过期。
    示例:setnx(key,value,seconds);
    执行逻辑,在setnx命令执行完之后,并设置key对应的过期时间。

    long update =  redisClient.setnx("Key","Value");//1.setnx 将值放入
    System.out.println("是否存储成功:"+update);
    redisClient.expire("Key",30);  //30秒的过期时间;设置过期时间
    

    在上边的这个执行过程当中,正常情况是不会出问题的。
    倘若极端情况下,程序执行到setnx之后挂了。导致设置过期时间未执行。
    在发生了这种不幸的情况时,程序重启之后。导致获取锁的逻辑进入一个全部获取失败,且永远如此。除非手动删除该key值。

    ps:以上情况,出现在大量的高并发的获取锁的情况时。极易引发这种_极端情况_。为了避免这种情况的发生,便有了更加高级和安全的分布式锁

    redis 分布式锁的正确用法

    请仔细阅读,大牛们提供
    正确用法示例1 正确用法示例2

    展开全文
  • 最近在参加学校安排的实训任务,我们小组需完成一套分布式&微服务跨境电商,虽然这题目看起来有点老套,并且队友多是 ...在昨天 review 队友代码的过程中,发现了我们组分布式的写法似乎有点问题,实现代码如...

    最近在参加学校安排的实训任务,我们小组需完成一套分布式&微服务跨境电商,虽然这题目看起来有点老套,并且队友多是 Java 技术栈,所以我光荣(被迫)
    的成为了一名前端,并顺路使用 PHP 的 Swoole 帮助负责服务器端的同学编写了几个微服务模块。在小组成员之间的协作中,还是出现了不少有趣的火花。

    在昨天 review 队友代码的过程中,发现了我们组分布式锁的写法似乎有点问题,实现代码如下:

    加锁部分
    [外链图片转存失败(img-2iS5MxTk-1565594493393)(http://www.zzfly.net/wp-content/uploads/2019/08/image.png)]

    解锁部分
    在这里插入图片描述

    主要原理是使用了 redis 的 setnx 去插入一组 key-value,其中 key 要上锁的标识(在项目中是锁死用户 userId),如果上锁失败则返回 false。但是根据二段锁的思路,仔细思考会存在这么一个有趣的现象:

    假设微服务 A 的某个请求对 userId = 7 的用户上锁,则微服务 A 的这个请求可以读取这个用户的信息,且可以修改其内容 ;其他模块只能读取这个用户的信息,无法修改其内容。
    假设微服务 A 的当前请求对 userId = 7 的用户解锁,则所有模块可以读取这个用户的信息,且可以修改其内容
    如此一来:

    • 若微服务模块 A 接收到另一个需要修改 userId = 7 的用户 的请求时,假设这个用户还在被锁状态下,这次请求可以修改它吗?(可以,解个锁就行)
    • 若微服务模块 B 接收到另一个需要修改 userId = 7 的用户 的请求时,假设这个用户还在被锁状态下,这次请求可以修改它吗?(可以,解个锁就行)
    • 若微服务模块 A 执行上锁的请求中途意外崩掉,其他用户还能修改信息吗? (可以,解个锁就行)

    很明显,这三点并不是我们所希望的。那么如何实现分布式锁才是最佳实践呐?

    ##一个好的分布式锁需要实现什么

    • 由某个模块的某次请求上锁,并且只有由这个模块的这次请求解锁(互斥,只能有一个微服务的某次请求持有锁)
    • 若上锁模块的上锁请求超时执行,则应自动解锁,并还原其所做修改(容错,就算 一个持有锁的微服务宕机也不影响最终其他模块的上锁 )

    我们应该怎么做
    综上所述,我们小组的分布式锁在实现模块互斥的情况下,忽略的一个重要问题便是“请求互斥”。我们只需要在加锁时,key-value 的值保存为当前请求的 requestId ,解锁时加多一次判断,是否为同一请求即可。

    那么这么修改之后,我们可以高枕无忧了吗?

    是的,够用了。因为我们开发环境 Redis 是统一用一台服务器上的单例,采用上述方式实现的分布式锁并没有什么问题,但在准备部署到生产环境下时,突然意识到一个问题:如果实现主从读写分离,redis 多机主从同步数据时,采用的是异步复制,也便是一个“写”操作到我们的 reids 主库之后,便马上返回成功(并不会等到同步到从库后再返回,如果这种是同步完成后再返回便是同步复制),这将会造成一个问题:

    假设我们的模块 A中 id=1 的请求上锁成功后,没同步到从库前主库被我们玩坏了(宕机),则 redis 哨兵将会从从库中选择出一台新的主库,此时若模块 A 中 id=2 的请求重新请求加锁,将会是成功的。

    技不如人,我们只能借助搜索引擎划水了(大雾),发现这种情况还真的有通用的解决方案:redlock。

    怎么实现 Redlock 分布式安全锁

    首先 redlock 是 redis 官方文档推荐的实现方式,本身并没有用到主从层面的架构,采用的是多态主库,依次去取锁的方式。假设这里有 5 台主库,整体流程大致如下:

    加锁

    1. 应用层请求加锁
    2. 依次向 5 台 redis 服务器发送请求
    3. 若有超过半数的服务器返回加锁成功,则完成加锁,如果没有则自动执行解锁,并等待一段随机时间后重试。(客观原因加锁失败:网络情况不好、服务器未响应等问题, 等待一段随机时间后重试可以避开“蜂拥而进”的情况造成服务器资源占用瞬时猛增 )
    4. 如有其中任意一台服务器已经持有该锁,则加锁失败, 等待一段随机时间后重试。 (主观原因加锁失败:已经被被别人锁上了)

    解锁

    直接向 5 台服务器发起请求即可,无论这台服务器上是不是已经有锁。
    整体思路很简单,但是实现起来仍有许多值得注意的地方。在向这 5 台服务器发送加锁请求时,由于会带上一个过期时间以保证上文所提到的“自动解锁(容错性) ”,考虑到延时等原因,这 5 台机自动解锁的时间不完全相同,因此存在一个加锁时间差的问题,一般而言是这么解决的:

    1. 在加锁之前,必须在应用层(或者把分布式锁单独封装成一个全局通用的微服务亦可)2. 记录请求加锁的时间戳 T1
    2. 完成最后一台 redis 主库加锁后,记录时间戳 T2
    3. 则加锁所需时间为 T1 – T2
    4. 假设资源自动解锁的时间为 10 秒后,则资源真正可利用的时间为 10 – T1 + T2。若
      可利用时间不符合预期,或者为负数,你懂的,重新来一遍吧。
      如果你对锁的过期时间有着更加严格的把控,可以把 T1 到第一台服务器加锁成功的时间单独记录,再在最后的可用时间上加上这段时间即可得到一个更加准确的值
      现在考虑另一个问题,如果恰好某次请求的锁保存在了三台服务器上,其中这三台都宕机了(怎么这么倒霉… TAT),那此时另一个请求又来请求加锁,岂不又回到最初我们小组所面临的问题了?很遗憾的说,是的,在这种问题上官方文档给出的答案是:启用AOF持久化功能情况会得到好转 ?

    关于性能方面的处理, 一般而言不止要求低延时,同时要求高吞吐量,我们可以按照官方文档的说法, 采用多路传输同时对 5 台 redis 主库进行通信以降低整体耗时,或者把 socket 设置成非阻塞模式 (这样的好处是发送命令时并不等待返回,因此可以一次性发送全部命令再进行等待整体运行结果,虽然本人认为通常情况下如果本身网络延迟极低的情况下作用不大,等待服务器处理的时间占比会更加大)

    若有任何疑问,可以移步我的博客:http://www.zzfly.net/redis-redlock/ 留言讨论

    展开全文
  • 使用Redis的setnx命令,如果能修改key返回true,说明获取到key,加锁成功,最后将key删掉,便于下个减库存。 业务出现异常,没有释放(删掉key)怎么办? 使用try catch finally ,在finally中删掉key 中途宕机的话...

    减库存业务

    使用两台Nginx + 两个Tomcat进行负载均衡,模拟分布式,Redis使用单机实例。

    压测工具:Jmeter

    库存数据保存在Redis中
    在这里插入图片描述
    这里使用springboot 整合 Redis

    /**
     * @author 阳光大男孩!!!
     */
    @RestController
    @RequestMapping("order")
    @Slf4j
    @RequiredArgsConstructor
    public class orderController {
    
        private final StringRedisTemplate stringRedisTemplate;
        
        @RequestMapping("/deduceStock")
        public RespBean deduceOrder()
        {
            String s = stringRedisTemplate.opsForValue().get("stock");
            if(s==null)
            {
                return RespBean.error("请求失败");
            }
            int stock =Integer.parseInt(s) ;
            if(stock>0)
            {
                stringRedisTemplate.opsForValue().set("stock",String.valueOf(stock-1));
                System.out.println("扣减库存成功,剩余库存"+(stock-1));
                return RespBean.ok("扣减库存成功");
            }else
            {
                System.out.println("扣减库存失败,余额不足");
                return RespBean.ok("扣减库存失败");
            }
    
        }
    }
    

    可以看出来这是一段问题代码,当并发情况下,会导致超卖。

    为防止超卖,怎么做?

    可以使用synchronized加锁

    synchronized问题在哪?

    分布式环境下synchronized失效,因为synchronized是单JVM下保证锁。

    当分布式情况下,两台实例时,依旧会导致问题。

    在通过nginx负载均衡后,可以看到两个实例出现了相同的“剩余库存”,这就会超卖
    在这里插入图片描述

    在这里插入图片描述

    那应该怎么做?

    使用Redis的setnx命令,如果能修改key返回true,说明获取到key,加锁成功,最后将key删掉,便于下个减库存。

      Boolean lock = stringRedisTemplate.opsForValue().setIfAbsent("lock", "");
      if(!lock)
      {
          return RespBean.error("请重试");
      }
    

    业务出现异常,没有释放锁(删掉key),怎么办?

    使用try catch finally ,在finally中删掉key

    中途宕机的话锁就不会被释放,中途宕机怎么办?

    解决方案可以是加锁时,给key设置过期时间。

    如果在加锁后,设置过期时间之前,挂了,依然不会解决问题,怎么办

    setnx 命令可以支持同时设置key和过期时间,redis可以保证原子性。

    当执行请求时,执行请求时间过长,键过期了,其他请求就会过来加锁,执行减库存,并且会删除锁,而此时的锁已经是下个线程的锁了,那么就会出现锁永久失效问题,怎么办?

    给每个请求分配UUID,redis存的是K*V键值对,键假如是"key",值设置为这个UUID
    最后释放键前,判断一下UUID是不是与值相同,也就是判断当前锁,是不是自己的锁,如果是,则删除该键值对。

    可以使用watch dog 机制,开启子线程,每隔一段时间,判断锁是否还存在,如果还存在,那么就延长锁的时间。

    实现Redis分布式锁

    可以基于Redission实现分布式锁

     <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.14.1</version>
     </dependency>
    

    将redisson交给Spring管理

    /**
     * @author 阳光大男孩!!!
     */
    @Configuration
    public class RedissonConfig {
        @Bean
        public RedissonClient getRedission()
        {
            Config config = new Config();
            config.useSingleServer().setAddress("redis://localhost:6379");
            return Redisson.create(config);
    
        }
    }
    

    用Redisson实现分布式锁,最基本的使用就是三板斧

    // 获取锁
    RLock lock = redissonClient.getLock("lock");
    // 加锁
    lock.lock();
    // 解锁
    lock.unlock();
    

    将上面的减库存改一下

    /**
     * @author 阳光大男孩!!!
     */
    @RestController
    @RequestMapping("order")
    @Slf4j
    @RequiredArgsConstructor
    public class orderController {
    
        private final StringRedisTemplate stringRedisTemplate;
    
        private final RedissonClient redissonClient;
    
        @RequestMapping("/deduceStock")
        public RespBean deduceOrder() {
            // 获取锁
            RLock lock = redissonClient.getLock("lock");
            // 加锁
            lock.lock();
            try {
                // 获取库存
                String s = stringRedisTemplate.opsForValue().get("stock");
                if (s == null) {
                    return RespBean.error("请求失败");
                }
                int stock = Integer.parseInt(s);
                // 减库存
                if (stock > 0) {
                    stringRedisTemplate.opsForValue().set("stock", String.valueOf(stock - 1));
                    System.out.println("扣减库存成功,剩余库存" + (stock - 1));
                } else {
                    System.out.println("扣减库存失败,余额不足");
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
            return RespBean.ok("请求成功");
        }
    }
    
    

    使用jmeter进行压测
    在这里插入图片描述
    库存,正确地从500变成了0
    在这里插入图片描述

    使用Redis实现分布式锁的缺陷

    场景

    如果向 Redis master 实例,写入了用于实现锁的KV键值对,会异步复制给对应的 master slave 实例。但是这个过程中一旦发生 redis master 宕机,主备切换,redis slave 变为了 redis master。
    问题

    客户端 2 来尝试加锁的时候,在新的 redis master 上完成了加锁,而客户端 1 也以为自己成功加了锁。此时就会导致多个客户端对一个分布式锁完成了加锁。这时系统在业 务语义上一定会出现问题,导致各种脏数据的产生。

    总结来说,就是在 redis master 实例宕机的时候,可能导致多个客户端同时完成加锁,出现问题。

    展开全文
  •  我们在Zookeeper中提到过分布式,这里我们先用redis实现一个简单的分布式,这里是我们一个简单的售卖减库存的小实例,剩余库存假设存在数据库内。 @GetMapping(value = "/getLock") public St...
  • redis 分布式,其实需要自己不断去尝试获取,比较消耗性能。 zk 分布式,获取不到,注册个监听器即可,不需要不断主动尝试获取,性能开销较小。 另外一点就是,如果是 redis 获取的那个客户端 出现 ...
  • 笔者参加了2021届实习春招和秋招,面了包括字节阿里腾讯快手百度京东滴滴猿辅导shopee华为大疆招行等数十个大厂,决定总结一下mysql和redis中常考的知识点,想到啥先写点啥,后续补充。 mysql: 索引原理,存储引擎...
  • 聊聊 Redis 使用场景

    2019-09-22 11:38:15
    Redis 可用的场景非常之多: 数据缓存 会话缓存 时效性数据 访问频率 计数器 社交列表 记录用户判定信息 交集、并集和差集 热门列表与排行榜 最新动态 消息队列 分布式 缓存 对于热点数据,缓存以后...
  • redis系列之——分布式端午节最后一天了,三天假期过得...这一期不是专门分布式的,所以不会涉及到各种分布式实现及相关的比较,只是一下如何使用redis实现分布式。感觉上一个坑还没填完,这里又挖了一...
  • redis锁机制

    2020-09-02 18:33:01
    Redis分布式的实现原理 </h1> <div class="clear"></div> ...div class="postBody">...所以咱们这篇文章就来聊聊分布式这块知识,具体的来看看Redis分布式的实现原理。 说实话,如果在...
  • 今天我们聊聊redis的一个实际开发的使用场景,那就是大名鼎鼎的分布式。啥是分布式?我们学习 Java 都知道的概念,例如基于 JVM 实现的同步 synchronized,以及 jdk 提供的一套代码级别的机制 lock,我们...
  • 本文主要研究一下redis的数据结构的应用 string 最常用的就是incr操作,比如可以用来维护用户在某个抽奖活动的剩余抽奖次数 setnx方法可以用来实现分布式 hashmap 可以用来存储session,作为分布式session的一...
  • 所以咱们这篇文章就来聊聊分布式这块知识,具体的来看看Redis分布式的实现原理。说实话,如果在公司里落地生产环境用分布式的时候,一定是会用开源类库的,比如Redis分布式,一般就是用Redisson框架就好了,...
  • Redis分布式

    2020-12-12 11:26:03
    所以咱们这篇文章就来聊聊分布式这块知识,具体的来看看Redis分布式的实现原理。 说实话,如果在公司里地生产环境用分布式的时候,一定是会用开源类库的,比如Redis分布式,一般就是用Redisson框架就好了,...
  • 所以咱们这篇文章就来聊聊分布式这块知识,具体的来看看Redis分布式的实现原理。说实话,如果在公司里落地生产环境用分布式的时候,一定是会用开源类库的,比如Redis分布式,一般就是用Redisson框架就好了,...
  • Redis 做分布式的时候有需要注意的问题? 如果是 Redis 是单点部署的,会带来什么问题? 那你准备怎么解决单点问题呢? 集群模式下,比如主从模式,有没有什么问题呢? 你知道 Redis 是怎么解决集群模式也不靠谱的...
  • redis分布式原理及实现

    万次阅读 多人点赞 2019-04-16 23:13:29
    所以咱们这篇文章就来聊聊分布式这块知识,具体的来看看Redis分布式的实现原理。 说实话,如果在公司里落地生产环境用分布式的时候,一定是会用开源类库的,比如Redis分布式,一般就是...
  • 前言在开始提到Redis分布式之前,我想跟大家Redis的基础知识。说一下Redis的两个命令:SETNX key valuesetnx 是SET if Not eXists(如果不存在,则 SET)的简写。用法如图,如果不存在set成功返回int的1,这个...
  • redis系列之——分布式端午节最后一天了,三天假期过得...这一期不是专门分布式的,所以不会涉及到各种分布式实现及相关的比较,只是一下如何使用redis实现分布式。感觉上一个坑还没填完,这里又挖了一...
  • 最近项目上线的频率颇高,连着几天加班熬夜,身体有点吃不消精神也有些萎靡,无奈业务方催...由于是做商城业务,要频繁的对商品库存进行扣减,应用是集群部署,为避免并发造成库存超买超卖等问题,采用redis分布式...
  • 为了引出本文要讨论的关于 Redlock 的神仙打架的问题,我们就得先通过一个面试连环炮:Redis 做分布式的时候有需要注意的问题?如果是 Redis 是单点部署的,会带来什么问题?那你准备怎么解决单点问题呢?集群模式...
  • 持续输出原创文章,点击蓝字关注我吧又到了一周一次的分享时间啦,老规矩,还是先荒腔走板的聊聊生活。有上面的图是读大学的时候,一次自行车骑行途中队友抓拍的我...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 200
精华内容 80
关键字:

聊聊redis锁

redis 订阅