Java签到活动设计完整版

本文详细介绍了如何设计和实现一个基于Java的签到功能,利用Redis的Bitmaps进行签到状态管理,并讨论了在实际运营中遇到的问题及解决方案。签到功能包括判断用户是否已签到、计算连续签到天数以及积分策略。当连续签到中断时,通过设置签到记录的有效期来解决查询异常问题。
摘要由CSDN通过智能技术生成

     我们在很多app中会看到签到这个功能。但是这个功能是怎么做的呢?我们接下来就说下。

网上说的比较多的是:java签到功能_使用RedisTemplate操作bitmap完成每日签到_weixin_39765695的博客-CSDN博客

但是很不全面。接下来我们就说下。可实战使用。

技术选型

     mysql  把签到记录存储到数据库中。好处:开发简单。坏处:当数据量大时,存储到mysql就不合适了。

     redis 将签到信息存储的redis中。(我们以此为标准)

实现

引入相应的jar包。我们在springBoot中开发。

    <!-- redis依赖commons-pool 这个依赖一定要添加 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
        <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

Redis的配置类


/**
  * Redis配置类
 */
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
@EnableCaching
public class RedisInitializer extends CachingConfigurerSupport {

	@Autowired
    LettuceConnectionFactory redisConnectionFactory;

	@Bean
	public RedisTemplate<Object, Object> redisTemplate() {
		RedisTemplate<Object, Object> template = new RedisTemplate<>();
		// key的序列化采用StringRedisSerializer
		template.setKeySerializer(new StringRedisSerializer());
		template.setHashKeySerializer(new StringRedisSerializer());

		// value值的序列化采用GenericJackson2JsonRedisSerializer
		template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
		template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
		// 开启事务特性
		//template.setEnableTransactionSupport(true);
		template.setConnectionFactory(redisConnectionFactory);

		return template;
	}

}

RedisUtil 这个是Redis的工具类

/**
 * Redis工具类
 *
 */
@Component
@DependsOn({"redisInitializer"})
public class RedisUtil {

    private static Logger log = LoggerFactory.getLogger(RedisUtil.class);

    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;

  /**
     * 签到
     *
     * @param key
     * @param offset
     * @return
     */
    public boolean setBit(String key, int offset) {
        return redisTemplate.opsForValue().setBit(key, offset, true);
    }


    /**
     * 查询是否签单
     *
     * @param key
     * @param offset
     * @return
     */
    public boolean getBit(String key, int offset) {
        return redisTemplate.opsForValue().getBit(key, offset);
    }


    /**
     * 签到次数
     *
     * @param cacheKey
     * @return
     */
    public long getSignCount(String cacheKey) {
        Long bitCount = (Long) redisTemplate.execute((RedisCallback) cbk -> cbk.bitCount(cacheKey.getBytes()));
        return bitCount;
    }

    /**
     * 获取连续签到次数
     *
     * @param cacheKey
     * @param count
     * @return
     */
    public long getContinuousSignCount(String cacheKey, int count) {
        long signCount = 0;
        List<Long> list = redisTemplate.opsForValue().bitField(cacheKey, BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType
                .unsigned(count)).valueAt(1));
        if (list != null && list.size() > 0) {
            long valueDec = list.get(0) != null ? list.get(0) : 0;
            //            System.out.println("valueDec..." + valueDec);
            for (int i = 0; i < count; i++) {
                if (valueDec >> 1 << 1 == valueDec) {
                    if (i > 1) {
                        break;
                    }
                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值