// EXAMPLE: stream_tutorial // HIDE_START package example_commands_test import ( "context" "fmt" "github.com/redis/go-redis/v9" ) // HIDE_END // REMOVE_START func UNUSED(v ...interface{}) {} // REMOVE_END func ExampleClient_xadd() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) // REMOVE_START rdb.Del(ctx, "race:france") // REMOVE_END // STEP_START xadd res1, err := rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:france", Values: map[string]interface{}{ "rider": "Castilla", "speed": 30.2, "position": 1, "location_id": 1, }, }).Result() if err != nil { panic(err) } // fmt.Println(res1) // >>> 1692632086370-0 res2, err := rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:france", Values: map[string]interface{}{ "rider": "Norem", "speed": 28.8, "position": 3, "location_id": 1, }, }).Result() if err != nil { panic(err) } // fmt.PrintLn(res2) // >>> 1692632094485-0 res3, err := rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:france", Values: map[string]interface{}{ "rider": "Prickett", "speed": 29.7, "position": 2, "location_id": 1, }, }).Result() if err != nil { panic(err) } // fmt.Println(res3) // >>> 1692632102976-0 // STEP_END // REMOVE_START UNUSED(res1, res2, res3) // REMOVE_END xlen, err := rdb.XLen(ctx, "race:france").Result() if err != nil { panic(err) } fmt.Println(xlen) // >>> 3 // Output: // 3 } func ExampleClient_racefrance1() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) // REMOVE_START rdb.Del(ctx, "race:france") // REMOVE_END _, err := rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:france", Values: map[string]interface{}{ "rider": "Castilla", "speed": 30.2, "position": 1, "location_id": 1, }, ID: "1692632086370-0", }).Result() if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:france", Values: map[string]interface{}{ "rider": "Norem", "speed": 28.8, "position": 3, "location_id": 1, }, ID: "1692632094485-0", }).Result() if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:france", Values: map[string]interface{}{ "rider": "Prickett", "speed": 29.7, "position": 2, "location_id": 1, }, ID: "1692632102976-0", }).Result() if err != nil { panic(err) } // STEP_START xrange res4, err := rdb.XRangeN(ctx, "race:france", "1691765278160-0", "+", 2).Result() if err != nil { panic(err) } fmt.Println(res4) // >>> [{1692632086370-0 map[location_id:1 position:1 rider:Castilla... // STEP_END // STEP_START xread_block res5, err := rdb.XRead(ctx, &redis.XReadArgs{ Streams: []string{"race:france", "0"}, Count: 100, Block: 300, }).Result() if err != nil { panic(err) } fmt.Println(res5) // >>> // [{race:france [{1692632086370-0 map[location_id:1 position:1... // STEP_END // STEP_START xadd_2 res6, err := rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:france", Values: map[string]interface{}{ "rider": "Castilla", "speed": 29.9, "position": 1, "location_id": 2, }, }).Result() if err != nil { panic(err) } //fmt.Println(res6) // >>> 1692632147973-0 // STEP_END // STEP_START xlen res7, err := rdb.XLen(ctx, "race:france").Result() if err != nil { panic(err) } fmt.Println(res7) // >>> 4 // STEP_END // REMOVE_START UNUSED(res6) // REMOVE_END // Output: // [{1692632086370-0 map[location_id:1 position:1 rider:Castilla speed:30.2]} {1692632094485-0 map[location_id:1 position:3 rider:Norem speed:28.8]}] // [{race:france [{1692632086370-0 map[location_id:1 position:1 rider:Castilla speed:30.2]} {1692632094485-0 map[location_id:1 position:3 rider:Norem speed:28.8]} {1692632102976-0 map[location_id:1 position:2 rider:Prickett speed:29.7]}]}] // 4 } func ExampleClient_raceusa() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) // REMOVE_START rdb.Del(ctx, "race:usa") // REMOVE_END // STEP_START xadd_id res8, err := rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:usa", Values: map[string]interface{}{ "racer": "Castilla", }, ID: "0-1", }).Result() if err != nil { panic(err) } fmt.Println(res8) // >>> 0-1 res9, err := rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:usa", Values: map[string]interface{}{ "racer": "Norem", }, ID: "0-2", }).Result() if err != nil { panic(err) } fmt.Println(res9) // >>> 0-2 // STEP_END // STEP_START xadd_bad_id res10, err := rdb.XAdd(ctx, &redis.XAddArgs{ Values: map[string]interface{}{ "racer": "Prickett", }, ID: "0-1", }).Result() if err != nil { // fmt.Println(err) // >>> ERR The ID specified in XADD is equal or smaller than the target stream top item } // STEP_END // STEP_START xadd_7 res11, err := rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:usa", Values: map[string]interface{}{ "racer": "Prickett", }, ID: "0-*", }).Result() if err != nil { panic(err) } fmt.Println(res11) // >>> 0-3 // STEP_END // REMOVE_START UNUSED(res10) // REMOVE_END // Output: // 0-1 // 0-2 // 0-3 } func ExampleClient_racefrance2() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) // REMOVE_START rdb.Del(ctx, "race:france") // REMOVE_END _, err := rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:france", Values: map[string]interface{}{ "rider": "Castilla", "speed": 30.2, "position": 1, "location_id": 1, }, ID: "1692632086370-0", }).Result() if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:france", Values: map[string]interface{}{ "rider": "Norem", "speed": 28.8, "position": 3, "location_id": 1, }, ID: "1692632094485-0", }).Result() if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:france", Values: map[string]interface{}{ "rider": "Prickett", "speed": 29.7, "position": 2, "location_id": 1, }, ID: "1692632102976-0", }).Result() if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:france", Values: map[string]interface{}{ "rider": "Castilla", "speed": 29.9, "position": 1, "location_id": 2, }, ID: "1692632147973-0", }).Result() if err != nil { panic(err) } // STEP_START xrange_all res12, err := rdb.XRange(ctx, "race:france", "-", "+").Result() if err != nil { panic(err) } fmt.Println(res12) // >>> [{1692632086370-0 map[location_id:1 position:1 rider:Castilla... // STEP_END // STEP_START xrange_time res13, err := rdb.XRange(ctx, "race:france", "1692632086369", "1692632086371", ).Result() if err != nil { panic(err) } fmt.Println(res13) // >>> [{1692632086370-0 map[location_id:1 position:1 rider:Castilla speed:30.2]}] // STEP_END // STEP_START xrange_step_1 res14, err := rdb.XRangeN(ctx, "race:france", "-", "+", 2).Result() if err != nil { panic(err) } fmt.Println(res14) // >>> [{1692632086370-0 map[location_id:1 position:1 rider:Castilla speed:30.2]} {1692632094485-0 map[location_id:1 position:3 rider:Norem speed:28.8]}] // STEP_END // STEP_START xrange_step_2 res15, err := rdb.XRangeN(ctx, "race:france", "(1692632094485-0", "+", 2, ).Result() if err != nil { panic(err) } fmt.Println(res15) // >>> [{1692632102976-0 map[location_id:1 position:2 rider:Prickett speed:29.7]} {1692632147973-0 map[location_id:2 position:1 rider:Castilla speed:29.9]}] // STEP_END // STEP_START xrange_empty res16, err := rdb.XRangeN(ctx, "race:france", "(1692632147973-0", "+", 2, ).Result() if err != nil { panic(err) } fmt.Println(res16) // >>> [] // STEP_END // STEP_START xrevrange res17, err := rdb.XRevRangeN(ctx, "race:france", "+", "-", 1).Result() if err != nil { panic(err) } fmt.Println(res17) // >>> [{1692632147973-0 map[location_id:2 position:1 rider:Castilla speed:29.9]}] // STEP_END // STEP_START xread res18, err := rdb.XRead(ctx, &redis.XReadArgs{ Streams: []string{"race:france", "0"}, Count: 2, }).Result() if err != nil { panic(err) } fmt.Println(res18) // >>> [{race:france [{1692632086370-0 map[location_id:1 position:1 rider:Castilla speed:30.2]} {1692632094485-0 map[location_id:1 position:3 rider:Norem speed:28.8]}]}] // STEP_END // Output: // [{1692632086370-0 map[location_id:1 position:1 rider:Castilla speed:30.2]} {1692632094485-0 map[location_id:1 position:3 rider:Norem speed:28.8]} {1692632102976-0 map[location_id:1 position:2 rider:Prickett speed:29.7]} {1692632147973-0 map[location_id:2 position:1 rider:Castilla speed:29.9]}] // [{1692632086370-0 map[location_id:1 position:1 rider:Castilla speed:30.2]}] // [{1692632086370-0 map[location_id:1 position:1 rider:Castilla speed:30.2]} {1692632094485-0 map[location_id:1 position:3 rider:Norem speed:28.8]}] // [{1692632102976-0 map[location_id:1 position:2 rider:Prickett speed:29.7]} {1692632147973-0 map[location_id:2 position:1 rider:Castilla speed:29.9]}] // [] // [{1692632147973-0 map[location_id:2 position:1 rider:Castilla speed:29.9]}] // [{race:france [{1692632086370-0 map[location_id:1 position:1 rider:Castilla speed:30.2]} {1692632094485-0 map[location_id:1 position:3 rider:Norem speed:28.8]}]}] } func ExampleClient_xgroupcreate() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) // REMOVE_START rdb.Del(ctx, "race:france") // REMOVE_END _, err := rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:france", Values: map[string]interface{}{ "rider": "Castilla", "speed": 30.2, "position": 1, "location_id": 1, }, ID: "1692632086370-0", }).Result() if err != nil { panic(err) } // STEP_START xgroup_create res19, err := rdb.XGroupCreate(ctx, "race:france", "france_riders", "$").Result() if err != nil { panic(err) } fmt.Println(res19) // >>> OK // STEP_END // Output: // OK } func ExampleClient_xgroupcreatemkstream() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) // REMOVE_START rdb.Del(ctx, "race:italy") // REMOVE_END // STEP_START xgroup_create_mkstream res20, err := rdb.XGroupCreateMkStream(ctx, "race:italy", "italy_riders", "$", ).Result() if err != nil { panic(err) } fmt.Println(res20) // >>> OK // STEP_END // Output: // OK } func ExampleClient_xgroupread() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) // REMOVE_START rdb.Del(ctx, "race:italy") // REMOVE_END _, err := rdb.XGroupCreateMkStream(ctx, "race:italy", "italy_riders", "$", ).Result() if err != nil { panic(err) } // STEP_START xgroup_read _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:italy", Values: map[string]interface{}{"rider": "Castilla"}, }).Result() // >>> 1692632639151-0 if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:italy", Values: map[string]interface{}{"rider": "Royce"}, }).Result() // >>> 1692632647899-0 if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:italy", Values: map[string]interface{}{"rider": "Sam-Bodden"}, }).Result() // >>> 1692632662819-0 if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:italy", Values: map[string]interface{}{"rider": "Prickett"}, }).Result() // >>> 1692632670501-0 if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:italy", Values: map[string]interface{}{"rider": "Norem"}, }).Result() // >>> 1692632678249-0 if err != nil { panic(err) } // fmt.Println(res25) res21, err := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{ Streams: []string{"race:italy", ">"}, Group: "italy_riders", Consumer: "Alice", Count: 1, }).Result() if err != nil { panic(err) } // fmt.Println(res21) // >>> [{race:italy [{1692632639151-0 map[rider:Castilla]}]}] // STEP_END // REMOVE_START UNUSED(res21) // REMOVE_END xlen, err := rdb.XLen(ctx, "race:italy").Result() if err != nil { panic(err) } fmt.Println(xlen) // Output: // 5 } func ExampleClient_raceitaly() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) // REMOVE_START rdb.Del(ctx, "race:italy") rdb.XGroupDestroy(ctx, "race:italy", "italy_riders") // REMOVE_END _, err := rdb.XGroupCreateMkStream(ctx, "race:italy", "italy_riders", "$", ).Result() if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:italy", Values: map[string]interface{}{"rider": "Castilla"}, ID: "1692632639151-0", }).Result() if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:italy", Values: map[string]interface{}{"rider": "Royce"}, ID: "1692632647899-0", }).Result() if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:italy", Values: map[string]interface{}{"rider": "Sam-Bodden"}, ID: "1692632662819-0", }).Result() if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:italy", Values: map[string]interface{}{"rider": "Prickett"}, ID: "1692632670501-0", }).Result() if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:italy", Values: map[string]interface{}{"rider": "Norem"}, ID: "1692632678249-0", }).Result() if err != nil { panic(err) } _, err = rdb.XReadGroup(ctx, &redis.XReadGroupArgs{ Streams: []string{"race:italy", ">"}, Group: "italy_riders", Consumer: "Alice", Count: 1, }).Result() if err != nil { panic(err) } // STEP_START xgroup_read_id res22, err := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{ Streams: []string{"race:italy", "0"}, Group: "italy_riders", Consumer: "Alice", }).Result() if err != nil { panic(err) } fmt.Println(res22) // >>> [{race:italy [{1692632639151-0 map[rider:Castilla]}]}] // STEP_END // STEP_START xack res23, err := rdb.XAck(ctx, "race:italy", "italy_riders", "1692632639151-0", ).Result() if err != nil { panic(err) } fmt.Println(res23) // >>> 1 res24, err := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{ Streams: []string{"race:italy", "0"}, Group: "italy_riders", Consumer: "Alice", }).Result() if err != nil { panic(err) } fmt.Println(res24) // >>> [{race:italy []}] // STEP_END // STEP_START xgroup_read_bob res25, err := rdb.XReadGroup(ctx, &redis.XReadGroupArgs{ Streams: []string{"race:italy", ">"}, Group: "italy_riders", Consumer: "Bob", Count: 2, }).Result() if err != nil { panic(err) } fmt.Println(res25) // >>> [{race:italy [{1692632647899-0 map[rider:Royce]} {1692632662819-0 map[rider:Sam-Bodden]}]}] // STEP_END // STEP_START xpending res26, err := rdb.XPending(ctx, "race:italy", "italy_riders").Result() if err != nil { panic(err) } fmt.Println(res26) // >>> &{2 1692632647899-0 1692632662819-0 map[Bob:2]} // STEP_END // STEP_START xpending_plus_minus res27, err := rdb.XPendingExt(ctx, &redis.XPendingExtArgs{ Stream: "race:italy", Group: "italy_riders", Start: "-", End: "+", Count: 10, }).Result() if err != nil { panic(err) } // fmt.Println(res27) // >>> [{1692632647899-0 Bob 0s 1} {1692632662819-0 Bob 0s 1}] // STEP_END // STEP_START xrange_pending res28, err := rdb.XRange(ctx, "race:italy", "1692632647899-0", "1692632647899-0", ).Result() if err != nil { panic(err) } fmt.Println(res28) // >>> [{1692632647899-0 map[rider:Royce]}] // STEP_END // STEP_START xclaim res29, err := rdb.XClaim(ctx, &redis.XClaimArgs{ Stream: "race:italy", Group: "italy_riders", Consumer: "Alice", MinIdle: 0, Messages: []string{"1692632647899-0"}, }).Result() if err != nil { panic(err) } fmt.Println(res29) // STEP_END // STEP_START xautoclaim res30, res30a, err := rdb.XAutoClaim(ctx, &redis.XAutoClaimArgs{ Stream: "race:italy", Group: "italy_riders", Consumer: "Alice", Start: "0-0", Count: 1, }).Result() if err != nil { panic(err) } fmt.Println(res30) // >>> [{1692632647899-0 map[rider:Royce]}] fmt.Println(res30a) // >>> 1692632662819-0 // STEP_END // STEP_START xautoclaim_cursor res31, res31a, err := rdb.XAutoClaim(ctx, &redis.XAutoClaimArgs{ Stream: "race:italy", Group: "italy_riders", Consumer: "Lora", Start: "(1692632662819-0", Count: 1, }).Result() if err != nil { panic(err) } fmt.Println(res31) // >>> [] fmt.Println(res31a) // >>> 0-0 // STEP_END // STEP_START xinfo res32, err := rdb.XInfoStream(ctx, "race:italy").Result() if err != nil { panic(err) } fmt.Println(res32) // >>> &{5 1 2 1 1692632678249-0 0-0 5 {1692632639151-0 map[rider:Castilla]} {1692632678249-0 map[rider:Norem]} 1692632639151-0} // STEP_END // STEP_START xinfo_groups res33, err := rdb.XInfoGroups(ctx, "race:italy").Result() if err != nil { panic(err) } fmt.Println(res33) // >>> [{italy_riders 3 2 1692632662819-0 3 2}] // STEP_END // STEP_START xinfo_consumers res34, err := rdb.XInfoConsumers(ctx, "race:italy", "italy_riders").Result() if err != nil { panic(err) } // fmt.Println(res34) // >>> [{Alice 1 1ms 1ms} {Bob 1 2ms 2ms} {Lora 0 1ms -1ms}] // STEP_END // STEP_START maxlen _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:italy", MaxLen: 2, Values: map[string]interface{}{"rider": "Jones"}, }, ).Result() if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:italy", MaxLen: 2, Values: map[string]interface{}{"rider": "Wood"}, }, ).Result() if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:italy", MaxLen: 2, Values: map[string]interface{}{"rider": "Henshaw"}, }, ).Result() if err != nil { panic(err) } res35, err := rdb.XLen(ctx, "race:italy").Result() if err != nil { panic(err) } fmt.Println(res35) // >>> 2 res36, err := rdb.XRange(ctx, "race:italy", "-", "+").Result() if err != nil { panic(err) } // fmt.Println(res36) // >>> [{1726649529170-1 map[rider:Wood]} {1726649529171-0 map[rider:Henshaw]}] // STEP_END // STEP_START xtrim res37, err := rdb.XTrimMaxLen(ctx, "race:italy", 10).Result() if err != nil { panic(err) } fmt.Println(res37) // >>> 0 // STEP_END // STEP_START xtrim2 res38, err := rdb.XTrimMaxLenApprox(ctx, "race:italy", 10, 20).Result() if err != nil { panic(err) } fmt.Println(res38) // >>> 0 // STEP_END // REMOVE_START UNUSED(res27, res34, res36) // REMOVE_END // Output: // [{race:italy [{1692632639151-0 map[rider:Castilla]}]}] // 1 // [{race:italy []}] // [{race:italy [{1692632647899-0 map[rider:Royce]} {1692632662819-0 map[rider:Sam-Bodden]}]}] // &{2 1692632647899-0 1692632662819-0 map[Bob:2]} // [{1692632647899-0 map[rider:Royce]}] // [{1692632647899-0 map[rider:Royce]}] // [{1692632647899-0 map[rider:Royce]}] // 1692632662819-0 // [] // 0-0 // &{5 1 2 1 1692632678249-0 0-0 5 {1692632639151-0 map[rider:Castilla]} {1692632678249-0 map[rider:Norem]} 1692632639151-0} // [{italy_riders 3 2 1692632662819-0 3 2}] // 2 // 0 // 0 } func ExampleClient_xdel() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) // REMOVE_START rdb.Del(ctx, "race:italy") // REMOVE_END _, err := rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:italy", MaxLen: 2, Values: map[string]interface{}{"rider": "Wood"}, ID: "1692633198206-0", }, ).Result() if err != nil { panic(err) } _, err = rdb.XAdd(ctx, &redis.XAddArgs{ Stream: "race:italy", MaxLen: 2, Values: map[string]interface{}{"rider": "Henshaw"}, ID: "1692633208557-0", }, ).Result() if err != nil { panic(err) } // STEP_START xdel res39, err := rdb.XRangeN(ctx, "race:italy", "-", "+", 2).Result() if err != nil { panic(err) } fmt.Println(res39) // >>> [{1692633198206-0 map[rider:Wood]} {1692633208557-0 map[rider:Henshaw]}] res40, err := rdb.XDel(ctx, "race:italy", "1692633208557-0").Result() if err != nil { panic(err) } fmt.Println(res40) // 1 res41, err := rdb.XRangeN(ctx, "race:italy", "-", "+", 2).Result() if err != nil { panic(err) } fmt.Println(res41) // >>> [{1692633198206-0 map[rider:Wood]}] // STEP_END // Output: // [{1692633198206-0 map[rider:Wood]} {1692633208557-0 map[rider:Henshaw]}] // 1 // [{1692633198206-0 map[rider:Wood]}] }