当前位置: 首页 > news >正文

呼和浩特市网站搜索引擎的工作原理是什么

呼和浩特市网站,搜索引擎的工作原理是什么,旅游网站网页设计报告,html模板大全1.不用redis?分布式锁,如何防止用户重复点击? 1.乐观锁 乐观锁是一种在数据库层面上避免并发冲突的机制。它通常通过在数据库记录中添加一个版本号(或时间戳)来实现。每次更新记录时,都会检查版本号是否与数据库中的…

1.不用redis?分布式锁,如何防止用户重复点击?

1.乐观锁

乐观锁是一种在数据库层面上避免并发冲突的机制。它通常通过在数据库记录中添加一个版本号(或时间戳)来实现。每次更新记录时,都会检查版本号是否与数据库中的版本号匹配,如果匹配,则更新数据并将版本号加一。这确保了在更新期间没有其他操作更改了记录。

  • 应用场景:适用于更新操作并不频繁,且冲突概率较低的场景

代码实现:

//实体类:注意@Version注解
@Entity
@Table(name = "form_submissions")
public class FormSubmission {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "user_id")private Long userId;@Column(name = "form_data")private String formData;@Column(name = "version")@Versionprivate int version;// 构造函数、Getter和Setter略去
}//业务层
@Service
public class FormSubmissionService {@Autowiredprivate FormSubmissionRepository repository;@Transactionalpublic String submitForm(Long userId, String formData) {Optional<FormSubmission> existingSubmission = repository.findById(userId);FormSubmission submission;if (existingSubmission.isPresent()) {// 更新现有记录submission = existingSubmission.get();submission.setFormData(formData);} else {// 创建新的记录submission = new FormSubmission();submission.setUserId(userId);submission.setFormData(formData);submission.setVersion(0); // 或根据需要设置初始版本号}try {repository.save(submission);return "表单提交成功。";} catch (org.springframework.orm.ObjectOptimisticLockingFailureException e) {// 捕获乐观锁异常,处理冲突return "提交失败,请不要重复提交。";}}
}//没有注解的时候sql层
UPDATE form_submissions
SET form_data = '新的表单数据', version = version + 1
WHERE id = ? AND version = ?;

2.数据库悲观锁

悲观锁通常通过数据库提供的锁机制实现,如 SQL 的 SELECT FOR UPDATE 语句,这会锁定被选中的数据库行,直到事务完成。这种方法适用于高冲突环境,因为它会阻止其他任何尝试修改这些行的操作。

  • 应用场景:适用于更新操作频繁,且冲突概率高的场景。

代码实现:

@Service
public class FormSubmissionService {@Autowiredprivate FormSubmissionRepository repository;@Transactionalpublic boolean submitForm(Long userId, String formData) {Optional<FormSubmission> existingSubmission = repository.findByUserIdForUpdate(userId);if (existingSubmission.isPresent()) {// 存在记录,处理重复提交逻辑return false;} else {// 不存在记录,保存新的表单提交FormSubmission submission = new FormSubmission();submission.setUserId(userId);submission.setFormData(formData);repository.save(submission);return true;}}
}//sql层代码
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("SELECT fs FROM FormSubmission fs WHERE fs.userId = :userId")
Optional<FormSubmission> findByUserIdForUpdate(@Param("userId") Long userId);

3.基于内存的锁

如果你的应用程序运行在单个实例或能够使用共享内存系统(如 Hazelcast、Apache Ignite),可以使用内存中的数据结构来实现锁逻辑。例如,使用一个全局哈希表存储正在进行的操作的标识符,来防止重复。

  • 应用场景:适用于单实例应用或者有共享内存系统的分布式应用。
@Service
public class FormSubmissionService {private final Map<Long, Lock> userLocks = new HashMap<>();public String submitForm(Long userId, String formData) {Lock lock = userLocks.computeIfAbsent(userId, k -> new ReentrantLock());if (lock.tryLock()) {try {// 模拟表单处理逻辑Thread.sleep(1000); // 假设处理需要一段时间System.out.println("表单数据处理: " + formData);return "表单提交成功。";} catch (InterruptedException e) {Thread.currentThread().interrupt();return "表单处理中断。";} finally {lock.unlock();}} else {return "正在处理中,请不要重复提交。";}}
}

4.应用程序级的去重逻辑

在应用程序级别实现去重逻辑,例如,通过在前端禁用提交按钮,直到请求完成,或者在后端设置一个短暂的时间窗口,在这个窗口内忽略来自同一用户的重复请求。

  • 应用场景:适用于需要快速实现且冲突概率不高的场景。

5.唯一标识符

要求客户端在请求时生成一个唯一的标识符(如 UUID),并在服务器端检查这个标识符是否已经被处理。这个标识符可以存储在内存或数据库中,以确保每个请求只被处理一次。

