基于Redis实现抽奖功能及问题小结

1、分析

  • 公司年底要做年会所有的员工都要参与抽奖的环节
  • 平台的产品要进行抽奖活动

这个时候我们可以利用redis中的set集合中的spop来实现。

特征:抽奖成功的人会自动从集合中删除,即获取到奖品的人不再继续参与抽奖。

spop命令:随机返回元素,元素从集合中删除该元素

2、初始化名单数据

package com.example.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;

/**
 * @Auther: 长颈鹿
 * @Date: 2021/08/21/14:09
 * @Description:
 */
@Service
@Slf4j
public class SpopRandomSetService {

    @Autowired
    private RedisTemplate redisTemplate;

    private static final String SPOP_USER_SETS = "pop:user:set";

    // 把所有员工全部添加到集合列表中
    @PostConstruct
    public void initData(){
        log.info("初始化奖品等级信息...");
        // 判断集合是否已经存在
        boolean flag = this.redisTemplate.hasKey(SPOP_USER_SETS);
        // 防止作弊
        if (!flag) {
            // 获取所有员工的信息
            List<Integer> initDataList = initDataList();
            // 把员工信息写入到redis中 sadd key data
            initDataList.forEach(data -> this.redisTemplate.opsForSet().add(SPOP_USER_SETS, data));
        }
    }

    // 模拟100用户抽奖
    private List<Integer> initDataList() {
        // todo : 从数据库里面来,把公司里面所有的员工从数据表中全部查询出来
        List<Integer> listData = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            listData.add(i + 1);
        }
        return listData;
    }

}

3、具体抽奖方法

// 随机抽取用户
    public int start(){
        return (int)redisTemplate.opsForSet().pop(SPOP_USER_SETS);
    }

4、抽奖接口测试

package com.example.controller;

import com.example.service.SpopRandomSetService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Auther: 长颈鹿
 * @Date: 2021/08/21/14:13
 * @Description: 抽奖接口测试
 */
@RestController
public class SpopRandomSetController {

    @Autowired
    private SpopRandomSetService spopRandomSetService;

    @PostMapping("/sPop/random/user")
    public int start() {
        return spopRandomSetService.start();
    }

}

5、小结

# 查询集合成员
smembers pop:user:Set
# 查询集合的长度变化
scard pop:user:Set

spop:随机从集合取出一个元素返回,并且从集合中删除该元素。

到此这篇关于基于Redis实现抽奖功能的文章就介绍到这了,更多相关Redis实现抽奖内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

    业务需求是用户每天只能签到一次,而且签到后用户增加积分,所以把用户每次签到时放到redis 缓存里面,然后每天凌晨时再清除缓存,大概简单思想是这样的 直接看代码吧如下 @Transactional @Override public void signIn(Integer memberId) throws BizException { if(memberId==null){ throw new BizException(ErrorCode.BIZ_EXCEPTION.getErrcode(), "

  • Redis实战之商城购物车功能的实现代码

    目标 利用Redis实现商城购物车功能. 功能 根据用户编号查询购物车列表,且各个商品需要跟在对应的店铺下:统计购物车中的商品总数:新增或删减购物车商品:增加或减少购物车中的商品数量. 分析 Hash数据类型:值为多组映射,相当于JAVA中的Map.适合存储对象数据类型.因为用户ID作为唯一的身份标识,所以可以把模块名称+用户ID作为Redis的键:商品ID作为商品的唯一标识,可以把店铺编号+商品ID作为Hash元素的键,商品数量为元素的值. 代码实现 控制层 package com.shopp

  • 使用redis的increment()方法实现计数器功能案例

    一直知道redis可以用来实现计数器功能,但是之前没有实际使用过,昨天碰到一个需求:用户扫码当天达到20次即提示:当日扫码次数达到上限! 当时就想到使用redis的递增方法increment()来实现计数器功能,一定要注意redisTemplate和stringRedisTemplate的使用 首先设置key: 该key我使用了用户id和当天日期作为key的一部分,date:xxxx-xx-xx格式,这样一来该用户在第二天扫码的时候又是一个新key,因为日期不同了 设置key的过期时间: 实现计

  • 多个SpringBoot项目采用redis实现Session共享功能

    有时我们可能有多个不同的Web应用,可以相互调用,这时如果每个应用都有自己的session,那用户跳转到另一个应用时就又需要登陆一次,这样会带来很不好的体验,因此我们需要在不同的应用中共享session.这里,我们采用redis来实现. 前置说明 由于只用到redis和springboot的整合,所以只能实现一个URL下的不同端口的应用之间的session共享,如果连应用名称都完全不同的两个应用要实现session共享,在这个基础上还需要使用到Nginx,这种方式我暂时还没有试过.(Spring

  • 使用Redis实现微信步数排行榜功能

    1. 前言 之前写过一篇博客,讲解的是Redis的5种数据结构及其常用命令,当时有读者评论,说希望了解下这5种数据结构各自的使用场景,不过一直也没来得及写. 碰巧,在3月份找工作面试时,有个面试官先问了我Redis有哪几种数据结构,在我讲完后,面试官又问了我以下问题: 如何用Redis实现微信步数排行榜? 相信很多小伙伴都知道,可以使用Redis的有序集合ZSET来实现,本篇博客就基于此面试题,来讲解下ZSET的使用场景,以及微信步数排行榜的大致实现思路. 2. ZSET的使用场景 ZSET的经

  • Java使用Redis实现秒杀功能

    秒杀功能 秒杀场景现在已经非常常见了,各种电商平台都有秒杀的产品,接下来我们模拟一个秒杀的项目,最终能够确保高并发下的线程安全.界面比较简单,但是功能基本实现. 界面 点击"秒杀点我"按钮后台就会输出秒杀结果. 第一版 使用Redis缓存数据库,使用一个key-value存储秒杀商品数量,使用set集合存储秒杀成功的用户.我们以商品0101为示例,设置商品的初始数量为200件.不考虑并发问题,实现功能. html.jsp.servlet文件不重要省略. package com.redi

  • 基于Redis实现抽奖功能及问题小结

    1.分析 公司年底要做年会所有的员工都要参与抽奖的环节 平台的产品要进行抽奖活动 这个时候我们可以利用redis中的set集合中的spop来实现. 特征:抽奖成功的人会自动从集合中删除,即获取到奖品的人不再继续参与抽奖. spop命令:随机返回元素,元素从集合中删除该元素 2.初始化名单数据 package com.example.service; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory

  • 利用Redis实现点赞功能的示例代码

    目录 MySQL 和 Redis优缺点 1.Redis 缓存设计及实现 部分代码如下 Redis 存储结构如图 2.数据库设计 3.开启定时任务持久化存储到数据库 部分代码如下 提到点赞,大家一想到的是不是就是朋友圈的点赞呀?其实点赞对我们来说并不陌生,我们经常会在手机软件或者网页中看到它,今天就让我们来了解一下它的实现吧.我们常见的设计思路大概分为两种:一种自然是用 MySQL 等数据库直接落地存储, 另外一种就是将点赞的数据保存到 Redis 等缓存里,在一定时间后刷回 MySQL 等数据库

  • 基于Redis实现延时队列的优化方案小结

    目录 一.延时队列的应用 二.延时队列的实现 三.总结 一.延时队列的应用 近期在开发部门的新项目,其中有个关键功能就是智能推送,即根据用户行为在特定的时间点向用户推送相应的提醒消息,比如以下业务场景: 在用户点击充值项后,半小时内未充值,向用户推送充值未完成提醒. 在用户最近一次阅读行为2小时后,向用户推送继续阅读提醒. 在用户新注册或退出应用N分钟后,向用户推送合适的推荐消息. … 上述场景的共同特征就是在某事件触发后延迟一定时间后再执行特定任务,若事件触发时间点可知,则上述逻辑也可等价于在

  • 基于VUE实现的九宫格抽奖功能

    先给大家展示下效果图: HTML代码: <template> <div class="luckDraw"> <title-bar :title="title"></title-bar> <div class="container"> <div class="turntable-wrapper"> <div class="luck-wrapp

  • 基于Redis位图实现用户签到功能

    场景需求 适用场景如签到送积分.签到领取奖励等,大致需求如下: 签到1天送1积分,连续签到2天送2积分,3天送3积分,3天以上均送3积分等. 如果连续签到中断,则重置计数,每月初重置计数. 当月签到满3天领取奖励1,满5天领取奖励2,满7天领取奖励3--等等. 显示用户某个月的签到次数和首次签到时间. 在日历控件上展示用户每月签到情况,可以切换年月显示--等等. 设计思路 对于用户签到数据,如果每条数据都用K/V的方式存储,当用户量大的时候内存开销是非常大的.而位图(BitMap)是由一组bit

  • 基于Python实现评论区抽奖功能详解

    目录 1. 分析评论接口 2. 获取评论数据 3. 筛选评论用户 4. 抽取幸运观众 5. 完整源码 5.1 字符串截取的方式 5.2 正则匹配方式 5.3 执行结果 1. 分析评论接口 首先,我们需要找到评论数据的「接口」,也就是网站获取评论数据的请求. 打开一个需要抽奖的文章,进入「开发者模式」(按F12 或 右键检查),选中 Network 选项,同时「刷新」文章页面,使其重新发送请求,在右侧工具栏中观察页面发送的请求,逐个分析请求,根据响应内容判断出获取评论的请求 在 Headers 栏

  • 基于JS+Canvas的lucky-canvas 抽奖功能

    目录 ucky-canvas 介绍 lucky-canvas 功能特点 自由配置 多端适配 响应式 代码块展示 效果图展示 代码如下 抽奖一 抽奖二 抽奖三 ucky-canvas 介绍 一个基于 Js + Canvas 的[大转盘 & 九宫格 & 老虎机]抽奖, 致力于为 web 前端提供一个功能强大且专业可靠的组件, 只需要通过简单配置即可实现自由化定制, 帮助你快速的完成产品需求. lucky-canvas 功能特点 自由配置 奖品 / 文字 / 图片 / 颜色 / 按钮均可自由配置

  • 基于redis实现世界杯排行榜功能项目实战

    题外话: 小编先给大家推荐一个不错的微信公众号: 感兴趣的朋友可以关注小编的微信公众号[码农那点事儿],更多网页制作特效源码及学习干货哦!!! 需求 前段时间,做了一个世界杯竞猜积分排行榜.对世界杯64场球赛胜负平进行猜测,猜对+1分,错误+0分,一人一场只能猜一次. 1.展示前一百名列表. 2.展示个人排名(如:张三,您当前的排名106579). 分析 一开始打算直接使用mysql数据库来做,遇到一个问题,每个人的分数都会变化,如何能够获取到个人的排名呢?数据库可以通过分数进行row_num排

  • 基于Redis无序集合如何实现禁止多端登录功能

    前言 一个集合类型可以存储最多2^32 -1 个字符串 集合类型在redis内部使用值为空的散列表(hash table)实现,所以集合中的加入或删除元素等时间复杂度为O(1). 集合具有元素唯一性. 本文主要给大家介绍了基于Redis无序集合实现禁止多端登录的相关内容,下面话不多说了,来一起看看详细的介绍吧 应用背景 多个应用端假设名称叫做A和B,禁止用户从A B同时登录,A登录踢B,B登录踢A 实现思路 设置两个无序集合a_set, b_set a b 登录的时候执行 $redis->sAd

  • 基于Redis的List实现特价商品列表功能

    目录 1.场景分析 2.分析 3 .具体实现 3.1 ProductListService类 3.2 商品的数据接口的定义和展示及分页 3.3 定时任务 4.解决商品列表存在的缓存击穿问题 4.1 如何引起的缓存击穿的情况 4.2 解决方案 1.场景分析 淘宝京东的特价商品列表, 商品特点: 商品有限,并发量非常的大. 考虑分页 传统解决方案:数据库db, 但是在如此大的并发量的情况下,不可取. 一般会采用redis来处理.这些特价商品的数据不多,而且redis的list本身也支持分页.是天然处

随机推荐