*注:仅为个人学习以及记录使用
本章主要介绍一下整体项目中需要包含的内容以及需求分析
我们的项目主要是参照市面上的拼多多大转盘、稀土掘金幸运抽奖等营销系统,基于DDD架构开发了抽奖服务平台,用于满足拉新、促活、留存等需求,增加用户粘性。该项目的主要业务是提供权重值抽奖、奖品次数锁等多种差异化的抽奖,针对用户提供个性化抽奖,并开发了返利业务,对用户行为进行反馈,以此来达成促活的需求。
例如这是掘金的抽奖营销系统:
这里整个产品对应的需求流程设计:
给用户创建一个营销账户,存放用户的积分数据。积分可用于抽奖消耗。
返利服务,是基于用户的行为数据,增加各项积分。如用户的对话、充值等。
抽奖,则可以抽取到;积分、体验卡(开OpenAi账户)、增加账户中的模型和次数。
用户(Actor)行为:
用户通过执行一系列操作触发系统中的积分机制,例如点击抽奖、行为操作等。
点击抽奖:
用户点击抽奖按钮后,系统会先检查该用户是否有首次赠送的抽奖次数(一般是首次抽奖奖励)。
如果用户有首赠次数,则直接参与抽奖活动;如果没有,用户则会通过其他方式获取抽奖次数。
抽奖活动参与:
生成抽奖活动参 ...
本文仅仅用于学习,查看了星球内四月份到今天为止大家遇到的面试题,总结了自己认为有价值的。T1:抽奖前需要先创建一个抽奖订单(创建抽奖单可能扣减账户次数额度),然后真正执行抽奖。「抽奖订单」的设计,相对于「直接扣减账户中的抽奖次数余额」,能够解决什么实际问题?xfg回答:1.抽奖单设计是一种行为记录的流水,有了抽奖单可以做幂等重试,如果后序流程失败了,抽奖单不会被消费,用户可以重新使用抽奖单抽奖。如果是系统随机发奖,还可以系统基于失败的抽奖单自己做重试补偿。这种思想来自于商城下单,有了订单之后才有订单的支付。2.订单的存在可以让流程有了暂停和继续的操作。如果只是直接扣减账户抽奖次数余额,就只会得到执行结果,那么都是即时状态,过后无法追查校准。
T2:为什么不直接使用内存作为缓存而引入Redisxfg回答:
在营销复杂计算场景中,为了提高性能确实会用本地内存 + redis 缓存的方案。但本地内存会有一个问题,就是分布式架构下,在初始和变更数据,需要所有环境保持统一数据,并需要配有动态配置中心来通知更新。需要一定的维护成本。
一般做这类的系统,以及配置类的,是会存redis ...
需要继续创建一个测试模块
创建两个线程的配置
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051@Slf4j@EnableAsync@Configuration@EnableConfigurationProperties(ThreadPoolConfigProperties.class)public class ThreadPoolConfig { @Bean("threadPoolExecutor01") public ThreadPoolExecutor threadPoolExecutor01(ThreadPoolConfigProperties properties) { // 实例化策略 RejectedExecutionHandler handler; switch (properties.getPolicy()){ ...
需要新建一个spring-boog starter的模块
导入依赖
Google Guava ( com.google.guava:guava ): 这是一个由 Google 提供的核心库,包含了 大量的谷歌核心库,如集合、缓存、原生类型支持、并发库、通用注解、字符串处理、 I/O 等等。版本 32.1.3-jre 是针对 Java 运行时环境的特定版本。
Apache Commons Lang ( commons-lang:commons-lang ): 提供了一系列帮助处理 Java 核 心 API 不足之处的工具类,如字符串操作、反射、并发、数学等。版本 的一个稳定版本。
Apache Commons Codec ( 2.6 是这个库 commons-codec:commons-codec ): 提供了一些通用的编码解 码算法,如 Base64、Hex、MD5、SHA 等。版本 1.15 包含了最新的算法实现和性能 改进。
Alibaba Fastjson ( com.alibaba:fastjson ): 这是一个高性能的 JSON 库,支持将 Java ...
Redis中双写不一致的问题
Redis的五大数据类型
1. String(字符串)特点:
是最基础的数据类型,一个键对应一个字符串值,字符串可以是文本、数字或二进制数据。
最大存储容量为 512MB。
常用命令:
SET key value:设置一个键值对。
GET key:获取键对应的值。
INCR key:对键值进行自增操作。
APPEND key value:将值追加到现有的值后面。
使用场景:
缓存数据:缓存简单的字符串数据,如用户信息、配置等。
计数器:用 INCR 和 DECR 来实现递增或递减的计数功能,如网站点击量统计。
分布式锁:可以利用 SETNX 和 EXPIRE 实现分布式锁。
2. Hash(哈希)特点:
适合存储对象的数据结构,一个键对应一个 Hash 表,Hash 表中是字段-值的映射关系。
比较节省内存,尤其适用于存储少量字段的数据。
常用命令:
HSET key field value:为 Hash 表的某个字段设置值。
HGET key field:获取 Hash 表中特定字段的值。
HGETALL key:获取 Hash 表中所有字段和值。
使用场景:
...
Redis的哨兵机制
Redis的过期策略以及内存淘汰机制
布隆过滤器(Bloom Filter)是一种高效的空间使用概率型数据结构,用于测试一个元素是否在一个集合中。它具有显著的优势,但也存在一些缺点。以下是布隆过滤器的主要缺点:
1. 存在假阳性(False Positives)
解释:布隆过滤器可能会错误地报告一个元素在集合中,即使该元素实际上并不在集合中。这种错误称为假阳性。
影响:由于布隆过滤器可能产生假阳性结果,不能完全替代集合,也无法用于要求准确性的场景,如身份验证系统或安全性较高的系统。
2. 无法删除元素
解释:布隆过滤器不支持删除元素。因为一个元素的添加可能会影响多个比特位,如果直接清除这些位,可能会影响其他元素的存在判断。
影响:如果需要删除元素,布隆过滤器不适用。为了解决这个问题,可以使用计数布隆过滤器(Counting Bloom Filter),它为每个比特位维护一个计数器,但这会增加空间开销。
3. 假阳性率与负载有关
解释:布隆过滤器的假阳性率与元素数量和比特数组大小有关。当加入的元素数量增多,假阳性率会逐渐增加。
影响:随着集合大小增长,布隆过滤器的准确性会下降,除非显著增加其存储空间,这与其高效空间使用 ...
缓存三大问题