公司运营部那边需要做一个营销活动-springrain活动,上午和team leader、同一组的同事和产品经理一同听取并讨论了活动的需求,以及一些细节性的东西。
大致需求是这样的,由于保密的原因,这里只列出大概的需求。就是每一个阶段都有一个浇水的滴数,达到这个浇水的滴数,app上的小数就成长一个阶段,以此类推。一共有5个阶段。
后面我和同事就开始进行数据库表的相关设计,以及涉及到提供给app前端的接口方法。这是每一次做后端接口的必要的工作步骤。api的接口方法,我和另一个同事进行了不同的分工,每人写几个接口方法,同时进行自测并和前端人员进行联调。
在设计到给树浇水的这个接口的时候,同事一开始是对于每一个浇水的人,都直接进行数据库操作,保存每一个会员的浇水记录,接口很快就写完并发布了。后续进行测试的时候,发现了问题。同事写了一个python的脚本进行多线程并发去测试该接口,出来的结果出人意料的出错了,有丢失更新的问题。或者说是并发导致了数据被覆盖了。所以,对于存在并发的这种操作,我们想到的方法就是加锁,或者同步。
加锁,这种操作我们一般分为业务加锁和数据库层面的锁。数据库层面的锁我们可以用悲观锁也可以用乐观锁,但通常这种问题我们不会再数据库层面进行处理。所以这种解决方案我们就忽略到,有对悲观锁和乐观锁不明白的童鞋,请自行google。
这里我们说一下业务层面的加锁也就是通常的同步操作,对于java层面的同步一般对于并发的性能支持的不好,如果并发量比较大,会造成排队甚至丢失连接的情况。所以这种方案对于我们也不可行。最后讨论的结果是使用基于生产者-消费者的模式解决并发问题,是并发从并发变为同步操作,从多线程变单线程。
这里我只写一下伪代码:
public void save(){ //组织数据 //将数据放入到队列,返回 jedisClient.lpop(xxxx) }
然后启动一个后台线程池从队列中取出需要保存的数据对象,进行数据库操作。类型的伪代码如下:
ScheduledExecutorService executor = Executors.newFixedThreadPool(6); executorService.execute(new Runnable() { @Override public void run() { //数据库操作 } }
从而解决上面的问题,这里面的队列是redis内部实现的一个简单的队列
相关推荐
总结来说,这个项目结合了SpringBoot的便捷开发、MyBatis的数据库操作、Redis的高并发处理能力,以及队列处理策略,构建了一个能够应对高并发抽奖场景的后台系统。这样的设计不仅提高了系统的稳定性和性能,还降低了...
总结来说,这个"Redis高并发秒杀商品系统"通过Spring MVC处理请求,Bootstrap构建用户界面,Redis优化数据访问并保障并发安全性,MyBatis负责数据库操作,共同构建出一个既能应对大规模用户并发,又能提供良好用户...
总结来说,"Redis Spring 并发限制动态代理"是利用Spring的AOP和线程池技术,为Redis操作提供了一种安全、高效的并发解决方案。动态代理保证了连接的生命周期管理,线程池则控制了并发访问的规模,防止资源过度消耗...
总结一下,处理php_redis并发insert的关键在于: 1. 利用PHP Redis扩展与Redis交互,确保数据一致性。 2. 使用Apache进行并发模拟调试,评估和优化Web应用性能。 3. 通过Redis队列解决并发插入问题,利用原子性pop...
本文将深入探讨Redis的基本概念、工作原理、存储机制,并总结一些常见的面试问题。 1. Redis基本概念: - 数据类型:Redis支持五大数据类型:字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted...
总结来说,PHP结合Redis可以有效地处理高并发下的抢购场景,通过缓存、事务、发布/订阅、有序集合以及限流策略等手段,实现系统的高可用性和性能优化。理解并掌握这些技术,对于构建可扩展的Web应用至关重要。
总结一下,Redis是一个强大的内存数据库,具备高速读写、丰富的数据结构、持久化机制以及消息队列等功能,广泛应用于缓存、数据库、消息中间件等多个领域。学习并熟练掌握Redis的使用,对于提升系统的性能和稳定性...
8. **性能优化**:Redis 3.0.1 在性能方面做了很多工作,例如更快的命令处理速度、更低的延迟以及更高效的网络IO。这使得 Redis 能够处理更大规模的数据和更高的并发请求。 9. **命令和模块支持**:3.0.1 版本可能...
作为一个开源项目,Redis 支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,这使得它在处理复杂的数据操作时具有很高的灵活性。 **Redis 的特性** 1. **内存存储**: Redis 将所有数据存储在内存中,以...
本文将围绕Redis的高级功能——事务、集群、高可用性和高并发处理等方面进行深入探讨。通过理论与实践相结合的方式,旨在帮助读者更好地理解和掌握这些高级特性。 #### 二、高可用性与高并发处理 ##### 2.1 高可用...
总结起来,使用Redis作为任务队列分发子任务,能够充分利用其高性能和丰富的特性,提升分布式系统中任务处理的效率和可靠性。在实际项目中,结合业务需求,合理设计任务队列的架构和策略,可以进一步优化系统性能,...
总结起来,"秒杀系统企业级实战应用"系列课程将带你走进真实的工业界案例,通过理论与实践的结合,深入理解如何利用Redis集群解决高并发秒杀问题。通过这两个章节的学习,你将掌握如何构建一个稳定、高效且能够应对...
Redis,全称REmote Dictionary Server,是一种开源的、基于键值对的高性能NoSQL数据库。自2008年由Salvatore Sanfilippo...因此,从知道如何使用Redis到理解其工作原理,对于任何IT专业人员来说,都是非常有价值的。
因此,除非有特别的理由选择32位版本,否则一般推荐使用64位的Redis实例,特别是在需要处理大量数据或者高并发访问的场景下。 总结起来,Redis数据库32位版本是为资源受限的环境设计的,它在内存管理和数据存储方面...
- **Redis简介**:Redis是一种基于内存的NoSQL数据库,使用C语言编写,支持多种数据结构,如字符串(Strings)、散列(Hashes)、列表(Lists)、集合(Sets)以及有序集合(Sorted Sets)等。 - **应用场景**: - **缓存**...
总结来说,这个示例展示了如何利用Redis构建一个分布式任务分发系统,通过创建多个队列来处理不同任务批次,以达到灵活管理和高效执行的目的。同时,通过自定义序列化类和配置类,优化了数据存储和传输的效率。整个...
在高并发的应用场景中,将读取请求和写入请求分开处理是非常重要的。这不仅有助于提高系统的响应速度,还能有效避免单点故障问题。读写分离通常是通过配置多个Redis实例来实现:一个或多个用于写操作(如插入、更新...
尽管如此,Redis仍然可以通过多路复用技术高效地处理大量并发连接。 #### 7、一个字符串类型的值能存储最大容量是多少? Redis中字符串类型的值最大可存储512MB。 #### 8、Redis的持久化机制是什么?各自的优缺点...
2. **高性能**:通过高效的网络 I/O 和多路复用,`go-redis` 能够处理大量的并发请求。 3. **连接池**:自动管理 Redis 连接,避免频繁创建和销毁连接,提高性能。 4. **Pipeline 和 Transaction**:支持批量发送...
总结来说,Redis集群是提升系统性能和可用性的关键,而Spring-data-redis则是简化了在Java应用中使用Redis(包括集群)的过程,提供了一套完整的操作API。通过理解并熟练掌握这两个方面,可以有效地利用Redis来解决...