广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >浅谈Redis如何应对并发访问
  • 221
分享到

浅谈Redis如何应对并发访问

Redis 并发访问Redis 并发 2022-11-13 13:11:14 221人浏览 薄情痞子
摘要

目录前言原子性操作单命令模式多命令模式lua简介建议事务加锁总结前言 项目中经常会遇到这种场景,我们需要先将Redis数据读取到本地,然后进行修改,修改完成后在将数据写回Redis,

前言

项目中经常会遇到这种场景,我们需要先将Redis数据读取到本地,然后进行修改,修改完成后在将数据写回Redis,这种读取-修改-写回操作,我们称之为RMW操作。当有多个客户端对同一份数据执行RMW操作的话,Redis如何保证RMW操作涉及的代码以原子性方式执行?

原子性操作

Redis的原子性操作是一种无锁操作,即可以保证并发控制,还能减少系统对并发性能的影响,

单命令模式

把Redis多个操作实现成一个操作,即为单命令模式。

Redis提供了INCR/DECR命令,可以对数据进行增值/减值操作,而且它们本身就是单个命令操作,Redis单线程模式,执行命令时具有互斥性。

示例说明

 public Long getIncrNumber(String key,long alive) 
    {
        RedisAtomicLong entityIdCounter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
        Long incrNum = entityIdCounter.getAndIncrement();
        if (null == incrNum || incrNum.longValue()==0) 
        {
            entityIdCounter.expire(alive,TimeUnit.MILLISECONDS);
            incrNum = entityIdCounter.getAndIncrement();
        }
        return incrNum;
    }

说明:采用Reids的INCR命令,如果不存在的key则设置过期时间,如果key存在则进行递增操作返回。所以如果我们执行RMW操作进行相关的递增或者递减操作时,Redis提供的INCR和DECY命令可以保证并发控制。

多命令模式

当我们不是执行简单的加加减减操作,而是更加复杂的逻辑判断或者其他操作时,Redis是无法保证原子性,所以需要将多个操作写到一个Lua脚本中,Redis会把Lua脚本作为一个整体执行,在执行过程中不会被其他命令打断,从而保证了操作的原子性。

lua简介

Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

示例说明

接口进行限流操作,同一用户3秒内不能重复访问,我们可以通过lua脚本来实现。

local key = KEYS[1]
local count = tonumber(ARGV[1])
local time = tonumber(ARGV[2])
local current = redis.call('get', key)
if current and tonumber(current) > count then
    return tonumber(current)
end
current = redis.call('incr', key)
if tonumber(current) == 1 then
    redis.call('expire', key, time)
end
return tonumber(current)

说明:key、count、time为三个传入参数,分别代表Redis的key、次数和过期时间。通过get获取key对应的值,获取的值为时间内访问接口的次数,如果为第一次访问则返回的为null,此时需要对当前key进行自增1操作,如果返回为数字,则需要判断返回的数字是否已经超过了cout值,如果超过说明已经超过限流了,直接返回。

建议

  • 1.编写lua脚本不要进行复杂耗时的计算逻辑,否则执行lua时间过长,会导致Redis主线程阻塞。
  • 2.lua脚本尽量简单,不要把所有的操作都放入到lua脚本中执行,这样会导致Redis执行脚本的时间增加,同时也会降低Redis的并发性能。

事务

关于事务保证原子性,采用的watch命令其原理和乐观锁的实现原理类似,详情可以参考juejin.cn/post/712582… 文章,本文就不在具体阐述。

加锁

关于Redis的分布式锁的实现,后续的章节进行详情说明。高并发环境下加锁虽然能够保证正确性,但是也会带来其他的问题:

  • 加锁操作过多会降低系统的并发访问性能
  • Redis客户端要加锁,需要使用分布式锁,而分布式锁实现复杂,增加复杂度。

总结

本文讲解了针对并发访问Redis如何保证原子性操作,针对不同的业务场景,选择合适的方案,更多相关Redis 并发访问内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅谈Redis如何应对并发访问

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

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

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

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

