• Home
  • Articles
    • 日志
    • 妍小言
    • 舒小书
    • 浩然说
    • 生活日记
  • All Tags

一个随机问题的思考

08 Mar 2021

Reading time ~1 minute

背景

希望对结果集进行随机,但有一个限制条件,就是每天每个用户拿到的结果集顺序是固定的

解决方案

通过存储解决

  1. 每天第一次对结果集进行随机,然后将数据存储在缓存中,失效时间为一天。
  2. 这种方案比较直观,并且可以解决大部分问题。
  3. 如果结果集的查询条件过于多变(查询条件较多,且经常变化),则缓存的key设计就会过于复杂,并且缓存的容量不可控,极限情况下有撑爆缓存的风险

通过算法解决

  1. 构建一个算法,使用该算法每次对结果集进行随机,并且保证每天每个用户的随机结果是一致的
  2. 利用伪随机数的特性,使用日期+用户来构造seed
    func TestRandom(t *testing.T)  {
     rand1 := rand.New(rand.NewSource(1000))
     for i:=0;i< 5; i++ {
         fmt.Println(rand1.Int())
     }
     fmt.Println("==========================")
     rand2 := rand.New(rand.NewSource(1000))
     for i:=0;i< 5; i++ {
         fmt.Println(rand2.Int())
     }
    
     fmt.Println("==========================")
     rand3 := rand.New(rand.NewSource(1000))
     sourceSlice := []int32{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
     sortIndex := make([]int, len(sourceSlice))
     for i, _ := range sourceSlice {
         sortIndex[i] = rand3.Int()
     }
     sort.Slice(sourceSlice, func(i, j int) bool {
         return sortIndex[i] > sortIndex[j]
     })
     fmt.Println(sourceSlice)
    }
    
  3. 通过算法方案会带来更多的DB查询,使用该方案需要保证查询的耗时可控


random