# 基础项目 **Repository Path**: wenbina/basic-project ## Basic Information - **Project Name**: 基础项目 - **Description**: 项目基础框架搭建,日志等常用模块 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-05-28 - **Last Updated**: 2023-09-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 国际化 1:国际化 (1)在resource目录下新建i18n目录 (2)在i18n目录下新建xx.properties、xx_语言.properties等配置文件 (3)在yml配置文件中定义多语言文件包路径:spring.messages.basename=i18n/messages (4)通过调用applicationContext.getMessage即可获取国际化后的数据 2:国际化子线程传递 ### 登录 (1)通过账号密码查询用户信息,未找到:return; (2)通过userId查询用户权限 (3)生成token值并构建对应账号信息 (4)将token以及账号信息放入缓存中(redis) ### requireLogin (1)自定义@RequireLogin注解标明接口调用时是否需要用户进行登录 (2)登录拦截 1:请求进来时会先被登录拦截器(LoginInterceptor)拦截 2:前置处理方法会先判断当前接口是否存在@RequireLogin注解 3:不存在注解,直接放行; 4:存在注解,获取请求参数中的token字段,通过token值查询缓存中对应的账号信息 5:请求结束之后调用登录拦截器后置处理方法,将ThreadLocal中的账号信息remove,防止内存泄漏 (3)将账号信息放入ThreadLocal中(AuthenticationContext.setAuthentication),方便后续方法调用使用 ### RequestParameter、RequestParameterOne请求参数注解 ### 缓存 缓存基本上分为三类:本地缓存、分布式缓存、多级缓存; 根据缓存和应用程序是否属于同一个进程,将缓存分为本地缓存和分布式缓存; 基于本地缓存和分布式缓存各自的优缺点引入多级缓存 本地缓存 概念:和应用程序在同一个进程的内存空间去存储数据,数据的读写都是在同一个进程内完成的 优点:读取速度块,本地缓存不需要远程网络请求,没有额外操作,所以读取速度快 缺点: (1)集群部署会存在数据不一致情况 (2)应用重启数据会丢失 (3)只能存储少量数据 实现: (1)HashMap、ConcurrentHashMap (2)使用封装好的工具包也可实现本地缓存(Caffeine或Guava) 分布式缓存 概念:与应用程序没有部署在一台服务器上,需要通过网络请求来进行读写操作 优点 (1)支持大数据量存储 (2)数据不会丢失 (3)能保证数据一致性 缺点:数据跨网络传输,读写性能不如本地缓存 实现: redis和memCache 多级缓存 本地缓存和分布式缓存一起使用:本地缓存一般存储更新频率低,访问频率高数据,分布式缓存存储更新频率较高的数据 请求流程 本地缓存作为一级缓存,分布式缓存作为二级缓存;当用户获取数据时,优先从一级缓存中获取数据,若数据不存在则查询 二级缓存,查询到数据后更新到一级缓存 在集群部署时一级缓存容易出现数据不一致情况,可以通过redis的消息发布/订阅机制实现多个节点缓存数据一致性问题 限流注解 抢红包 用什么数据结构安装并记录本次发送的红包:100块,分10个红包发送,用什么数据结构 大家都要差不多的金额,需要考虑红包金额拆分的范围,拆分红包的算法需要什么算法 如何在高并发下抢红包,数据一致性+高并发+不能加锁 记录本次红包活动数据争抢情况: 1:每个人分别抢到了多少,要记录本次短期 2:长期的统计记录,年度红包总结 3:发送的红包没人抢夺,24小时后要退回 抢红包流程 1:发红包:使用redis的list结构:lpush和lpop 2:拆红包:二倍均值算法拆分,获得红包金额数组列表 3:抢红包: 4:记红包 二倍均值法 剩余红包金额为M,剩余人数为N,则有一下公式 每次抢到的金额 = 随机区间(0,(剩余红包金额M/剩余人数N)* 2);此公式保证了每次随机金额的平均值是相等的,不会因为抢红包先后顺序而造成不公平