背景
希望对结果集进行随机,但有一个限制条件,就是每天每个用户拿到的结果集顺序是固定的
解决方案
通过存储解决
- 每天第一次对结果集进行随机,然后将数据存储在缓存中,失效时间为一天。
- 这种方案比较直观,并且可以解决大部分问题。
- 如果结果集的查询条件过于多变(查询条件较多,且经常变化),则缓存的key设计就会过于复杂,并且缓存的容量不可控,极限情况下有撑爆缓存的风险
通过算法解决
- 构建一个算法,使用该算法每次对结果集进行随机,并且保证每天每个用户的随机结果是一致的
- 利用伪随机数的特性,使用日期+用户来构造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) }
- 通过算法方案会带来更多的DB查询,使用该方案需要保证查询的耗时可控