// iterator package main import ( "fmt" "log" "strconv" "strings" "time" "github.com/garyburd/redigo/redis" ) type userQuota struct { user string storage int messages int } type produced struct { user string logins []string } func producer() { conn := dbs.rdb.Get() defer conn.Close() val := "0" loop := true startp := time.Now() users := make(map[string]bool) for loop { status = _Producer retval, err := redis.Values(conn.Do("SCAN", val, "COUNT", strconv.Itoa(opts.MaxBulk))) if err != nil { log.Printf("Scan err: %+v\n", err) if opts.Debug { fmt.Printf("Scan err: %+v\n", err) } break } keys, _ := redis.Strings(retval[1], err) for _, key := range keys { user := key[:strings.Index(key, "@")] users[user] = true } val, _ = redis.String(retval[0], err) if opts.Debug { fmt.Println(val, len(users)) } if val == "0" { loop = false } } if opts.Debug { fmt.Printf("\nKEYS: %+v\n", time.Since(startp)) } max := 0 block := make([]string, 0) for user, _ := range users { block = append(block, user) if max >= opts.MaxBulk { wg.Add(1) mget_chan <- block max = 0 block = make([]string, 0) continue } max += 1 } done <- true }