zoukankan      html  css  js  c++  java
  • go redis

    安装

    redis参考手册

    go get gopkg.in/redis.v4
    //引入
    "gopkg.in/redis.v4"

    连接

    redis.v4 包实现了 redis 的连接池管理, 因此我们就不需要自己手动管理 redis 的连接了.
    默认情况下, redis.v4 的 redis 连接池大小是10, 不过我们可以在初始化 redis 客户端时自行设置连接池的大小, 例如:

    // 创建 redis 客户端
    func createClient() *redis.Client {
        client := redis.NewClient(&redis.Options{
            Addr:     "localhost:6379",
            Password: "",
            DB:       0,
        })
    
        // 通过 cient.Ping() 来检查是否成功连接到了 redis 服务器
        pong, err := client.Ping().Result()
        fmt.Println(pong, err)
    
        return client
    } 

    操作

    字符串(string)

    方法

    set(key, value):给数据库中名称为key的string赋予值value
    get(key):返回数据库中名称为key的string的value
    getset(key, value):给名称为key的string赋予上一次的value
    mget(key1, key2,…, key N):返回库中多个string的value
    setnx(key, value):添加string,名称为key,值为value
    setex(key, time, value):向库中添加string,设定过期时间time
    mset(key N, value N):批量设置多个string的值
    msetnx(key N, value N):如果所有名称为key i的string都不存在
    incr(key):名称为key的string增1操作
    incrby(key, integer):名称为key的string增加integer
    decr(key):名称为key的string减1操作
    decrby(key, integer):名称为key的string减少integer
    append(key, value):名称为key的string的值附加value
    substr(key, start, end):返回名称为key的string的value的子串
    

      

    演示

    // String 操作
    func stringOperation(client *redis.Client) {
        // 第三个参数是过期时间, 如果是0, 则表示没有过期时间.
        err := client.Set("name", "xys", 0).Err()
        if err != nil {
            panic(err)
        }
    
        val, err := client.Get("name").Result()
        if err != nil {
            panic(err)
        }
        fmt.Println("name", val)
    
    
        // 这里设置过期时间.
        err = client.Set("age", "20", 1 * time.Second).Err()
        if err != nil {
            panic(err)
        }
    
        client.Incr("age") // 自增
        client.Incr("age") // 自增
        client.Decr("age") // 自减
    
        val, err = client.Get("age").Result()
        if err != nil {
            panic(err)
        }
        fmt.Println("age", val) // age 的值为21
    
        // 因为 key "age" 的过期时间是一秒钟, 因此当一秒后, 此 key 会自动被删除了.
        time.Sleep(1 * time.Second)
        val, err = client.Get("age").Result()
        if err != nil {
            // 因为 key "age" 已经过期了, 因此会有一个 redis: nil 的错误.
            fmt.Printf("error: %v
    ", err)
        }
        fmt.Println("age", val)
    }
    

      

    列表(list)

    方法

    rpush(key, value):在名称为key的list尾添加一个值为value的元素
    lpush(key, value):在名称为key的list头添加一个值为value的 元素
    llen(key):返回名称为key的list的长度
    lrange(key, start, end):返回名称为key的list中start至end之间的元素
    ltrim(key, start, end):截取名称为key的list
    lindex(key, index):返回名称为key的list中index位置的元素
    lset(key, index, value):给名称为key的list中index位置的元素赋值
    lrem(key, count, value):删除count个key的list中值为value的元素
    lpop(key):返回并删除名称为key的list中的首元素
    rpop(key):返回并删除名称为key的list中的尾元素
    blpop(key1, key2,… key N, timeout):lpop命令的block版本。
    brpop(key1, key2,… key N, timeout):rpop的block版本。
    rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
    

      

    演示

    //list操作
    func listOperation(client *redis.Client) {
    	client.RPush("fruit", "apple")               //在名称为fruit的list尾添加一个值为value的元素
    	client.LPush("fruit", "banana")              //在名称为fruit的list头添加一个值为value的元素
    	length, err := client.LLen("fruit").Result() //返回列表的长度
    	if err != nil {
    		panic(err)
    	}
    	fmt.Println("length:", length)
    
    	value, err := client.LPop("fruit").Result() //返回并删除名称为furit的首元素
    	if err != nil {
    		panic(err)
    	}
    	fmt.Println("fruit:", value)
    	value, err = client.RPop("fruit").Result() //返回并删除名称为fruit的尾元素
    	if err != nil {
    		panic(err)
    	}
    	fmt.Println("fruit:", value)
    }
    

      

    集合(set)

    方法

    sadd(key, member):向名称为key的set中添加元素member
    srem(key, member) :删除名称为key的set中的元素member
    spop(key) :随机返回并删除名称为key的set中一个元素
    smove(srckey, dstkey, member) :移到集合元素
    scard(key) :返回名称为key的set的基数
    sismember(key, member) :member是否是名称为key的set的元素
    sinter(key1, key2,…key N) :求交集
    sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
    sunion(key1, (keys)) :求并集
    sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
    sdiff(key1, (keys)) :求差集
    sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
    smembers(key) :返回名称为key的set的所有元素
    srandmember(key) :随机返回名称为key的set的一个元素
    

      

    演示

    //set操作
    func setOperation(client *redis.Client) {
    	client.SAdd("blacklist", "Obama")     //向blanklist添加元素
    	client.SAdd("blacklist", "Hillary")   //再次添加
    	client.SAdd("blacklist", "the Elder") //添加新元素
    
    	client.SAdd("whitelist", "the Elder") //向whitelist添加元素
    	//判断元素是否在集合中
    	isMember, err := client.SIsMember("blacklist", "Bush").Result()
    	if err != nil {
    		panic(err)
    	}
    	fmt.Println("Is Bush in blacklist:", isMember)
    	//求交集,即既在黑名单中,又在白名单中
    	names, err := client.SInter("blacklist", "whitelist").Result()
    	if err != nil {
    		panic(err)
    	}
    	//获取到的元素是the Elder
    	fmt.Println("Inter reqult:", names)
    	//获取指定集合所有元素
    	all, err := client.SMembers("blacklist").Result()
    	if err != nil {
    		panic(err)
    	}
    	fmt.Println("All member:", all)
    
    }
    

      

    哈希(hash)

    方法

    hset(key, field, value):向名称为key的hash中添加元素field
    hget(key, field):返回名称为key的hash中field对应的value
    hmget(key, (fields)):返回名称为key的hash中field i对应的value
    hmset(key, (fields)):向名称为key的hash中添加元素field 
    hincrby(key, field, integer):将名称为key的hash中field的value增加integer
    hexists(key, field):名称为key的hash中是否存在键为field的域
    hdel(key, field):删除名称为key的hash中键为field的域
    hlen(key):返回名称为key的hash中元素个数
    hkeys(key):返回名称为key的hash中所有键
    hvals(key):返回名称为key的hash中所有键对应的value
    hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
    

      

    演示

    //hash操作
    func hashOperation(client *redis.Client) {
    	client.HSet("user_xys", "name", "xys") //向名称为user_xys的hash中添加元素name
    	client.HSet("user_xys", "age", "18")   //向名称为user_xys的hash中添加元素age
    
    	//批量地向名称为user_test的hash中天剑name和age
    	client.HMSet("user_test", map[string]string{"name": "test", "age": "20"})
    	//批量获取名为user_test的hash中的指定字段的值
    	fields, err := client.HMGet("user_test", "name", "age").Result()
    	if err != nil {
    		panic(err)
    	}
    	fmt.Println("fields in user_test:", fields)
    
    	//获取名为user_xys的hash中字段个数
    	length, err := client.HLen("user_xys").Result()
    	if err != nil {
    		panic(err)
    	}
    	fmt.Println("field count in user_xys:", length) //字段个数
    
    	//删除名为user_test的字段
    	client.HDel("user_test", "age")
    	age, err := client.HGet("user_tset", "age").Result()
    	if err != nil {
    		fmt.Printf("Get user_test age error:%v
    ", err)
    	} else {
    		fmt.Println("user_test age is :", age) //字段个数为2
    	}
    
    }
    

      

    redisgo

    演示

    package main
    
    import (
    	"fmt"
    	"github.com/garyburd/redigo/redis"
    )
    
    //定义一个全局pool
    var pool *redis.Pool
    
    //初始化
    func init() {
    	pool = &redis.Pool{
    		MaxIdle:     8,   //最大空闲连接数
    		MaxActive:   0,   //表示和数据库最大连接数,0表示没限制
    		IdleTimeout: 100, //最大空闲时间
    		Dial: func() (redis.Conn, error) { //初始化链接代码,链接到那个ip的redis
    			return redis.Dial("tcp", "127.0.0.1:6379",
    				redis.DialPassword("123456"),
    				redis.DialDatabase(0),
    			)
    		},
    	}
    }
    
    func poolOperation() {
    	//先从pool取出一个链接
    	conn := pool.Get()
    	defer conn.Close()
    	//存入
    	_, err := conn.Do("Set", "name", "汤姆猫~~")
    	if err != nil {
    		fmt.Println("conn Do err=", err)
    		return
    	}
    
    	//取出
    	r, err := redis.String(conn.Do("Get", "name"))
    	if err != nil {
    		fmt.Println("conn.Do err=", err)
    		return
    	}
    	fmt.Println("r=", r)
    	//如果我们要从pool取出链接,一定保证连接池没有关闭
    	//pool.Close()
    	conn2 := pool.Get()
    	_, err = conn2.Do("Set", "name2", "凯啼猫~~~")
    	if err != nil {
    		fmt.Println("conn Do err=", err)
    		return
    	}
    	//取出
    	r2, err := redis.String(conn2.Do("Get", "name2"))
    	if err != nil {
    		fmt.Println("conn.Do err=", err)
    		return
    	}
    	fmt.Println("r=", r2)
    	//fmt.Println("conn2=",conn2)
    }
    
    //字符串操作
    func stringOperaton() {
    	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
    	if err != nil {
    		fmt.Println("redis.Dial err=", err)
    		return
    	}
    	defer conn.Close()
    
    	//通过go向redis写入数据string
    	_, err = conn.Do("Set", "name", "tomjerry毛毛")
    	if err != nil {
    		fmt.Println("set en=", err)
    		return
    	}
    	//对数据设置有效期
    	_, err = conn.Do("expire", "name", 10)
    
    	r, err := redis.String(conn.Do("Get", "name"))
    	if err != nil {
    		fmt.Println("set err=", err)
    		return
    	}
    
    	fmt.Println("操作ok", r)
    
    }
    
    //列表操作
    func listOperation() {
    	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
    	if err != nil {
    		fmt.Println("redis.Dial err=", err)
    		return
    	}
    	defer conn.Close() //关闭
    
    	_, err = conn.Do("Lpush", "heroList", "宋江", 30, "卢俊义", 26)
    	if err != nil {
    		fmt.Println(err)
    	}
    	r, err := redis.String(conn.Do("rpop", "heroList"))
    	fmt.Printf("%v", r)
    
    }
    
    //hash操作
    func hashOperation() {
    	conn, err := redis.Dial("tcp", "127.0.0.1:6379")
    	if err != nil {
    		fmt.Println("redis.Dial err=", err)
    		return
    	}
    	defer conn.Close() //关闭
    
    	//2.通过go向redis写入数据string[key-val]
    	_, err = conn.Do("HSet", "user01", "name", "john")
    	if err != nil {
    		fmt.Println("hset err=", err)
    		return
    	}
    	_, err = conn.Do("HSet", "user01", "age", 18)
    	if err != nil {
    		fmt.Println("hset err=", err)
    		return
    	}
    	//3.通过go向redis读取数据
    	r1, err := redis.String(conn.Do("HGet", "user01", "name"))
    	if err != nil {
    		fmt.Println("hget err=", err)
    		return
    	}
    	//读取整型数据
    	r2, err := redis.Int(conn.Do("HGet", "user01", "age"))
    	if err != nil {
    		fmt.Println("hget err=", err)
    		return
    	}
    	//因为返回r是interface{}
    	//因为name对应的值是string,因此我们需要转换
    	//nameString:=r.(string)//类型断言
    	fmt.Printf("操作ok r1=%v r2=%v
    ", r1, r2)
    
    	//批量存入读取数据
    	_, err = conn.Do("MSet", "name", "硅谷", "address", "西雅图")
    	r5, err := redis.Strings(conn.Do("MGet", "name", "address"))
    
    	for _, v := range r5 {
    		fmt.Println(v)
    	}
    }
    
    func main() {
    	poolOperation()
    }
    

      

      

  • 相关阅读:
    bzoj 3531 [Sdoi2014]旅行(树链剖分,线段树)
    bzoj 2243 [SDOI2011]染色(树链剖分,线段树)
    spoj 375 Query on a tree(树链剖分,线段树)
    bzoj 2618 2618: [Cqoi2006]凸多边形(半平面交)
    C++中int型与char型相互转换的问题
    408 二进制求和
    407 加一
    斐波那契数列几种算法及时间复杂度分析
    397 Longest Continuous Increasing Subsequence
    376 二叉树的路径和
  • 原文地址:https://www.cnblogs.com/huay/p/12192017.html
Copyright © 2011-2022 走看看