redis-shake工具
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

70 lines
1.4 KiB

package reader
import (
"RedisShake/internal/entry"
"RedisShake/internal/utils"
"fmt"
"sync"
)
type scanClusterReader struct {
readers []Reader
statusId int
}
func NewScanClusterReader(opts *ScanReaderOptions) Reader {
addresses, _ := utils.GetRedisClusterNodes(opts.Address, opts.Username, opts.Password, opts.Tls)
rd := &scanClusterReader{}
for _, address := range addresses {
rd.readers = append(rd.readers, NewScanStandaloneReader(&ScanReaderOptions{
Address: address,
Username: opts.Username,
Password: opts.Password,
Tls: opts.Tls,
}))
}
return rd
}
func (rd *scanClusterReader) StartRead() chan *entry.Entry {
ch := make(chan *entry.Entry, 1024)
var wg sync.WaitGroup
for _, r := range rd.readers {
wg.Add(1)
go func(r Reader) {
for e := range r.StartRead() {
ch <- e
}
wg.Done()
}(r)
}
go func() {
wg.Wait()
close(ch)
}()
return ch
}
func (rd *scanClusterReader) Status() interface{} {
stat := make([]interface{}, 0)
for _, r := range rd.readers {
stat = append(stat, r.Status())
}
return stat
}
func (rd *scanClusterReader) StatusString() string {
rd.statusId += 1
rd.statusId %= len(rd.readers)
return fmt.Sprintf("src-%d, %s", rd.statusId, rd.readers[rd.statusId].StatusString())
}
func (rd *scanClusterReader) StatusConsistent() bool {
for _, r := range rd.readers {
if !r.StatusConsistent() {
return false
}
}
return true
}