下载Word文档
猜你喜欢
  • 浅谈Redis如何应对并发访问
    目录前言原子性操作单命令模式多命令模式lua简介建议事务加锁总结前言 项目中经常会遇到这种场景,我们需要先将Redis数据读取到本地,然后进行修改,修改完成后在将数据写回Redis,...
    99+
    2022-11-13
    Redis 并发访问 Redis 并发
  • ASP日志教程:如何应对高并发访问?
    在现代互联网应用中,高并发访问是一个必须要面对的问题。高并发访问不仅会导致网站的响应速度变慢,甚至还会导致网站的崩溃。为了解决这个问题,我们需要在应用中加入日志系统。 ASP.NET是一个非常流行的Web开发框架,它提供了强大的日志记录功...
    99+
    2023-06-23
    日志 教程 并发
  • ASP IDE路径并发:如何应对大规模访问?
    在ASP IDE中,路径并发是指多个用户同时访问同一个路径的情况。当出现大规模的并发访问时,服务器可能会出现响应慢、卡顿、甚至崩溃的情况。为了避免这种情况的发生,我们需要采取一些措施来应对大规模的路径并发。 一、使用缓存 缓存可以提高应用...
    99+
    2023-10-11
    ide path 并发
  • ASP网站如何应对高并发访问时的性能问题?
    随着互联网的普及,越来越多的网站和应用程序需要处理大量的并发访问。在这种情况下,性能问题就变得非常重要。ASP网站也不例外,高并发访问可能会导致网站变慢,响应时间变长,甚至崩溃。在本文中,我们将探讨ASP网站如何应对高并发访问时的性能问题...
    99+
    2023-09-26
    并发 关键字 索引
  • 如何设置并访问redis数据库
    Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C...
    99+
    2022-10-18
  • ASP存储API的负载管理策略如何应对高并发访问?
    随着互联网的发展,高并发访问已经成为了一个不可避免的问题。在ASP存储API的使用中,如何应对高并发访问,才能保证系统的高可用性和稳定性,成为了一个亟待解决的问题。 ASP存储API是一种用于存储和管理数据的技术,其核心是一个API,可以...
    99+
    2023-07-29
    存储 api load
  • Java中的缓存加载算法如何应对并发访问的情况?
    随着互联网技术的不断发展,应用程序的性能和用户体验要求越来越高。在这样的背景下,缓存技术成为了提高应用程序性能的重要手段。Java作为一种广泛使用的编程语言,其缓存技术也得到了广泛的应用。 Java中的缓存加载算法有很多种,如LRU、FI...
    99+
    2023-09-27
    load 缓存 编程算法
  • Go Spring开发技术中,如何处理对象的并发访问问题?
    在Go Spring开发中,对象的并发访问问题是一个比较常见的问题。如果没有进行正确的处理,就有可能出现线程安全问题,导致应用程序出现异常或崩溃。本文将介绍在Go Spring中如何处理对象的并发访问问题。 一、Go Spring中的对象...
    99+
    2023-07-26
    spring 开发技术 对象
  • 对象重定向和并发问题:Java应该如何应对?
    Java是一门广泛应用的编程语言,它在很多领域都有着广泛的应用,但是在处理对象重定向和并发问题时,Java也存在一些挑战。本文将探讨Java在处理这些问题时的应对策略,并给出相应的演示代码。 对象重定向是指当一个对象被移动到另一个位置时,它...
    99+
    2023-10-15
    对象 重定向 并发
  • 如何解决redis的并发问题
    如何解决redis的并发问题?针对这个问题,今天小编总结了这篇文章,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。redis中的并发问题使用redis作为缓存已经很久了,redis是以单进程的形...
    99+
    2022-10-18
  • Redis如何解决高并发问题
    这篇文章主要介绍Redis如何解决高并发问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:redis为什么会有高并发问题redis的出身决定 redis是一种单线...
    99+
    2022-10-18
  • Linux环境下的PHP和Laravel框架,如何应对并发访问的挑战?
    随着互联网的发展,越来越多的网站和应用程序需要能够同时处理多个用户的请求。在这种情况下,如何应对并发访问的挑战,成为了一个非常重要的问题。本文将介绍在Linux环境下使用PHP和Laravel框架,如何应对并发访问的挑战。 一、PHP和L...
    99+
    2023-07-08
    linux laravel 并发
  • C#开发中如何处理并发访问问题
    C#开发中如何处理并发访问问题在C#开发中,处理并发访问问题是非常重要的,尤其是在多线程环境下。如果不正确处理并发访问,可能会导致数据不一致或者程序崩溃等问题。本文将介绍一些在C#开发中处理并发访问问题的常用方法,并提供具体的代码示例。使用...
    99+
    2023-10-22
    并发处理 线程安全 锁定
  • mongodb如何应对高并发
    mongodb应对高并发的方法:1、采用批量数据方式操作MongoDB,定时定量获取查询结果;2、在mongodb中设置一个库一个文件;3、mongodb存储引擎选择WiredTiger;4、增加mongodb最大连接数;5、优化mongo...
    99+
    2022-10-09
  • Python并发编程:如何应对Apache高并发?
    Apache作为一款世界知名的Web服务器,因其稳定性、安全性、可靠性等特点,在众多Web开发中得到广泛应用。然而,随着互联网的快速发展,用户对Web应用的访问量越来越大,Apache面临着越来越大的高并发压力。如何通过Python并发编...
    99+
    2023-11-13
    并发 apache 关键字
  • ASP 中如何实现高并发访问?
    在当今互联网时代,高并发访问已经成为了许多网站必须要面对的一个问题。ASP 网站也不例外。在面对大量的用户访问时,ASP 网站如何保证高并发访问的稳定性和可靠性呢?本文将介绍一些 ASP 中实现高并发访问的方法。 使用缓存机制 在 A...
    99+
    2023-11-07
    并发 bash 存储
  • redis单线程并发问题如何解决
    Redis是一个单线程的内存数据库,它使用了事件驱动的模型,通过将请求放入一个队列中顺序执行来实现并发处理。但是,在高并发情况下,可...
    99+
    2023-09-11
    redis
  • ASP网站如何实现高并发访问?
    在当今互联网时代,高并发访问是一个非常普遍的问题,特别是对于ASP网站而言。本文将从以下几个方面进行探讨。 缓存技术 缓存技术是提高ASP网站性能的一种非常有效的方式。缓存技术可以将经常被访问的网页、图片、CSS等静态资源进行缓存,以...
    99+
    2023-09-26
    并发 关键字 索引
  • 如何处理MySQL数据库的并发访问?
    如何处理MySQL数据库的并发访问?随着互联网的迅猛发展,我们生活中的各种服务和应用都变得越来越依赖数据库。而数据库的并发访问是一种常见场景,特别是在高并发访问的情况下,对数据库进行合理的并发控制是非常重要的。本文将介绍一些处理MySQL数...
    99+
    2023-10-22
    事务处理 并发控制 数据库锁
  • Go并发编程:如何优化存储访问?
    Go语言是一门非常适合并发编程的语言,但是在进行存储访问时,很容易遇到性能瓶颈。本文将介绍一些优化存储访问的技巧,让你的Go并发程序更加高效。 使用缓存 在并发编程中,读取和写入数据是非常耗时的操作。而缓存可以帮助我们避免频繁地读取和写...
    99+
    2023-10-17
    并发 教程 存储
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作