java redis 实现简单的用户签到功能

业务需求是用户每天只能签到一次,而且签到后用户增加积分,所以把用户每次签到时放到redis 缓存里面,然后每天凌晨时再清除缓存,大概简单思想是这样的

直接看代码吧如下

@Transactional
 @Override
 public void signIn(Integer memberId) throws BizException {
  if(memberId==null){
   throw new BizException(ErrorCode.BIZ_EXCEPTION.getErrcode(), "签到用户id 不能为null");
  }
  String day = DateFormatUtils.format(new Date(), "yyyyMMdd");
  String key = "signin:"+day;
  Boolean sismember = redisClient.sismember(key, memberId.toString());
  if(sismember){
   throw new BizException(ErrorCode.BIZ_EXCEPTION.getErrcode(), "今天已经签到了");
  }else{
   redisClient.sadd(key, memberId.toString());
   redisClient.expire(key, getRefreshTime());
   addPointsRecord(memberId,IntegralType.SIGN_IN);//给用户增加积分
  }

 }

获取离凌晨 还有多久

/**
  * 获取当前时间离明天凌晨还有多少小时
  * @return
  */
 public static int getRefreshTime(){
  Calendar calendar = Calendar.getInstance();
  int now = (int) (calendar.getTimeInMillis()/1000);
  calendar.add(Calendar.DATE, 1);
  calendar.set(Calendar.SECOND, 0);
  calendar.set(Calendar.MINUTE, 0);
  calendar.set(Calendar.HOUR_OF_DAY , 0);
  return (int) (calendar.getTimeInMillis()/1000-now);
 }

Controller

/**
  * 签到
  * @return
  */
 @WeiXinLogin
 @RequestMapping("/signIn")
 public ResponseModel signIn(){
  try {
   Integer memberId = RequestContext.getContext().getUser().getMemberId();
   memberApi.signIn(memberId);
   return new ResponseModel();
  } catch (BizException e) {
   LOGGER.error("signIn error");
   return new ResponseModel(e.getErrcode(), e.getErrm(), null);
  }
 }

以上就是java redis 实现简单的用户签到功能的详细内容,更多关于Java 实现用户签到功能的资料请关注我们其它相关文章!

(0)

相关推荐

  • java.net.SocketException: Connection reset 解决方法

    自从SEOTcs系统11月份24日更新了一下SEO得分算法以来,一直困扰我的一个问题出现了,java的数据job任务,在执行过程中会经常报以下的错误: "2011-12-03 18:00:32 DefaultHttpClient [INFO] I/O exception (java.net.SocketException) caught when processing request: Connection reset by peer: socket write error2011-12-03

  • Java中多线程与并发_volatile关键字的深入理解

    一.volatile关键字 volatile是JVM提供的一种轻量级的同步机制,特性: 1.保证内存可见性 2.不保证原子性 3.防止指令重排序 二.JMM(Java Memory Model) Java内存模型中规定了所有的变量都存储在主内存中(如虚拟机物理内存中的一部分),每条线程还有自己的工作内存(如CPU中的高速缓存),线程的工作内存中保存了该线程使用到的变量到主内存的副本拷贝,线程对变量的所有操作(读取.赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量.不同线程之间无法直接访

  • JAVA Iterator 转成 List 的操作

    List转到Iterator容易,JDK本身就支持,反过来的实现方式如下: 1.使用Apache Common Collections 2.自己实现的方法转换 3.Guaa实现转换 方式1: #Apache Commons Collections: import org.apache.commons.collections.IteratorUtils; Iterator<Element> myIterator = //some iterator List<Element> myLi

  • Java实现Redis的集合(set)命令操作

    配置文件请看上篇Java实现redis https://www.jb51.net/article/190922.htm 下面测试redis的集合set的类型,注释里面的代码是linux中redis命令 package com.huadian.set; import com.huadian.redisUntil.JedisPoolUntil; import org.junit.Before; import org.junit.Test; import redis.clients.jedis.Jed

  • java操作Redis缓存设置过期时间的方法

    关于Redis的概念和应用本文就不再详解了,说一下怎么在java应用中设置过期时间. 在应用中我们会需要使用redis设置过期时间,比如单点登录中我们需要随机生成一个token作为key,将用户的信息转为json串作为value保存在redis中,通常做法是: //生成token String token = UUID.randomUUID().toString(); //把用户信息写入redis jedisClient.set(REDIS_USER_SESSION_KEY + ":"

  • JAVA8 十大新特性详解

    "Java is still not dead-and people are starting to figure that out." 本教程将用带注释的简单代码来描述新特性,你将看不到大片吓人的文字. 一.接口的默认方法 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: 复制代码 代码如下: interface Formula {    double calculate(int a); default do

  • Java 内存溢出的原因和解决方法

    你是否遇到过Java应用程序卡顿或突然崩溃的情况?您可能遇到过Java内存泄漏.在本文中,我们将深入研究Java内存泄漏的确切原因,并推荐一些最好的工具来防止内存泄漏发生. 什么是JAVA内存泄漏? 简单地说,Java内存泄漏是指对象不再被应用程序使用,而是在工作内存中处于活动状态. 在Java和大多数其他编程语言中,垃圾收集器的任务是删除不再被应用程序引用的对象.如果不选中,这些对象将继续消耗系统内存,并最终导致崩溃.有时java内存泄漏崩溃不会输出错误,但通常错误会以java.lang.Ou

  • JAVA Web.xml加载顺序过程详解

    web.xml加载过程(步骤): 1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param> 2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文. 3.容器将<context-param></context-param>转化为键值对,

  • java实现app签到功能

    本文实例为大家分享了java实现app签到功能的具体代码,供大家参考,具体内容如下 1.首先设计二张表,第一张表sign_calc记录用户连续签到次数,字段id,user_id,continue_days,第二张表sign_detail签到详情表id,user_id,sign_date. 2.app端用户点击签到接口controller如下: /*** * app签到接口 * @author xuhaibo * @param accid * @return */ @ResponseBody @R

  • javascript:;与javascript:void(0)使用介绍

    最近看了好几个关于<a>标签和javascript:void(0)的帖子,谨记于此,以资查阅. 注:以下代码未经全面测试,但每一种方法可能会出现的情况都基本做了说明. 在做页面时,如果想做一个链接点击后不做任何事情,或者响应点击而完成其他事情,可以设置其属性 href = "#",但是,这样会有一个问题,就是当页面有滚动条时,点击后会返回到页面顶端,用户体验不好. 目前有如下几种解决办法: 1)点击链接后不做任何事情 <a href="javascript:

随机推荐