各种抽奖活动来一遍系列 (一)

本贴最后更新于 2064 天前,其中的信息可能已经时移世异

项目介绍

在日常生活中,各种抽奖活动都是很常见的,比如年会抽奖,刮刮乐,体育彩票,双色球,支付宝,微信中的抢红包, 微博抢红包,支付宝集福卡等,这些都大大丰富了我们的生活,当然,我基本上是没搞到什么奖,年会抽奖也把我漏了。。。,下面我就讲带大家来揭秘一下各种抽奖活动的实现, 代码将以 golang 实现

抽奖系统的业务介绍

  1. 抽奖活动的业务需求,既复杂又多变
  2. 奖品类型和改路设置
  3. 如何公平抽奖,安全发奖

抽奖系统的技术挑战

  1. 网络并发编程,数据读写的并发安全性问题
  2. 高效的抽奖和发奖, 提高并发性能
  3. 系统优化, 这么把 redis 更好的利用起来

抽奖活动之企业抽奖

package main import ( "fmt" "math/rand" "net/http" "strings" "sync" "time" ) // 全局变量,存储用户列表 var userList []string // 锁 var mu sync.Mutex // 当前系统当前抽奖人数 func count(w http.ResponseWriter, r *http.Request) { count := len(userList) countStr := fmt.Sprintf("当前总共参与人数: %d\n", count) w.Write([]byte(countStr)) } // 导入用户名单 func importUser(w http.ResponseWriter, r *http.Request) { strUsers := "小明,张三,李四,王五,周六,周日,卷福,斯瓦辛格,李小龙" users := strings.Split(strUsers, ",") count1 := len(userList) for _, u := range users { u = strings.TrimSpace(u) if len(u) > 0 { mu.Lock() userList = append(userList, u) mu.Unlock() } } //用户数量 count2 := len(userList) str := fmt.Sprintf("当前总共参与人数: %d, 成功导入用户数:%d\n", count1, count2) w.Write([]byte(str)) } // 抽奖 func lucky(w http.ResponseWriter, r *http.Request) { count := len(userList) if count > 1 { //生成随机数 seed := time.Now().UnixNano() index := rand.New(rand.NewSource(seed)).Int31n(int32(count)) user := userList[index] //重新组织 userList 删除取出的那个 mu.Lock() userList = append(userList[0:index], userList[index+1:]...) mu.Unlock() w.Write([]byte("当前中奖用户:" + user)) fmt.Sprintf("当前中奖用户: %s\n", user) } } func main() { //切片 userList = []string{} //初始化 锁 mu = sync.Mutex{} //定义访问路由 http.HandleFunc("/", lucky) http.HandleFunc("/import", importUser) http.HandleFunc("/count", count) //监听端口,启动服务器 http.ListenAndServe(":8080", nil) }
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    498 引用 • 1395 回帖 • 249 关注
  • 抽奖
    4 引用 • 53 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...