积分签到mysql_简易积分签到功能java代码实现实现Redis缓存数据
-------需求说明
---- 需求分析
积分签到处于app页面“我的”,用户会频繁的来回切换,如果将数据全部存储到数据库中然后去数据库中做查询,所以这里我才用的Redis缓存的方式将签到数据缓存起来;
在表结构设计的时候,由于需求还没有完全确定下来,所以签到规则等信息还不是很明确,这里配置了两个表,一个积分签到表,一个积分配置表;
CREATE TABLE `np_customer_sign_info` (
`sign_info_id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`rule_name` varchar(50) DEFAULT NULL COMMENT '规则名称、说明',
`sign_info_type` varchar(30) DEFAULT NULL COMMENT ' 积分类型名称',
`rule_key` varchar(20) DEFAULT NULL COMMENT '规则Key值(redis缓存或者mysql查询) ',
`rule_grade` int(10) DEFAULT NULL COMMENT '规则对应积分值',
`rule_type` enum('1','2','3') DEFAULT NULL COMMENT '规则类型 1 累加 2 翻倍 3 其他',
`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`del_flag` enum('0','1') DEFAULT '0' COMMENT '删除标志 0正常 1删除',
PRIMARY KEY (`sign_info_id`),
KEY `redis_key` (`rule_key`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='会员签到积分配置表';
积分签到表
CREATE TABLE `np_customer_sign_grade` (
`grade_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '签到id',
`customer_id` bigint(20) NOT NULL COMMENT '会员id',
`grade__flow_id` bigint(30) DEFAULT NULL COMMENT '积分流水号',
`grade_detail` varchar(75) DEFAULT NULL COMMENT '积分说明',
`grade_type` enum('0','1') NOT NULL COMMENT '积分类型 0获取积分 1消费积分',
`grade` int(20) NOT NULL COMMENT '积分',
`succ_record` int(2) DEFAULT NULL COMMENT '连续签到记录数',
`create_time` timestamp NOT NULL COMMENT '创建时间',
`create_date` varchar(50) NOT NULL COMMENT '创建日期',
`del_flag` enum('0','1') NOT NULL COMMENT '删除标志 0未删除 1已删除',
PRIMARY KEY (`grade_id`)
) ENGINE=InnoDB AUTO_INCREMENT=223 DEFAULT CHARSET=utf8 COMMENT='会员签到积分表';
为了避免页面刷新频繁查询数据库,所以我才用了将签到信息存储到Redis中的方式进行存储,这样每次刷新页面的时候,可以直接在Redis中查询数据,从而避免频繁查询数据库;
由于每次签到都需要先校验昨天是否有签到记录,然后之后就不再查询两天前的数据,所以这里为每一个签到数据设置了一个过期时间,避免签到无用的签到数据占用服务器内存空间,以提高Redis效率;redis设置的过期时间为2天;
在最初写代码的时候,我想的是将用户的签到信息用Hash结构存储到Redis中,因为Hash可以直接存储对象,但是在设置过期时间的时候遇到了坎,Redis不支持对Hash设置过期时间,网上查询了一下,网友有提到过给Hash顶级K设置过期时间,亲测后,发现数据并不会失效。所以后来将签到数据序列化后储存到Redis中;
签到实体类实现序列化Serializable接口;
(关于Hash顶级K,在操作Hash结构时,put是三个参数,H、HK、HV)
----- 代码实现部分(签到接口)
@Service
public class Test {
private static String ZERO = "0";
private static String SUCC = "200";
/*** Redis初始积分配置 如: 第一天签到奖励积分值为*/
private String STASIGNGRADEDISPOSE = "STASIGNGRADEDISPOSE";
/*** Redis累加积分配置 如: 第一天签到奖励2分,第二天签到在前一天基础上加2分或者倍数*/
private String ADDSIGNGRADEDISPOSE = "ADDSIGNGRADEDISPOSE";
/*** Redis单周最高奖励积分配置 如: 第一天连续签到到第七天,第七天奖励积分为:20*/
private String MAXSIGNGRADEDISPOSE = "MAXSIGNGRADEDISPOSE";
Logger LOGGER = LoggerFactory.getLogger(NpCustomerSignGradeService.class);
@Autowired
private NpCustomerSignGradeRepository signGradeRepository;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private NpCustomerSignInfoRepository signInfoRepository;
/*** @author: JiaYao* @demand: 用户签到接口* @parameters:* @creationDate: 2018/8/16 0017 13:32*/
public Response sign(Long customerId) {
Response response = new Response();
Date date = new Date();
// 获取今天的日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String dateString = sdf.format(date);
LOGGER.info("-----今天是:" + dateString + "日-----");
// 获取昨天的日期 Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, -1);
Date date1 = calendar.getTime();
String yesterday = sdf.format(date1);
// 获取今天的签到信息 NpCustomerSignGrade todaySing = (NpCustomerSignGrade) redisTemplate.opsForValue().get(customerId + dateString);
// 获取昨天的签到信息 NpCustomerSignGrade yesterdaySing = (NpCustomerSignGrade) redisTemplate.opsForValue().get(customerId + yesterday);
// 第一次签到签到规则 NpCustomerSignInfo sta = (NpCustomerSignInfo) redisTemplate.opsForValue().get(STASIGNGRADEDISPOSE);
if (sta == null) {
sta = signInfoRepository.findGradeByRuleKey(STASIGNGRADEDISPOSE);
redisTemplate.opsForValue().set(STASIGNGRADEDISPOSE, sta);
}
// 获取续签规则 NpCustomerSignInfo add = (NpCustomerSignInfo) redisTemplate.opsForValue().get(ADDSIGNGRADEDISPOSE);
// 获取续签规则 if (add == null) {
add = signInfoRepository.findGradeByRuleKey(ADDSIGNGRADEDISPOSE);
redisTemplate.opsForValue().set(ADDSIGNGRADEDISPOSE, add);
}
// 获取满签规则 NpCustomerSignInfo max = (NpCustomerSignInfo) redisTemplate.opsForValue().get(MAXSIGNGRADEDISPOSE);
if (max == null) {
max = signInfoRepository.findGradeByRuleKey(MAXSIGNGRADEDISPOSE);
redisTemplate.opsForValue().set(MAXSIGNGRADEDISPOSE, max);
}
NpCustomerSignGrade customerSignGrade = new NpCustomerSignGrade();
int grade ;
// 当今天还没有签到 if (todaySing == null) {
LOGGER.info("今天还没有签到过,可以进行签到操作~--" + customerId);
if (yesterdaySing == null) {
LOGGER.info("昨天还没有签到,今天是第一天签到哦~--" + customerId);
grade = sta.getRuleGrade();
customerSignGrade.setGradeDetail(sta.getSignInfoType());
customerSignGrade.setCreateDate(dateString);
customerSignGrade.setCreateTime(date);
customerSignGrade.setCustomerId(customerId);
customerSignGrade.setDelFlag(ZERO);
customerSignGrade.setGrade(grade);
customerSignGrade.setGradeFlowId(Long.parseLong(genOrderCode()));
customerSignGrade.setGradeType(ZERO);
customerSignGrade.setSuccRecord(1);
signGradeRepository.save(customerSignGrade);
LOGGER.info("今天是用户" + customerId + "第1天签到,获得积分" + grade + "分~");
/*** 将签到信息以Hash形式存储到Redis中,并设定过期时间为2天*/
redisTemplate.opsForValue().set(customerId + dateString, customerSignGrade, 2, TimeUnit.DAYS);
response.setCode(SUCC);
response.setFlag(true);
response.setMessage(grade + "");
response.setStandby(grade + add.getRuleGrade() + "");
return response;
} else {
LOGGER.info("昨天有签到记录~--" + customerId);
if (yesterdaySing.getSuccRecord() < 6) {
grade = yesterdaySing.getGrade();
// 获取昨天签到获取的积分数 customerSignGrade.setGradeDetail(add.getSignInfoType());
customerSignGrade.setCreateDate(dateString);
customerSignGrade.setCreateTime(date);
customerSignGrade.setCustomerId(customerId);
customerSignGrade.setDelFlag(ZERO);
if ("1".equals(add.getRuleType())) {
// 累加规则 grade = grade + add.getRuleGrade();
}
if ("2".equals(add.getRuleType())) {
// 倍增规则 grade = grade * (add.getRuleGrade());
}
customerSignGrade.setGrade(grade);
customerSignGrade.setGradeFlowId(Long.parseLong(genOrderCode()));
customerSignGrade.setGradeType(ZERO);
customerSignGrade.setSuccRecord(yesterdaySing.getSuccRecord() + 1);
signGradeRepository.save(customerSignGrade);
LOGGER.info("今天是用户" + customerId + "持续第" + (yesterdaySing.getSuccRecord() + 1) + "天签到,获得积分" + grade + "分~");
redisTemplate.opsForValue().set(customerId + dateString, customerSignGrade, 2, TimeUnit.DAYS);
response.setCode(SUCC);
response.setFlag(true);
response.setMessage(grade + "");
if (yesterdaySing.getSuccRecord() == 5) {
response.setStandby(max.getRuleGrade() + "");
} else {
response.setStandby(grade + add.getRuleGrade() + "");
}
return response;
} else if (yesterdaySing.getSuccRecord() == 6) {
// 本周满签 customerSignGrade.setGradeDetail(max.getSignInfoType());
customerSignGrade.setCreateDate(dateString);
customerSignGrade.setCreateTime(date);
customerSignGrade.setCustomerId(customerId);
customerSignGrade.setDelFlag(ZERO);
grade = max.getRuleGrade();
customerSignGrade.setGrade(grade);
customerSignGrade.setGradeFlowId(Long.parseLong(genOrderCode()));
customerSignGrade.setGradeType(ZERO);
customerSignGrade.setSuccRecord(yesterdaySing.getSuccRecord() + 1);
signGradeRepository.save(customerSignGrade);
LOGGER.info("今天是用户" + customerId + "持续第" + (yesterdaySing.getSuccRecord() + 1) + "天签到,获得积分" + grade + "分~");
redisTemplate.opsForValue().set(customerId + dateString, customerSignGrade, 2, TimeUnit.DAYS);
response.setCode(SUCC);
response.setFlag(true);
response.setMessage(grade + "");
return response;
} else if (yesterdaySing.getSuccRecord() == 7) {
// 满签一周,续第二周第一签 grade = sta.getRuleGrade();
customerSignGrade.setGradeDetail(sta.getSignInfoType());
customerSignGrade.setCreateDate(dateString);
customerSignGrade.setCreateTime(date);
customerSignGrade.setCustomerId(customerId);
customerSignGrade.setDelFlag(ZERO);
customerSignGrade.setGrade(grade);
customerSignGrade.setGradeFlowId(Long.parseLong(genOrderCode()));
customerSignGrade.setGradeType(ZERO);
customerSignGrade.setSuccRecord(1);
signGradeRepository.save(customerSignGrade);
LOGGER.info("今天是用户" + customerId + "第1天签到,获得积分" + grade + "分~");
redisTemplate.opsForValue().set(customerId + dateString, customerSignGrade, 2, TimeUnit.DAYS);
response.setCode(SUCC);
response.setFlag(true);
response.setMessage(grade + "");
response.setStandby(grade + add.getRuleGrade() + "");
return response;
}
}
}
response.setCode(SUCC);
response.setFlag(false);
response.setMessage("今天已经签到过了哦~");
return response;
}
---- 查询用户总积分数
/**
* @author: JiaYao
* @demand: 查询用户总积分数
* @parameters:
* @creationDate: 2018/8/16 16:23
*/
public WelfareResponse findCustomerSignGrade(Long customerId) {
WelfareResponse response = new WelfareResponse();
Long signGrade = signGradeRepository.findCustomerSignGrade(customerId);
response.setCode(SUCC);
response.setFlag(true);
response.setMessage(signGrade == null ? "0" : signGrade + "");
LOGGER.info("用户" + customerId + "目前累计积分数为:" + (signGrade == null ? "0" : signGrade + ""));
return response;
}
--- 查询今天是否已经签到
/**
* @author: JiaYao
* @demand: 查询用户今天是否已经签到
* @parameters:
* @creationDate: 2018/8/16 16:18
*/
public Response isSign(Long customerId) {
Response response = new Response();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String dateString = sdf.format(new Date());
// 先从redis中获取当天用户有签到记录没
NpCustomerSignGrade todaySing = (NpCustomerSignGrade) redisTemplate.opsForValue().get(customerId + dateString);
if (todaySing == null) {
// 没有签到
response.setFlag(false);
response.setMessage("今天还没有签到哦~");
LOGGER.info("用户" + customerId + "今天还没有签到了~");
} else {
// 已经签到
response.setFlag(true);
response.setMessage("今天已经签到过了哦~");
// 将成功签到次数进行返回
response.setStandby(todaySing.getSuccRecord() + "");
LOGGER.info("用户" + customerId + "今天已经签到过了~");
}
response.setCode(SUCC);
return response;
}签到效果图
积分签到mysql_简易积分签到功能java代码实现实现Redis缓存数据相关推荐
- Java代码实现清除Redis缓存
private static Jedis jedis = null;public static void del(String key){try {jedis = RedisPool.getRedis ...
- java调色板代码_简易网页调色板功能调用代码_html
简易网页调色板功能调用代码 colorSelect('色值输入框ID','显示色值的容器ID',event) 调用起来很简单,任何物品onClick就可以. 以下是html网页特效代码,点击运行按钮可 ...
- java用redis缓存的步骤_详解在Java程序中运用Redis缓存对象的方法|chu
这段时间一直有人问如何在Redis中缓存Java中的List 集合数据,其实很简单,常用的方式有两种: 1. 利用序列化,把对象序列化成二进制格式,Redis 提供了 相关API方法存储二进制,取数据 ...
- java redis 缓存_如何在 Java 中实现一个 redis 缓存服务
缓存服务的意义 为什么要使用缓存?说到底是为了提高系统的运行速度.将用户频繁访问的内容存放在离用户最近,访问速度最快的地方,提高用户的响应速度.一个 web 应用的简单结构如下图. web 应用典型架 ...
- 使用Java读取 “Python写入redis” 的数据踩坑记录
https://my.oschina.net/u/2338224/blog/3061507 使用Java读取 "Python写入redis" 的数据踩坑记录 https://seg ...
- Java项目使用Redis缓存数据
Java项目使用Redis缓存数据 一.Redis的下载安装 1.下载gcc编译器 yum install gcc-c++ 安装完成后检查是否安装成功,查看版本 gcc --version 2.使用w ...
- 基于redis购物车java代码_基于redis实现购物车基本功能
1.准备工作: 数据库表设计 (yj_product_specification:商品规格表,用户表,商品表等 {没有规格表,只有规格值表,}), 测试工具:POSTMAN redis客户端: ...
- java代码简单操作Redis数据Jedis jar
java操作Redis数据API->Jedis Jedis引入 作为java码农,如何在代码中操作Redis呢? Jedis的介绍 Redis不仅可以使用命令来操作,现在基本上主流的语言都有AP ...
- 【修真院JAVA小课堂】redis缓存集群简单介绍
大家好,我是IT修真院郑州分院第11期的JAVA学员,一枚正直纯洁善良的java程序员. 今天给大家分享一下,redis缓存集群简单介绍. 1.背景介绍 redis是一个key-value存储系统.和 ...
最新文章
- VMware上实现LVS负载均衡(NAT)
- 关于Less的学习笔记
- 利用Java反射机制和poi插件操作excel
- php图文消息带代码详细注释,微信发送图文消息代码整理
- poj 2696 A Mysterious Function
- SQLServer常见的数学函数梳理
- Java用sqlit拆分小数_如何将SQLite列中的分隔值拆分为多列
- python模块导入_Python模块及其导入
- Android线程,线程池使用及原理博文参考
- CentOS系统性能工具 sar 示例!
- 最近新明白的SQL小知识
- Android SDK 更新时修改hosts文件仍然无法更新,可试试这个方法……
- 一个校园网络的规划与设计
- 关于java就业的简历模板,工作一年java简历模板
- 2008年十大最值得关注创业公司
- 高端游戏计算机配置单,高端稳定有保障 6000元i7-7700配GTX1060游戏配置推荐
- Ubuntu20.04 磁盘空间扩展教程
- 在计算机领域做研究的一些想法
- Word制作表格常用操作
- php redis 操作
热门文章
- 51单片机蜂鸣器的使用
- 南潮科技:还原工业级智能网关的开发过程
- 15位明星身家熊市缩水3亿 小巨人姚明市值缩水4500万 - 延展阅读-新华网
- 云知梦Web前端开发完整版
- kdb内核调试 - 3
- 计算机网络教程第五版|微课版 - 第七章 网络安全 - 重要概念【补充】
- patchwall 与鸿蒙对比,官方解读小米电视PatchWall智能电视系统设计的那些事儿
- 中国联通5G终端白皮书——第三阶段
- 北京 少儿编程 java_Greenfoot【java学习】-创建新世界
- npm install安装失败 error D:\xxx\xxx\node_modules\node-sass: Command failed. Exit code: 1