@sergey_fs

Golang Redis получить значения?

можете подсказать изучаю redis . Через cli добавляю строку . В list показывает cout 1. Теперь вывожу список через Go 0. И если заново зайти в cli то и строка пропала . Код Go https://play.golang.org/p

-----Данным скриптом кладу данные в Redis

import (
	"fmt"
	"time"
	"github.com/go-redis/redis"
)
var (
	client *redis.Client
	err error
)
///Структура для Redis
///{"client":"79095876084","dispach":"12548","timeout":"35","addr":"http.yandex.ru","session_id":"31345134"}
type data struct {
	Client string `json:"client"`
	Dispach string `json:"dispach"`
	Timeout string `json:"timeout"`
	Addr string `json:"addr"`
	Session_id string `json:"session_id"`
	Method string `json:"method"`
}
func init() {
	client = redis.NewClient(&redis.Options{
		Addr:         ":6379",
		DialTimeout:  10 * time.Second,
		ReadTimeout:  30 * time.Second,
		WriteTimeout: 30 * time.Second,
		PoolSize:     10,
		PoolTimeout:  30 * time.Second,
	})
	client.FlushDB()
}

func redis_connect() {
	client := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "", // no password set
		DB:       0,  // use default DB
	})
	pong, err := client.Ping().Result()
	fmt.Println(pong, err)
	if err != nil {fmt.Println("Redis is not Connect")}else {fmt.Println("Redis is Connected")}
	// Output: PONG <nil>
}
func main() {
	////Подключение к БД Redis
	redis_connect()
	/*
	Получить длину списка
	dialer -- буфер на очередь в обзвон
	 */
	/////Загружаю номер в список
	err := client.LPush("dialer","{\"client\":\"79095876084\",\"dispach\":\"12548\",\"timeout\":\"35\",\"addr\":\"http.yandex.ru\",\"session_id\":\"31345134\",\"method\":\"31345134\"}").Err()
	if err != nil {
		panic(err)
	}

	err = client.LPush("dialer","{\"client\":\"79094\",\"dispach\":\"12548\",\"timeout\":\"35\",\"addr\":\"http.yandex.ru\",\"session_id\":\"31345134\",\"method\":\"31345134\"}").Err()
	if err != nil {
		panic(err)
	}

	err = client.LPush("dialer","{\"client\":\"84\",\"dispach\":\"12548\",\"timeout\":\"35\",\"addr\":\"http.yandex.ru\",\"session_id\":\"31345134\",\"method\":\"31345134\"}").Err()
	if err != nil {
		panic(err)
	}


}


Другим забираю

package main

import (
	"fmt"
	"time"
	"github.com/go-redis/redis"
	"encoding/json"
)
var (
	client *redis.Client
	err error
)
///Структура для Redis
///{"client":"79095876084","dispach":"12548","timeout":"35","addr":"http.yandex.ru","session_id":"31345134"}
type data struct {
	Client string `json:"client"`
	Dispach string `json:"dispach"`
	Timeout string `json:"timeout"`
	Addr string `json:"addr"`
	Session_id string `json:"session_id"`
    Method string `json:"method"`
	}
func init() {
	fmt.Println("Балансировшик очереди вызовов с Redis  + Сокет FreeSWITCH ")
	client = redis.NewClient(&redis.Options{
		Addr:         ":6379",
		DialTimeout:  10 * time.Second,
		ReadTimeout:  30 * time.Second,
		WriteTimeout: 30 * time.Second,
		PoolSize:     10,
		PoolTimeout:  30 * time.Second,
	})
	client.FlushDB()
}

func redis_connect() {
	client := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "", // no password set
		DB:       0,  // use default DB
	})
	pong, err := client.Ping().Result()
	fmt.Println(pong, err)
	if err != nil {fmt.Println("Redis is not Connect")}else {fmt.Println("Redis is Connected")}
	// Output: PONG <nil>
}
func main() {
////Подключение к БД Redis
	redis_connect()
	/*
	Получить длину списка
	dialer -- буфер на очередь в обзвон
	 */

	len_icc , err := client.LLen("dialer").Result()
	if err != nil {
		panic(err)
	}
	/*
	Либа https://godoc.org/github.com/go-redis/redis#Ring.LLen
	https://github.com/go-redis/redis
	 */
	fmt.Println("Количество строк в Списке Редис по услуге Автоматический обзвон клиентов", len_icc)
	int_len :=  int(len_icc)
	///Прохожу все циклом
	for i:=0 ; i< int_len ; i++{
		i_int64 := int64(i)
		value_icc , err := client.LIndex("dialer",i_int64).Bytes()
		if err != nil {
			panic(err)
		}
		var icc_list data
		////разбираю JSON
		err = json.Unmarshal(value_icc, &icc_list)
		if err != nil {
			fmt.Println("JSON ERR")
			return
		}
		fmt.Println("Адрес куда отправлять ответ ",icc_list.Addr,"Номер клиента",icc_list.Client,"Номер рассылки",icc_list.Dispach,"Timeout",icc_list.Timeout,"Session_ID",icc_list.Session_id,"Method",icc_list.Method)
	}
}


Но после того как выполню скрипт который записывает в БД данные и после него сразу стартую скрипт который прверет наличие новых данных то пусто

[root@service2 go]# go run test_redis.go
PONG
Redis is Connected
[root@service2 go]# redis-cli
127.0.0.1:6379> LLEN dialer
(integer) 3
127.0.0.1:6379>
127.0.0.1:6379>
[root@service2 go]# go run raspredelitel.go
Балансировшик очереди вызовов с Redis + Сокет FreeSWITCH
PONG
Redis is Connected
Количество строк в Списке Редис по услуге Автоматический обзвон клиентов 0

Можете подсказать в чем причина того что после записи первым скриптом строк в Radis второй скрипт на извлечение данных их не может взять при том что он даже удаляет записи .
Спасибо
  • Вопрос задан
  • 2503 просмотра
Решения вопроса 1
Tyranron
@Tyranron
Ну так Вы же их (данные) явно и удаляете. У Вас что в коде producer'а, что в коде consumer'а, в функции init() идет вызов client.FlushDB().

Подозреваю, Вы добавили этот вызов в producer чтобы обеспечить "чистоту эксперимента". А когда переносили код в consumer просто забыли убрать. В результате, когда у Вас запускается consumer, он подключается, вычищает всю БД, а потом пытается уже что-то из неё вычитать, и, естественно, читать уже нечего.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы