diff --git a/cmd.go b/cmd.go index fe4b20e..61a64ce 100644 --- a/cmd.go +++ b/cmd.go @@ -67,6 +67,7 @@ func main() { var expirationExpr string var maxDepth int var concurrent int + var keySize int var err error flagSet.StringVar(&cmd, "c", "", "command for rdb: json") flagSet.StringVar(&output, "o", "", "output file path") @@ -78,6 +79,7 @@ func main() { flagSet.StringVar(®exExpr, "regex", "", "regex expression") flagSet.StringVar(&expirationExpr, "expire", "", "expiration filter expression") flagSet.BoolVar(&noExpired, "no-expired", false, "filter expired keys(deprecated, please use expire)") + flagSet.IntVar(&keySize, "key-size", 0, "filter keys by its size") _ = flagSet.Parse(os.Args[1:]) // ExitOnError src := flagSet.Arg(0) @@ -103,6 +105,9 @@ func main() { if expirationExpr != "" { options = append(options, helper.WithExpirationOption(expirationExpr)) } + if keySize >= 0 { + options = append(options, helper.WithKeySizeFilterOption(keySize)) + } var outputFile *os.File if output == "" { diff --git a/go.mod b/go.mod index e961701..97d6435 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,6 @@ go 1.16 require ( github.com/bytedance/sonic v1.12.1 - github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect github.com/klauspost/cpuid/v2 v2.2.8 // indirect golang.org/x/arch v0.9.0 // indirect golang.org/x/sys v0.24.0 // indirect diff --git a/go.sum b/go.sum index 9fc9902..9f4403a 100644 --- a/go.sum +++ b/go.sum @@ -1,14 +1,8 @@ -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.8.7 h1:d3sry5vGgVq/OpgozRUNP6xBsSo0mtNdwliApw+SAMQ= -github.com/bytedance/sonic v1.8.7/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= github.com/bytedance/sonic v1.12.1 h1:jWl5Qz1fy7X1ioY74WqO0KjAMtAGQs4sYnjiEBiyX24= github.com/bytedance/sonic v1.12.1/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM= github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= @@ -16,7 +10,6 @@ github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= @@ -33,7 +26,6 @@ github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKs github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.9.0 h1:ub9TgUInamJ8mrZIGlBG6/4TqWeMszd4N8lNorbrr6k= golang.org/x/arch v0.9.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= diff --git a/helper/regex.go b/helper/regex.go index 8bbee09..5069588 100644 --- a/helper/regex.go +++ b/helper/regex.go @@ -74,6 +74,26 @@ func WithNoExpiredOption() NoExpiredOption { return NoExpiredOption(true) } +type keySizeDecoder struct { + dec decoder + size int +} + +func (d *keySizeDecoder) Parse(cb func(object model.RedisObject) bool) error { + return d.dec.Parse(func(object model.RedisObject) bool { + if object.GetSize() >= d.size { + return cb(object) + } + return true + }) +} + +type KeySizeOption int + +func WithKeySizeFilterOption(size int) KeySizeOption { + return KeySizeOption(size) +} + type ExpirationOption string func WithExpirationOption(expr string) ExpirationOption { @@ -147,6 +167,7 @@ func wrapDecoder(dec decoder, options ...interface{}) (decoder, error) { var regexOpt RegexOption var noExpiredOpt NoExpiredOption var expirationOpt ExpirationOption + var keySizeOpt KeySizeOption for _, opt := range options { switch o := opt.(type) { case RegexOption: @@ -155,6 +176,8 @@ func wrapDecoder(dec decoder, options ...interface{}) (decoder, error) { noExpiredOpt = o case ExpirationOption: expirationOpt = o + case KeySizeOption: + keySizeOpt = o } } if regexOpt != nil { @@ -169,6 +192,12 @@ func wrapDecoder(dec decoder, options ...interface{}) (decoder, error) { dec: dec, } } + if keySizeOpt >= 0 { + dec = &keySizeDecoder{ + dec: dec, + size: int(keySizeOpt), + } + } if expirationOpt != "" { if expirationOpt == "noexpire" { dec = &noExpirationDecoder{