  • 应用场景:适合于任何需要确保请求唯一性的场景,特别是在分布式系统中。

代码实现:

@Service
public class RequestService {@Autowiredprivate RequestIdRepository requestIdRepository;public boolean processRequest(String requestId) {// 检查请求ID是否已存在Optional<RequestId> existingRequestId = requestIdRepository.findById(requestId);if (existingRequestId.isPresent()) {// 请求ID已存在,拒绝重复处理return false;} else {// 请求ID不存在,处理请求RequestId newRequestId = new RequestId();newRequestId.setId(requestId);requestIdRepository.save(newRequestId); // 保存请求ID标记为已处理// 在这里执行其他请求处理逻辑...return true;}}
}

在这个实现中,客户端需要生成一个 UUID 并在每次请求时发送这个 UUID 作为 `requestId` 参数。服务器通过检查这个 `requestId` 是否已经存在于 `request_ids` 表中来防止重复处理相同的请求。这种方法适用于分布式系统中确保请求的唯一性,有效地防止了用户因为多次点击导致的重复请求问题。

2.Cookie、Session、Token、JWT之间的区别

傻傻分不清之 Cookie、Session、Token、JWT - 掘金

3.40亿个QQ号,限制1G内存,如何去重?

1.位图(Bitmap)

图是一种非常高效的数据结构,通过使用1个位来标记某个元素是否存在。假设我们使用40亿位(或者说500MB)的内存空间,就可以表示40亿个不同的QQ号。

  1. 初始化位图:创建一个大约500MB大小的位图,每个位对应一个可能的QQ号。由于QQ号可能不会完全连续,我们需要根据实际QQ号的范围来调整位图的大小。

  2. 标记QQ号:遍历所有QQ号,对每个QQ号,计算它在位图中的位置,并将相应的位设置为1。

  3. 去重:再次遍历QQ号,通过检查位图中对应位的值,可以判断一个QQ号是否已经出现过。

这种方法的缺点是,如果QQ号的范围非常大,位图的大小可能会超出1GB的内存限制。

代码实现:

public class Bitmap {private byte[] bits;public Bitmap(int size) {bits = new byte[(size + 7) / 8];}public void set(int k) {int byteIndex = k / 8;int bitIndex = k % 8;bits[byteIndex] |= (1 << bitIndex);}public boolean get(int k) {int byteIndex = k / 8;int bitIndex = k % 8;return (bits[byteIndex] & (1 << bitIndex)) != 0;}
}// 假设QQ号范围在一定区间内,这里简化处理
Bitmap bitmap = new Bitmap(4000000000); // 大约需要500MB内存
// 设置QQ号
bitmap.set(qqNumber);
// 检查QQ号是否已存在
boolean exists = bitmap.get(qqNumber);

2.布隆过滤器(Bloom Filter)

布隆过滤器是一种空间效率极高的概率型数据结构,用于判断一个元素是否在集合中:

  1. 初始化布隆过滤器:根据数据量和可接受的误判率初始化布隆过滤器。

  2. 添加元素:遍历QQ号,将每个QQ号添加到布隆过滤器中。

  3. 预过滤:再次遍历QQ号,首先使用布隆过滤器检查是否可能已经存在。由于布隆过滤器存在一定的误判率,对于判断存在的元素,需要进一步确认。

布隆过滤器适用于快速预过滤,减少需要进一步处理的数据量,但需要额外的机制来处理误判。

public class BloomFilter {private BitSet hashes;private int size;public BloomFilter(int size) {this.size = size;this.hashes = new BitSet(size);}private int hash(Object obj, int k) {return Math.abs(obj.hashCode() * k) % size;}public void add(Object obj) {for (int k = 1; k <= 3; k++) { // 使用3个不同的哈希函数int hash = hash(obj, k);hashes.set(hash);}}public boolean mightContain(Object obj) {for (int k = 1; k <= 3; k++) {int hash = hash(obj, k);if (!hashes.get(hash)) {return false; // 如果有一个位不是1,那么对象肯定没有添加}}return true; // 可能包含}
}// 使用
BloomFilter filter = new BloomFilter(100000000); // 需要调整大小以适应内存限制
filter.add(qqNumber);
boolean mightExist = filter.mightContain(qqNumber);

http://www.yayakq.cn/news/684251/

相关文章:

  • 贵阳专业做网站公司有哪些嫦娥直播
  • 开发公司物业服务合同成都百度提升优化
  • 怎样申请网站域名和空间什么是响应式网站
  • 广州企业网站建设电话郑州区块链数字钱包网站开发方案
  • 网站建设规划方案.ppt中国纪检监察报
  • 设计软件免费下载网站网络营销心得体会1000字
  • 个人网站域名取名幸运28网站建设
  • 如何制作网站的横幅win8风格门户网站
  • 公司宣传网站制作海南中小企业网站建设
  • 注册越南网站vnwordpress播放百度云
  • 网站制作模板过程视频链接生成器
  • 营销型网站建设 深圳信科装修网站建设公司
  • 番禺建设网站专家链接交易网
  • 百度不收录网站怎么办兰州网站制作公司
  • 设计网站需求photoshop制作网站海报
  • 南昌网站开发公司电话做的比较好的旅游网站
  • 自己做ppt网站wordpress添加编辑器
  • 网站功能开发费用多少钱广州市医院网站建设
  • 做外贸网站商城营销智库网站
  • 网站建设推广工资wordpress怎么设置伪静态页面
  • 建设网站的新闻做网站怎么找公司
  • php网站后台登陆地址给网站做视频怎么赚钱
  • 如何做 行业社交类网站宁波seo推广联系方法
  • 免费自助建网站软件泉州免费做网站
  • 辽源网站建设常设中国建设工程法律网站
  • 做茶歇的网站部署推进网站建设
  • 怎么对一个网站做优化怎么做信息发布型网站
  • 优设网页设计网站安卓系统软件开发培训
  • 雷神代刷推广网站抄一则新闻四年级
  • 做外贸必看的网站和论坛有哪些淘宝网站建设没法上传怎么办