GoLang之使用garyburdredigoredis依赖 *** 作Redis

GoLang之使用garyburdredigoredis依赖 *** 作Redis,第1张

文章目录 使用garyburd/redigo/redis依赖 *** 作Redis1.Redis介绍2.Redis优势3.Redis依赖安装4.Redis.Conn接口5.Redis.Int(s)函数6.Redis.Ints函数7.Redis.String函数8.Redis.Dial函数9.Redis.Pool结构体10.连接Redis11.String类型Set、Get单 *** 作12.String类型Set、Get批量 *** 作13.List队列lpush、lpop批量 *** 作14.expire命令设置过期时间15.Hash表Hset、Hget单 *** 作16.Redis连接池

使用garyburd/redigo/redis依赖 *** 作Redis

注:本文使用github.com/garyburd/redigo/redis v1.6.3进行讲解

1.Redis介绍

*Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库
*Redis 与其他 key - value 缓存产品有以下三个特点:
(1)Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
(2)Redis不仅仅支持简单的key-value类型的数据,同时还提供string、list(链表)、set(集合)、hash表等数据结构的存储
(3)Redis支持数据的备份,即master-slave模式的数据备份

2.Redis优势

*性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s ,单机能够达到15w qps,通常适合做缓存
*丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型 *** 作
原子 – Redis的所有 *** 作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个 *** 作是原子性的。多个 *** 作也支持事务,即原子性,通过MULTI和EXEC指令包起来
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性
*Redis与其他key-value存储有什么不同:
(1)Redis有着更为复杂的数据结构并且提供对他们的原子性 *** 作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象
(2)Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中 *** 作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问

3.Redis依赖安装
go get github.com/garyburd/redigo/redis

4.Redis.Conn接口
type Conn interface {
	// Close closes the connection.
	Close() error

	// Err returns a non-nil value when the connection is not usable.
	Err() error

	// Do sends a command to the server and returns the received reply.
	Do(commandName string, args ...interface{}) (reply interface{}, err error)

	// Send writes the command to the client's output buffer.
	Send(commandName string, args ...interface{}) error

	// Flush flushes the output buffer to the Redis server.
	Flush() error

	// Receive receives a single reply from the Redis server
	Receive() (reply interface{}, err error)
}
5.Redis.Int(s)函数
func Ints(reply interface{}, err error) ([]int, error) {}
6.Redis.Ints函数
func Ints(reply interface{}, err error) ([]int, error) {}
7.Redis.String函数
func String(reply interface{}, err error) (string, error) {}
8.Redis.Dial函数
func Dial(network, address string, options ...DialOption) (Conn, error) {}
9.Redis.Pool结构体
type Pool struct {
	Dial func() (Conn, error)
	TestOnBorrow func(c Conn, t time.Time) error
	MaxIdle int
	MaxActive int
	IdleTimeout time.Duration
	Wait bool
	MaxConnLifetime time.Duration
	chInitialized uint32 
	mu     sync.Mutex    
	closed bool         
	active int           
	ch     chan struct{} 
	idle   idleList      
}
10.连接Redis
//首先先打开redis客户端,然后运行代码
package main

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
)

func main() {
    //}
	c, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		fmt.Println("conn redis failed,", err)
		return
	}

	fmt.Println("redis conn success") //输出:redis conn success

	defer c.Close()
}

11.String类型Set、Get单 *** 作
package main

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
)

func main() {
	c, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		fmt.Println("conn redis failed,", err)
		return
	}

	defer c.Close()
	_, err = c.Do("Set", "abc", 100)
	if err != nil {
		fmt.Println(err)
		return
	}
	//func Int(reply interface{}, err error) (int, error) {}
	r, err := redis.Int(c.Do("Get", "abc"))
	if err != nil {
		fmt.Println("get abc failed,", err)
		return
	}

	fmt.Println(r) //输出: 100
}

12.String类型Set、Get批量 *** 作
package main

import (
   "fmt"
   "github.com/garyburd/redigo/redis"
)

func main() {
   c, err := redis.Dial("tcp", "localhost:6379")
   if err != nil {
      fmt.Println("conn redis failed,", err)
      return
   }

   defer c.Close()
   _, err = c.Do("MSet", "abc", 100, "efg", 300)
   if err != nil {
      fmt.Println(err)
      return
   }
   //func Ints(reply interface{}, err error) ([]int, error) {
   r, err := redis.Ints(c.Do("MGet", "abc", "efg"))
   if err != nil {
      fmt.Println("get abc failed,", err)
      return
   }

   for _, v := range r {
      fmt.Println(v)  /*输出:100
                             200
   
   */
   }
}

13.List队列lpush、lpop批量 *** 作
package main

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
)

func main() {
	c, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		fmt.Println("conn redis failed,", err)
		return
	}

	defer c.Close()
	_, err = c.Do("lpush", "book_list", "abc", "ceg", 300)
	if err != nil {
		fmt.Println(err)
		return
	}
	r, err := redis.String(c.Do("lpop", "book_list"))
	if err != nil {
		fmt.Println("get abc failed,", err)
		return
	}

	fmt.Println(r) //输出:300
}

14.expire命令设置过期时间
package main

import (
    "fmt"
    "github.com/garyburd/redigo/redis"
)

func main() {
    c, err := redis.Dial("tcp", "localhost:6379")
    if err != nil {
        fmt.Println("conn redis failed,", err)
        return
    }

    defer c.Close()
    _, err = c.Do("expire", "abc", 10)//10秒后过期
    if err != nil {
        fmt.Println(err)
        return
    }
}

15.Hash表Hset、Hget单 *** 作
package main

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
)

func main() {
	c, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		fmt.Println("conn redis failed,", err)
		return
	}

	defer c.Close()
	_, err = c.Do("HSet", "books", "abc", 100)
	if err != nil {
		fmt.Println(err)
		return
	}

	r, err := redis.Int(c.Do("HGet", "books", "abc"))
	if err != nil {
		fmt.Println("get abc failed,", err)
		return
	}

	fmt.Println(r)//输出:100
}

16.Redis连接池
package main
import(
    "fmt"
    "github.com/garyburd/redigo/redis"
)

var pool *redis.Pool  //创建redis连接池

func init(){
    pool = &redis.Pool{     //实例化一个连接池
        MaxIdle:16,    //最初的连接数量
        // MaxActive:1000000,    //最大连接数量
        MaxActive:0,    //连接池最大连接数量,不确定可以用0(0表示自动定义),按需分配
        IdleTimeout:300,    //连接关闭时间 300秒 (300秒不使用自动关闭)    
        Dial: func() (redis.Conn ,error){     //要连接的redis数据库
            return redis.Dial("tcp","localhost:6379")
        },
    }
}

func main(){
    c := pool.Get() //从连接池,取一个链接
    defer c.Close() //函数运行结束 ,把连接放回连接池

        _,err := c.Do("Set","abc",200)
        if err != nil {
            fmt.Println(err)
            return
        }

        r,err := redis.Int(c.Do("Get","abc"))
        if err != nil {
            fmt.Println("get abc faild :",err)
            return
        }
        fmt.Println(r)//输出:200
        pool.Close() //关闭连接池
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/990258.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存