广告
返回顶部
首页 > 资讯 > 精选 >Redis怎么使用乐观锁保证数据一致性
  • 730
分享到

Redis怎么使用乐观锁保证数据一致性

2023-06-29 16:06:21 730人浏览 安东尼
摘要

这篇文章主要介绍了Redis怎么使用乐观锁保证数据一致性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。场景在 Redis 中经常会存在这么一种情况,读取某一个 key 的值,

这篇文章主要介绍了Redis怎么使用乐观保证数据一致性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

场景

Redis 中经常会存在这么一种情况,读取某一个 key 的值,做一些业务逻辑处理,然后根据读取到的值来计算出一个新的值,重新 set 进去。

如果客户端 A 刚读取到 key 值,紧接着客户端 B 就修改这个 key 的值,那么就会存在并发安全的问题。

问题模拟

假设 Redis Server 有个键名为 test 的key,里面存放的是一个 JSON 数组 [1, 2, 3]。

Redis怎么使用乐观锁保证数据一致性

下面让我们模拟一下,客户端 A 与 客户端 B 同时访问修改的情况,代码如下:

客户端 A:

class RedisClientA(username: String, passWord: String, host: String, port: Int) {    val jedis: Jedis    init {        val pool = JedisPool(JedisPoolConfig(), host, port)        jedis = pool.resource        jedis.auth(username, password)    }    fun update(key: String) {        val idStr = jedis.get(key)        val idList = json.decodeFromString<MutableList<Int>>(idStr)        // 等待2秒,模拟业务        TimeUnit.SECONDS.sleep(2L)        idList.add(4)        println("new id list: $idList")        jedis.set(key, Json.encodeToString(idList))    }    fun getVal(key: String): String? {        return jedis.get(key)    }}fun main() {    val key = "test"    val redisClientA = RedisClientA("default", "123456", "127.0.0.1", 6379)    redisClientA.update(key)    val res = redisClientA.getVal(key)    println("res: $res")}

客户端 B:

class RedisClientB(username: String, password: String, host: String, port: Int) {    val jedis: Jedis    init {        val pool = JedisPool(JedisPoolConfig(), host, port)        jedis = pool.resource        jedis.auth(username, password)    }    fun update(key: String) {        val idStr = jedis.get(key)        val idList = Json.decodeFromString<MutableList<Int>>(idStr)        idList.add(5)        println("new id list: $idList")        jedis.set(key, Json.encodeToString(idList))    }    fun getVal(key: String): String? {        return jedis.get(key)    }}fun main() {    val key = "test"    val redisClientB = RedisClientB("default", "123456", "127.0.0.1", 6379)    redisClientB.update(key)    val res = redisClientB.getVal(key)    println("res: $res")}

客户端 A 阻塞了 2 秒,用来模拟耗时业务逻辑的处理。正在处理的时候,客户端 B 访问了 “test”,并增加了 id:5。

在客户端 A 耗时业务逻辑处理完的时候,增加了 id:4,并且会覆盖掉 id:5。

最终“test” 里的内容最终如下:

Redis怎么使用乐观锁保证数据一致性

CAS 来保证数据一致性

WATCH 命令可以为 Redis 事务提供 check-and-set(CAS)行为。被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。如果有至少一个被监视的建在 EXEC 执行之前被修改了,那么整个事务都会被取消,EXEC 返回空(Null replay)来表示事务执行失败。我们只需要重复操作,希望在这个时间段内不会有新的竞争。这种形式的锁被称作乐观锁,它是一种非常强大的锁机制。

那么 CAS 的方式如何实现呢?我们只需要把 RedisClientA 的 update() 方法中的代码修改如下:

fun update(key: String) {    var flag = true    while (flag) {        jedis.watch(key)        val idStr = jedis.get(key)        val idList = Json.decodeFromString<MutableList<Int>>(idStr)        // 等待2秒,模拟业务        TimeUnit.SECONDS.sleep(2L)        val transaction = jedis.multi()        idList.add(4)        println("new id list: $idList")        transaction.set(key, Json.encodeToString(idList))        transaction.exec()?.let {            flag = false        }    }}

最终 “test” 的内容如下:

Redis怎么使用乐观锁保证数据一致性

可见我们通过使用 WATCH 和 TRANACTION 命令,采用 CAS 乐观锁的方式实现了数据的一致性。

感谢你能够认真阅读完这篇文章,希望小编分享的“Redis怎么使用乐观锁保证数据一致性”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Redis怎么使用乐观锁保证数据一致性

本文链接: https://www.lsjlt.com/news/325678.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis怎么使用乐观锁保证数据一致性
    这篇文章主要介绍了Redis怎么使用乐观锁保证数据一致性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。场景在 Redis 中经常会存在这么一种情况,读取某一个 key 的值,...
    99+
    2023-06-29
  • Redis如何使用乐观锁(CAS)保证数据一致性
    目录场景问题模拟CAS 来保证数据一致性场景 在 Redis 中经常会存在这么一种情况,读取某一个 key 的值,做一些业务逻辑处理,然后根据读取到的值来计算出一个新的值,重新 se...
    99+
    2022-11-13
  • redis怎么保证数据一致性
    一般来说,只要你用到了缓存,不管是Redis还是memcache,就可能会涉及到数据库缓存与数据的一致性问题,这里我们以Redis为例。我们该如何保证Redis与数据库的一致性呢? So easy: (推荐...
    99+
    2017-04-27
    redis
  • ​怎么保证Redis和数据库的一致性
    怎么保证Redis和数据库的一致性?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一般来说,只要你用到了缓存,不管是Redis还是memca...
    99+
    2022-10-18
  • 怎么保证Redis缓存与数据库的一致性
    这篇文章主要为大家展示了“怎么保证Redis缓存与数据库的一致性”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么保证Redis缓存与数据库的一致性”这篇文章吧...
    99+
    2022-10-19
  • mysql怎么保证数据一致性
    在MySQL中,可以采取以下几种方式来保证数据的一致性:1. 使用事务:事务可以将一系列操作单独的执行单元,要么全部成功提交,要么全...
    99+
    2023-09-15
    mysql
  • canal怎么保证数据一致性
    canal可以通过以下方式来保证数据一致性: 基于事务日志解析:canal通过解析数据库的事务日志来获取数据变更的信息。由于数据...
    99+
    2023-10-22
    canal
  • 高并发怎么保证数据一致性
    使用redis本身的原子性操作库储存。// redis会返回操作之后的结果,这个过程是原子性的Long currStock = redisTemplate.opsForHash().increment...
    99+
    2022-10-04
  • redis集群中的节点怎么保证数据一致
    为了使得集群在一部分节点下线或者无法与集群的大多数节点进行通讯的情况下, 仍然可以正常运作。 Redis 集群对节点使用了主从复制功能: 集群中的每个节点都有 1 个至 N 个复制品(replica), 其中一个复制品为主节点(master...
    99+
    2018-04-03
    redis
  • MySQL怎么保证备份数据的一致性
    这篇文章主要讲解了“MySQL怎么保证备份数据的一致性”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL怎么保证备份数据的一致性”吧!前言为了数据安全,数据库需要定期备份,这个大家都懂...
    99+
    2023-06-30
  • 怎么保证缓存和数据库的数据一致性
    本篇内容主要讲解“怎么保证缓存和数据库的数据一致性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么保证缓存和数据库的数据一致性”吧!1、错误的解决方案1.1、...
    99+
    2023-04-21
    数据库
  • 保证Redis缓存与数据库一致性的方法是什么
    本文小编为大家详细介绍“保证Redis缓存与数据库一致性的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“保证Redis缓存与数据库一致性的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、四...
    99+
    2023-07-05
  • 怎么保证缓存与数据库的双写一致性
    本篇内容介绍了“怎么保证缓存与数据库的双写一致性”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Cache ...
    99+
    2022-10-18
  • RocketMQ事务消息是怎么保证数据的一致性
    这篇文章主要介绍“RocketMQ事务消息是怎么保证数据的一致性”,在日常操作中,相信很多人在RocketMQ事务消息是怎么保证数据的一致性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2022-10-19
  • 数据库中load data语句怎么保证主备复制数据一致性
    小编给大家分享一下数据库中load data语句怎么保证主备复制数据一致性,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 背景 机器配置 * CPU:16 vcpus *...
    99+
    2022-10-18
  • Mybatis中怎么使用ResultMap解决属性名和数据库字段名不一致问题
    本篇内容介绍了“Mybatis中怎么使用ResultMap解决属性名和数据库字段名不一致问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作