• JAVA开发(Redis的使用,SpringBoot使用redis分布式锁)


    在分布式系统中,使用锁也是很麻烦的事情,而且非常影响性能,对应原子性操作,就需要使用的分布式锁。下面学习一下springboot中集成的redis分布式锁的使用。

    引入maven依赖

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-data-redisartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>org.redissongroupId>
    7. <artifactId>redisson-spring-data-25artifactId>
    8. <version>3.16.4version>
    9. dependency>
    10. <dependency>
    11. <groupId>org.redissongroupId>
    12. <artifactId>redisson-spring-boot-starterartifactId>
    13. <version>3.16.4version>
    14. dependency>

    代码实现样例:

    1. @RestController
    2. @Slf4j
    3. public class RedisController {
    4. // spring boot 操作redis的模板方法类
    5. @Autowired
    6. private StringRedisTemplate redisTemplate;
    7. // redisson操作bean
    8. @Resource
    9. private Redisson redisson;
    10. @RequestMapping("/lock")
    11. public String deductTicket(){
    12. String lockKey = "ticket";
    13. // 在spring boot 2.0.6版本中整合的redisson,key和锁不能一样
    14. // redis setnx 操作,此处的lockKey在后面追加1是为了避免redisson锁时报错, 需要和待锁住的数据的key信息不同
    15. RLock lock = redisson.getLock(lockKey+"1");
    16. try {
    17. lock.lock();
    18. int ticketCount = Integer.parseInt(redisTemplate.opsForValue().get(lockKey));
    19. if (ticketCount > 0) {
    20. int realTicketCount = ticketCount - 1;
    21. log.info("扣除成功:剩余票数:" + realTicketCount);
    22. redisTemplate.opsForValue().set(lockKey, realTicketCount + "");
    23. return realTicketCount + "";
    24. } else {
    25. log.error("扣除失败");
    26. return "error";
    27. }
    28. return "end";
    29. } finally {
    30. lock.unlock();
    31. }
    32. }
    33. }

    核心代码:

    获取锁资源

     lock.lock();

    释放锁资源:

     lock.unlock();

    Redis是一个基于内存的高性能Key-Value数据库,其原理和使用如下:

    1. 原理:Redis本质上是一个Key-Value类型的内存数据库,整个数据库全部加载在内存中进行操作。数据结构是其核心,Redis支持多种数据结构,如String、List、Set、Sorted Set等,还支持发布/订阅、事务以及Lua脚本等功能。
    2. 性能:Redis具有非常出色的性能,每秒可以处理超过10万次读写操作,是已知性能最快的Key-Value DB。这是因为Redis的所有数据都放在内存中,通过异步的方式将数据写入磁盘,从而保证了快速和数据持久化的特征。
    3. 数据存储:Redis的数据都存储在内存中,因此数据库容量受到物理内存的限制。当数据量很大时,可以考虑分布式或其他数据库。
    4. 数据类型:Redis支持多种数据类型,包括String、List、Set、Sorted Set等。这些数据类型可以用来实现很多有用的功能,例如用List来实现FIFO双向链表,用Set来做高性能的tag系统等。
    5. 数据持久化:虽然Redis的数据主要放在内存中,但它也支持数据持久化。当设置了最大使用的内存后,数据已有记录数达到内存限值后不能继续插入新值。
    6. 分布式和回收策略:Redis也支持分布式和回收策略。在分布式系统中,数据可以在多个Redis实例之间进行分片存储。对于回收策略,Redis提供了几种选择,如volatile-lru、volatile-ttl和volatile-random等,用于从已设置过期时间的数据集中选择需要淘汰的数据。
    7. 使用:Redis的使用非常广泛,可以用于缓存、消息队列、排行榜、点赞系统等多种场景。同时,Redis还提供了丰富的API和命令行工具来帮助用户更加方便地使用它。

     

    Redis提供了多种机制来处理高并发情况,以下是几种常见的方法:

    1. 缓存机制:Redis可以将常用的数据缓存在内存中,从而降低对数据库的访问频率。这样可以减轻数据库的负担,提高系统的响应速度和并发能力。
    2. 队列机制:Redis提供了多种队列数据结构,如list和set,可以用来实现任务队列和消息队列等。通过使用队列,可以将请求分发到多个处理节点,从而提高系统的并发能力。
    3. 分布式锁:Redis可以用作分布式锁,确保同时只有一个客户端能够访问共享资源。这对于高并发场景下的数据一致性非常重要,可以避免出现脏数据。
    4. 持久化机制:Redis提供了将数据定期自动持久化至硬盘的能力,包括RDB和AOF两种方案,可以确保数据的稳定性。
    5. 连接池和读写锁:在客户端角度,可以创建连接池以复用连接,减少创建和销毁连接的开销。同时,对客户端读写Redis操作采用内部锁synchronized,保证操作的原子性。
    6. 优化服务器角度:服务器角度,可以利用setnx变向实现锁机制。具体实现方式可能因实际环境而异。
  • 相关阅读:
    SpringSecurity授权
    涵盖Java核心知识的综合指南:JavaGuide | 开源日报 0912
    [SDX35+WCN6856]SDX35 + WCN6856 WiFi导致系统crash问题分析及解决方案
    IDEA使用配置
    使用Docker提交参加阿里云比赛
    SSM毕业设计管理系统
    程序员突如其来的生日惊喜
    【EI会议征稿】第三届电子信息工程与计算机通信国际学术会议(EIECC 2023)
    [机缘参悟-76]:沟通技巧-职场中常见不合适语言的案例分析(尽量避免使用反问式语言)
    事件循环机制-Event-Loop
  • 原文地址:https://blog.csdn.net/dongjing991/article/details/127924073