RedisAtomicLong

介绍

RedisAtomicLong 是 Spring Data Redis 提供的一个类,用于在 Redis 中实现原子性的长整型操作。它类似于 Java 的 AtomicLong,但其操作是基于 Redis 的,因此可以在分布式环境中使用。

主要功能

  • 原子性递增和递减:可以在 Redis 中原子性地递增或递减一个长整型值。
  • 线程安全:由于 Redis 本身的特性,RedisAtomicLong 可以在分布式系统中保证线程安全。

使用示例

以下是一个简单的示例,展示如何使用 RedisAtomicLong

  1. 引入依赖
    确保在项目中引入了 Spring Data Redis 的依赖。

    <dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>2.x.x</version>
    </dependency>
    
  2. 配置 Redis 连接
    application.ymlapplication.properties 文件中配置 Redis 连接信息。

    spring:redis:host: localhostport: 6379
    
  3. 使用 RedisAtomicLong
    在代码中使用 RedisAtomicLong 进行原子性操作。

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.support.atomic.RedisAtomicLong;
    import org.springframework.stereotype.Service;@Service
    public class CounterService {private RedisAtomicLong counter;@Autowiredpublic CounterService(RedisConnectionFactory redisConnectionFactory) {// 初始化 RedisAtomicLong,指定 Redis 键名为 "counter"this.counter = new RedisAtomicLong("counter", redisConnectionFactory);}public long incrementAndGet() {// 原子性递增并获取值return counter.incrementAndGet();}public long decrementAndGet() {// 原子性递减并获取值return counter.decrementAndGet();}public long get() {// 获取当前值return counter.get();}public void set(long newValue) {// 设置新值counter.set(newValue);}
    }
    
  4. 使用服务
    在你的业务逻辑中使用 CounterService 来进行计数操作。

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;@RestController
    @RequestMapping("/counter")
    public class CounterController {@Autowiredprivate CounterService counterService;@GetMapping("/increment")public long increment() {return counterService.incrementAndGet();}@GetMapping("/decrement")public long decrement() {return counterService.decrementAndGet();}@GetMapping("/value")public long getValue() {return counterService.get();}@GetMapping("/set")public void setValue(long newValue) {counterService.set(newValue);}
    }
    

解释

  1. RedisConnectionFactory:用于创建 Redis 连接的工厂类。
  2. RedisAtomicLong:通过 RedisConnectionFactory 初始化 RedisAtomicLong,并指定一个 Redis 键名(例如 "counter")。
  3. incrementAndGetdecrementAndGet:分别用于原子性地递增和递减计数器的值。
  4. getset:用于获取和设置计数器的值。

注意事项

  • 性能:由于 RedisAtomicLong 的操作是基于 Redis 的,因此其性能取决于 Redis 服务器的性能和网络延迟。
  • 持久化:确保 Redis 服务器配置了适当的持久化策略,以避免数据丢失。
  • 并发性RedisAtomicLong 可以在分布式环境中使用,确保了并发操作的原子性。

通过使用 RedisAtomicLong,你可以在分布式系统中实现线程安全的计数器,适用于需要高并发和分布式环境的场景。

使用

在多个服务之间同时写入到同一个 RedisAtomicLong 实例(即使用相同的 Redis 键名)时,不会导致值被覆盖。这是因为 RedisAtomicLong 的操作是基于 Redis 的原子性命令(如 INCRDECR 等)实现的,这些命令在 Redis 中是原子性的,能够保证并发操作的正确性。

原子性操作

Redis 提供了一些原子性命令来操作整数值,例如:

  • INCR:将键的值加1。
  • DECR:将键的值减1。
  • INCRBY:将键的值增加指定的整数。
  • DECRBY:将键的值减少指定的整数。

这些命令在 Redis 中是原子性的,即使在高并发的情况下,也能保证操作的正确性。

示例代码

假设我们有两个服务同时操作同一个 RedisAtomicLong 实例:

服务1
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
import org.springframework.stereotype.Service;@Service
public class Service1 {private RedisAtomicLong counter;@Autowiredpublic Service1(RedisConnectionFactory redisConnectionFactory) {this.counter = new RedisAtomicLong("counter", redisConnectionFactory);}public long incrementAndGet() {return counter.incrementAndGet();}
}
服务2
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
import org.springframework.stereotype.Service;@Service
public class Service2 {private RedisAtomicLong counter;@Autowiredpublic Service2(RedisConnectionFactory redisConnectionFactory) {this.counter = new RedisAtomicLong("counter", redisConnectionFactory);}public long incrementAndGet() {return counter.incrementAndGet();}
}

测试并发操作

我们可以编写一个简单的测试来模拟两个服务同时操作 RedisAtomicLong

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class TestRunner implements CommandLineRunner {@Autowiredprivate Service1 service1;@Autowiredprivate Service2 service2;@Overridepublic void run(String... args) throws Exception {// 模拟并发操作for (int i = 0; i < 100; i++) {new Thread(() -> {System.out.println("Service1 increment: " + service1.incrementAndGet());}).start();new Thread(() -> {System.out.println("Service2 increment: " + service2.incrementAndGet());}).start();}}
}

结果

在上述测试中,Service1Service2 会同时对同一个 RedisAtomicLong 实例进行递增操作。由于 Redis 的原子性命令保证了操作的正确性,因此不会出现值被覆盖的情况。

总结

Redis 的原子性命令保证了并发操作的正确性,因此在多个服务之间同时写入到同一个 RedisAtomicLong 实例时,不会导致值被覆盖。你可以放心地在分布式环境中使用 RedisAtomicLong 来实现线程安全的计数器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卷积神经网络(一)-LeNet-5

前言 LeNet开启了卷积神经网络的第一枪&#xff0c;这一网络模型由Yann LeCun等人在1998年提出&#xff0c;被视为卷积神经网络的开山之作。 论文地址&#xff1a; http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf 如果打不开就看csdn&#xff1a; https://download.…

人工智能算法工程师(中级)课程15-常见的网络模型及设计原理与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程15-常见的网络模型及设计原理与代码详解。 本文给大家介绍常见的网络模型及其设计原理与代码实现&#xff0c;涵盖了LeNet、AlexNet、VggNet、GoogLeNet、InceptionNet、ResNet、Dense…

MATLAB科研数据可视化教程

原文链接&#xff1a;MATLAB科研数据可视化https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247609462&idx3&snf7043936fc5ee42b833c7c9f3bcd24ba&chksmfa826d91cdf5e4872eb275e5319b66ba6927ea0074fb2293fe1ca47d6aedf38ab91050be484c&token1551213…

SQL面试题练习 —— 统计最大连续登录天数区间

目录 1 题目2 建表语句3 题解 1 题目 2 建表语句 CREATE TABLE IF NOT EXISTS user_login_tb (uid INT,login_date DATE ); insert into user_login_tb(uid, login_date) values( 1, 2022-08-02),(1, 2022-08-03),(2, 2022-08-03),(2, 2022-08-04),(2, 2022-08-05),(2, 2022-08…

Elasticsearch SQL:解锁Elasticsearch数据的新方式

在数据驱动的时代&#xff0c;Elasticsearch以其强大的全文搜索和实时分析能力&#xff0c;成为了处理和分析大数据的热门选择。然而&#xff0c;对于熟悉SQL语法的开发人员和数据分析师来说&#xff0c;直接使用Elasticsearch的Query DSL&#xff08;领域特定语言&#xff09;…

6个高效再利用的UI作品集设计模板

UI 作品集是指用户界面设计师的个人作品集。它展示了设计师的设计能力、技巧和风格&#xff0c;也是充分展示他们设计能力的证明。优秀的UI 作品集应具有简洁明了、美观大方、良好的互动体验和明确的目标。本文将从两个方面的介绍 Ui 作品集模板的全部内容&#xff1a;UI 作品集…

【C++11】(lambda)

C11中的lambda与线程。 目录 Lambda&#xff1a;仿函数的缺点&#xff1a;Lambda语法&#xff1a;Lambda使用示例&#xff1a;两数相加&#xff1a;两数交换&#xff1a;解决Goods排序问题&#xff1a; Lambda原理&#xff1a; Lambda&#xff1a; 假设我们有一个商品类&…

山东航空小程序查询

山东航空小程序 1) 请求地址 https://scxcx.sda.cn/mohe/proxy?url/trp/ticket/search 2) 调用方式&#xff1a;HTTP post 3) 接口描述&#xff1a; 接口描述详情 4) 请求参数: {"dep": "TAO","arr": "HRB","flightDate&qu…

ClickHouse集成LDAP实现简单的用户认证

1.这里我的ldap安装的是docker版的 docker安装的化就yum就好了 sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo systemctl start docker 使用下面的命令验证sudo docker run hello-world docker pull osixia/openl…

微信小程序与本地MySQL数据库通信

微信小程序与本地MySQL数据库通信 因为本地MySQL服务器没有域名&#xff0c;也没有进行相应的请求操作封装&#xff0c;因此微信小程序没办法和数据库通信。 但是对于开发人员来说&#xff0c;没有数据库&#xff0c;那还能干撒&#xff1f;虽然我尝试过用json-server&#x…

好用的AI搜索引擎

1. 360AI 搜索 访问 360AI 搜索: https://www.huntagi.com/sites/1706642948656.html 360AI 搜索介绍&#xff1a; 360AI 搜索&#xff0c;新一代智能答案引擎&#xff0c;值得信赖的智能搜索伙伴&#xff0c;为复杂搜索提供专业支持&#xff0c;解锁更相关、更全面的答案。AI…

数据库day2

复盘上一天的内容&#xff1a; 数据库的种类&#xff1f;你了解的数据库?什么是数据库&#xff1f; 怎么增加表中数据 &#xff0c;怎么删除表中数据&#xff0c; 怎么创建表中数据。 数据库编程的操作步骤&#xff1f; 打开数据库--增删改查--关闭数据库。 s…

探索Facebook的最新更新:社交体验的新高度

Facebook作为全球领先的社交媒体平台&#xff0c;一直致力于不断创新和改进&#xff0c;以提供更优质的用户体验。近期&#xff0c;Facebook推出了一系列新的更新&#xff0c;旨在提升用户的社交互动体验和平台功能。本文将详细探讨这些最新更新&#xff0c;分析其对用户和社交…

【cocos creator】【TS】ts入门,cocos creator基础知识

TS入门 记录常用的 系统学习可参考&#xff1a;菜鸟教程 1、语法规范&#xff1a; 以换行分割语句&#xff0c; 可省略末尾分号&#xff0c;同一行需要使用分号来分隔 2.打印log console.log("Hello World!")//白色&#xff0c;一般提示 console.warn("Hel…

如何用AI交互数字人一体机,打造政务服务新名片?

如今&#xff0c;将“高效办成一件事”作为优化政务服务、提升行政效能的重要抓手&#xff0c;各地方为了促进政务服务由传统模式向数字化、智能化方向转变&#xff0c;纷纷在政务服务场景融合了AI交互数字人&#xff0c;实现“无人化、智慧化”导办、帮办、代办等模式&#xf…

9、Redis之哨兵

Redis之哨兵 1、什么是哨兵 ​ 对于Master宕机后的冷处理方式是无法实现高可用的。Redis从2.6版本开始提供了高可用的解决方案–Sentinel哨兵机制。在集群中再引入一个节点&#xff0c;该节点充当Sentinel哨兵&#xff0c;用于监视Master的运行状态&#xff0c;并在Master宕机…

Gemma的简单理解;Vertex AI的简单理解,与chatGpt区别

目录 Gemma的简单理解 Vertex AI的简单理解 Gemma Vertex AI Gemma Vertex AI和chatcpt区别 一、定义与功能 二、技术特点 三、应用场景 四、获取与部署 Gemma的简单理解 定义与功能: Gemma是谷歌开源的一款大语言模型,它采用了Gemini架构,并提供了20亿(2B)和7…

Apache AGE的MATCH子句

MATCH子句允许您在数据库中指定查询将搜索的模式。这是检索数据以在查询中使用的主要方法。 通常在MATCH子句之后会跟随一个WHERE子句&#xff0c;以添加用户定义的限制条件到匹配的模式中&#xff0c;以操纵返回的数据集。谓词是模式描述的一部分&#xff0c;不应被视为仅在匹…

3D问界—在MAYA中使用Python脚本进行批量轴居中

问题提出&#xff1a;MAYA中如何使用Python脚本 今天不是一篇纯理论&#xff0c;主要讲一下MAYA中如何使用Python脚本&#xff0c;并解决一个实际问题&#xff0c;文章会放上我自己的代码&#xff0c;若感兴趣欢迎尝试&#xff0c;当然&#xff0c;若有问题可以见文章末尾渠道&…

分布式IO系统2通道串口通信模块M602x

现场总线耦合器本身包含一个电源模块&#xff0c;它有 2 个串口通道&#xff0c;通过 Modbus RTU&#xff08;Master&#xff09;协议连接外部串行设备&#xff0c;实现耦合器与外部串行设备通信&#xff0c;现以连接设备的示例带大家了解我们钡铼的2 通道串口通信模块 M602x。…