This question already has an answer here:
I have 2 Redis servers (data are diveded to 2 servers) and I should run GET operation to both servers for a given key.
The 1st version of my code:
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
var pools []*redis.Pool
func main() {
readServers := []string{
"my-redis-server1:6379",
"my-redis-server2:6379",
}
for _, s := range readServers {
pools = append(pools, &redis.Pool{
MaxIdle: 5,
Dial: func() (redis.Conn, error) {
fmt.Printf("server: %s
", s)
c, err := redis.Dial("tcp", s)
if err != nil {
panic(err.Error())
}
return c, err
},
})
}
for i, p := range pools {
c := p.Get()
defer c.Close()
res, err := redis.String(c.Do("GET", "key"))
fmt.Printf("pools[%d] res: %s, err: %s
", i, res, err)
}
}
my-redis-server2
has data for key key
(value: value
), so expected output is:
server: my-redis-server1:6379
pools[0] res: , err: redigo: nil returned
server: my-redis-server2:6379
pools[1] res: value, err: %!s(<nil>)
But actual output was:
server: my-redis-server2:6379
pools[0] res: value, err: %!s(<nil>)
server: my-redis-server2:6379
pools[1] res: value, err: %!s(<nil>)
I'd like to know why actual output prints my-redis-server2:6379
for pools[0], not my-redis-server1:6379
.
The following code is the 2nd version and this acts as expected:
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
)
var pools []*redis.Pool
func newPool(svr string) *redis.Pool {
return &redis.Pool{
MaxIdle: 5,
Dial: func() (redis.Conn, error) {
fmt.Printf("server: %s
", svr)
c, err := redis.Dial("tcp", svr)
if err != nil {
panic(err.Error())
}
return c, err
},
}
}
func main() {
readServers := []string{
"my-redis-server1:6379",
"my-redis-server2:6379",
}
for _, s := range readServers {
pools = append(pools, newPool(s))
}
for i, p := range pools {
c := p.Get()
defer c.Close()
res, err := redis.String(c.Do("GET", "key"))
fmt.Printf("pools[%d] res: %s, err: %s
", i, res, err)
}
}
What is the main difference between the 1st and 2nd code? I don't understand how extracting a function effects to the result.
</div>