-------需求说明

---- 需求分析

积分签到处于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缓存数据相关推荐

  1. Java代码实现清除Redis缓存

    private static Jedis jedis = null;public static void del(String key){try {jedis = RedisPool.getRedis ...

  2. java调色板代码_简易网页调色板功能调用代码_html

    简易网页调色板功能调用代码 colorSelect('色值输入框ID','显示色值的容器ID',event) 调用起来很简单,任何物品onClick就可以. 以下是html网页特效代码,点击运行按钮可 ...

  3. java用redis缓存的步骤_详解在Java程序中运用Redis缓存对象的方法|chu

    这段时间一直有人问如何在Redis中缓存Java中的List 集合数据,其实很简单,常用的方式有两种: 1. 利用序列化,把对象序列化成二进制格式,Redis 提供了 相关API方法存储二进制,取数据 ...

  4. java redis 缓存_如何在 Java 中实现一个 redis 缓存服务

    缓存服务的意义 为什么要使用缓存?说到底是为了提高系统的运行速度.将用户频繁访问的内容存放在离用户最近,访问速度最快的地方,提高用户的响应速度.一个 web 应用的简单结构如下图. web 应用典型架 ...

  5. 使用Java读取 “Python写入redis” 的数据踩坑记录

    https://my.oschina.net/u/2338224/blog/3061507 使用Java读取 "Python写入redis" 的数据踩坑记录 https://seg ...

  6. Java项目使用Redis缓存数据

    Java项目使用Redis缓存数据 一.Redis的下载安装 1.下载gcc编译器 yum install gcc-c++ 安装完成后检查是否安装成功,查看版本 gcc --version 2.使用w ...

  7. 基于redis购物车java代码_基于redis实现购物车基本功能

    1.准备工作: 数据库表设计 (yj_product_specification:商品规格表,用户表,商品表等     {没有规格表,只有规格值表,}), 测试工具:POSTMAN redis客户端: ...

  8. java代码简单操作Redis数据Jedis jar

    java操作Redis数据API->Jedis Jedis引入 作为java码农,如何在代码中操作Redis呢? Jedis的介绍 Redis不仅可以使用命令来操作,现在基本上主流的语言都有AP ...

  9. 【修真院JAVA小课堂】redis缓存集群简单介绍

    大家好,我是IT修真院郑州分院第11期的JAVA学员,一枚正直纯洁善良的java程序员. 今天给大家分享一下,redis缓存集群简单介绍. 1.背景介绍 redis是一个key-value存储系统.和 ...

最新文章

  1. VMware上实现LVS负载均衡(NAT)
  2. 关于Less的学习笔记
  3. 利用Java反射机制和poi插件操作excel
  4. php图文消息带代码详细注释,微信发送图文消息代码整理
  5. poj 2696 A Mysterious Function
  6. SQLServer常见的数学函数梳理
  7. Java用sqlit拆分小数_如何将SQLite列中的分隔值拆分为多列
  8. python模块导入_Python模块及其导入
  9. Android线程,线程池使用及原理博文参考
  10. CentOS系统性能工具 sar 示例!
  11. 最近新明白的SQL小知识
  12. Android SDK 更新时修改hosts文件仍然无法更新,可试试这个方法……
  13. 一个校园网络的规划与设计
  14. 关于java就业的简历模板,工作一年java简历模板
  15. 2008年十大最值得关注创业公司
  16. 高端游戏计算机配置单,高端稳定有保障 6000元i7-7700配GTX1060游戏配置推荐
  17. Ubuntu20.04 磁盘空间扩展教程
  18. 在计算机领域做研究的一些想法
  19. Word制作表格常用操作
  20. php redis 操作

热门文章

  1. 51单片机蜂鸣器的使用
  2. 南潮科技:还原工业级智能网关的开发过程
  3. 15位明星身家熊市缩水3亿 小巨人姚明市值缩水4500万 - 延展阅读-新华网
  4. 云知梦Web前端开发完整版
  5. kdb内核调试 - 3
  6. 计算机网络教程第五版|微课版 - 第七章 网络安全 - 重要概念【补充】
  7. patchwall 与鸿蒙对比,官方解读小米电视PatchWall智能电视系统设计的那些事儿
  8. 中国联通5G终端白皮书——第三阶段
  9. 北京 少儿编程 java_Greenfoot【java学习】-创建新世界
  10. npm install安装失败 error D:\xxx\xxx\node_modules\node-sass: Command failed. Exit code: 1