Go语言操作Redis

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29777207/article/details/89673099
package main

import (
	"fmt"
	"github.com/go-redis/redis"
	"time"
)

func main() {
	//字符串操作
	client := redis.NewClient(&redis.Options{
		Addr:     "10.181.13.126:6379",
		Password: "root", // no password set
		DB:       0,  // use default DB
	})

	defer client.Close()

	ping,err := client.Ping().Result()
	if err != nil{
		fmt.Printf("ping err [%s] \n",err.Error())
		err_handler(err)
	}

	fmt.Printf("ping result : %s \n",ping)

	//设置不过期的值
	err = client.Set("session","ABK00000000001",0).Err()
	if err != nil {
		fmt.Printf("try set key [session] to value [ABK00000000001] error [%s] \n",err.Error())
		err_handler(err)
	}

	//设置有失效时间的值
	err = client.Set("cookie","ABK00000000001",time.Hour * 2).Err()
	if err != nil {
		fmt.Printf("try set key [cookie] to value [ABK00000000001] error [%s] \n",err.Error())
		err_handler(err)
	}


	//查询
	value,err := client.Get("session").Result()
	if err != nil {
		fmt.Printf("try get value by key [session] error [%s] \n ",err.Error())
		err_handler(err)
	}
	fmt.Printf("key[session] = %s \n",value)

	//time to live  剩余的生命
	duration,err := client.TTL("cookie").Result()
	if err != nil {
		fmt.Printf("获取cookie剩余生命时间失败:[%s] \n",err.Error())
		err_handler(err)
	}
	fmt.Printf("cookie的剩余生命时间 :%s , %ds\n", duration.String(), int64(duration.Seconds()))


	var userList = [] string {"张乐","赵学洋","冯程程"}
	for _,v := range userList{
		err = client.RPush("user_list",v).Err()
		if err != nil {
			fmt.Printf("rpush list[tqueue] error[%s]\n", err.Error())
			err_handler(err)
		}
	}


	//查询key中数据长度
	list_len, err := client.LLen("user_list").Result()
	if err != nil {
		fmt.Printf("try get len of list[user_list] error[%s]\n",err.Error())
		err_handler(err)
	}

	fmt.Printf("len of list[user_list] is %d\n", list_len)

	//对于消息服务要求,
	// 可使用lpop或者rpop,如果列表为空,会返回一个nil,导致消息订阅者不断尝试调用pop命令。
	// 另一种方式是redis提供了带阻塞的(block)的pop命令,blpop或者brpop。
	// 这两个命令在list为空时处于等待状态,直到列表有元素,或者指定时间到期为止。

	//阻塞的从list的头部读一个元素
	result, err := client.BLPop(time.Second * 1, "user_list").Result()
	if err != nil {
		fmt.Printf("blpop list[user_list] error[%s]\n", err.Error())
		err_handler(err)
	}
	fmt.Printf("blpop list[user_list], value[%s]\n", result[1])

	fmt.Printf("----------------------------------------\n")

	fmt.Printf("hmap test\n")

	//设置map
	err = client.HSet("tmap", "1", "f1").Err()
	if err != nil {
		fmt.Printf("try hset map[tmap] field[1] error[%s]\n",
			err.Error())
		err_handler(err)
	}

	err = client.HSet("tmap", "2", "f2").Err()
	if err != nil {
		fmt.Printf("try hset map[tmap] field[2] error[%s]\n",err.Error())
		err_handler(err)
	}

	kv_map := make(map[string]interface{})
	kv_map["3"] = "f3"
	kv_map["4"] = "f4"

	//插入map集合
	err = client.HMSet("tmap", kv_map).Err()
	if err != nil {
		fmt.Printf("try mset map[tmap] field[3] field[4] error[%s]\n",err.Error())
		err_handler(err)
	}

	//map的大小
	map_len, err := client.HLen("tmap").Result()
	if err != nil {
		fmt.Printf("try get len of map[tmap] error[%s]\n", err.Error())
		err_handler(err)
	}
	fmt.Printf("len of map[tmap] is %d\n", map_len)

	// get map value
	value, err = client.HGet("tmap", "1").Result()
	if err != nil {
		fmt.Printf("try get field[1] value of map[tmap] error[%s]\n",err.Error())
		err_handler(err)
	}

	fmt.Printf("field[1] value of map[tmap] is %s\n", value)

	// hget all
	result_kv, err := client.HGetAll("tmap").Result()
	if err != nil {
		fmt.Printf("try hgetall map[tmap] error[%s]\n", err.Error())
		err_handler(err)
	}

	for k, v := range result_kv {
		fmt.Printf("map[tmap] %s = %s\n", k, v)
	}

	fmt.Printf("----------------------------------------\n")

	fmt.Printf("pubsub test\n")

	//订阅的通道
	pubsub := client.Subscribe("test_channel")

	//订阅的消息是否到达
	_, err = pubsub.Receive()
	if err != nil {
		fmt.Printf("try subscribe channel[test_channel] error[%s]\n",err.Error())
		err_handler(err)
	}
	// go channel to used to receive message
	ch := pubsub.Channel()
	// 订阅消息
	err = client.Publish("test_channel", "hello").Err()
	if err != nil {
		fmt.Printf("try publish message to channel[test_channel] error[%s]\n",err.Error())
		err_handler(err)
	}

	time.AfterFunc(time.Second * 2, func() {
		_ = pubsub.Close()
	})

	// 消费消息
	for {
		msg, ok := <-ch
		if !ok {
			break
		}

		fmt.Printf("收到消息[%s] 从通道[%s]\n",msg.Payload, msg.Channel)
	}







}

func err_handler(err error) {
	fmt.Printf("err_handler, error:%s\n", err.Error())
	panic(err.Error())
}

猜你喜欢

转载自blog.csdn.net/qq_29777207/article/details/89673099