Redis实现基础随机抽奖及存储 【IDEA实现】【大作业】
Redis实现基础随机抽奖及存储
·
·题目内容:
请实现以下抽奖的需求:
- 有30个候选人进行抽奖
- 抽出一等奖1名,二等奖3名,三等奖5名
- 把得奖名单分别按一、二、三等奖存储起来
- 同一人只能获奖一次
- 控制台打印得奖名单
基本要求为:
- 利用Redis类型的特性,进行选型
- 代码排版良好,阅读性强
- 使用编程语言结合Redis实现
- 命令使用准确
- 得奖名单存储规范
·需求分析:
请实现以下抽奖的需求:
- 有30个候选人进行抽奖,同一人只能获奖一次,控制台打印得奖名单
分析: 使用redis中的set数据结构存储30名候选人,利用set集合存储的随机性,可利用set集合中的spop方法实现随机取出候选人且永不重复的功能——即随机抽奖。 - 抽出一等奖1名,二等奖3名,三等奖5名
分析: 利用if条件判断,规定一等奖抽出1名,二等奖抽出3名,三等奖抽出5名 - 把得奖名单分别按一、二、三等奖存储起来
分析: 使用redis中的hashmap数据结构,利用hashmap中的hset方法和hget方法可以实现存储与读取获奖者信息。同时hashmap的的hget方法只会获取值,不会因为取出而无法进行二次查询。
具体代码:
package com.company;
import redis.clients.jedis.*;
import java.util.ArrayList;
public class Main {
final static String host = new String("localhost");
final static int port = 6379;
final static String Lottery = "0233Redis:Sets:id:lottery";
final static String Winner = "0233Redis:HashMap:Winner:id";
final static String Winner_First = "0233Redis:HashMap:id01:01";
final static String Winner_Second = "0233Redis:HashMap:id02:02";
final static String Winner_Third = "0233Redis:HashMap:id03:03";
static Jedis jedis = new Jedis(host,port);
public static void main(String[] args) {
//CleanAll();
SetName(30);
GetName();
//ShowAll();
/*
Redis变量命名规范:
1) 第一段放置项目名或缩写 如 project
1) 第二段把表名转换为key前缀 如, user:
2) 第三段放置用于区分区key的字段,对应mysql中的主键的列名,如userid
3) 第四段放置主键值,如18,16
*/
}
//设定候选人
static void SetName(int x){
for(int i=1;i<=x;i++){
jedis.sadd(Lottery,"候选人"+Integer.toString(i));
}
System.out.println("候选人登记完毕!");
}
//抽奖过程
static void GetName(){
//temp_1:记录一二三等奖的中文形式
//temp_2:接收一个从set中取出的随机名字
//temp_4:记录获奖组的key值
//y:规定每一组获奖者的人数
System.out.println("所有参加抽奖的候选人"+jedis.smembers(Lottery));
String temp_1,temp_2,temp_4 = null;
int y;
//创建一个数组来存储每组获奖者
ArrayList arr = new ArrayList(5);
for(int j=1;j<=3;j++)
{
if(j==1){temp_1="一等奖";y=1;temp_4=Winner_First;}
else if(j==2){temp_1="二等奖";y=3;temp_4=Winner_Second;}
else {temp_1="三等奖";y=5;temp_4=Winner_Third;}
System.out.print(temp_1+"获得者是:");
for(int i=0;i<y;i++){
temp_2 = jedis.spop(Lottery);
if(temp_2==null) {
System.out.println(temp_1+"数据为空!");
return ;
}
arr.add(temp_2);
System.out.print(temp_2+" ");
}
//用hashmap存储每一组获奖者
jedis.hset(Winner,temp_4, String.valueOf(arr));
//每存储完一组获奖者,数组都需要清空,来记录下一组获奖者
arr.clear();
System.out.print("\n");
}
}
//清空所有数据结构,测试用
static void CleanAll(){
jedis.del(Lottery);
jedis.del(Winner);
System.out.println("清理完成");
}
//展示存储情况,测试用
static void ShowAll(){
//temp_3:表示从链表中接收的弹出的数据
//temp_5:接收一二三等奖链表的名称
String temp_3,temp_5;
for(int j=1;j<=3;j++)
{
if(j==1){
temp_5=Winner_First;
System.out.println("一等奖获取者是:");}
else if(j==2){
temp_5=Winner_Second;
System.out.println("二等奖获取者是:");}
else {
temp_5=Winner_Third;
System.out.println("三等奖获取者是:");}
System.out.println(jedis.hget(Winner,temp_5));
}
}
}
代码还不够美观,方法都是静态的,被老师批过,其他没啥问题
手动高亮:仅供参考学习,请勿照搬
欢迎讨论
更多推荐
已为社区贡献1条内容
所有评论(0)