zoukankan      html  css  js  c++  java
  • Redis的使用

    一、Redis基本介绍

    Redis:remote dictionary server 远程字典服务器。Redis性能非常高,单机能够达到15w qps,通常适合做缓存,也可以持久化。

    Redis安装好后,默认有16个数据库,初始默认使用0号库, 编号是 0...15
    1.添加key-val [set]
    2.查看当前redis的所有key [keys *]
    3.获取key对应的值.[get key]
    4.切换redis数据库 [select index]
    5.如何查看当前数据库的key-val数量[dbsize]
    6.清空当前数据库的key-val和清空所有数据库的key-val[flushdb flushall]

    二、Redis的CRUD操作

    Redis的五大数据类型:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(sorted set 有序集合)

    1、string(字符串)

    string是Redis最基本的类型,一个key对应一个value。string类型是二进制安全的。除普通的字符串外,也可以存放图片等数据。redis中字符串value最大是512M。

    string字符串的CRUD操作:set[如果存在就相当于修改,不存在就是添加]/get/del

    setex(set with expire)键秒值

    mset[同时设置一个或多个key-value对]

    mget[同时获取多个key-value]

    2、hash(哈希,类似于golang中的map)

    hash是一个键值对集合。var user1 map[string]string。
    hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

    3、list(列表)

    列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。

    list本质是一个链表,list的元素是有序的,元素的值可以重复。 

    4、set(集合)

    set是string类型的无序集合。底层是HashTable数据结构,set也是存放很多字符串元素,字符串元素是无序的,而且元素的值不能重复。 

    三、golang操作Redis

    在使用Redis之前,需要先安装第三方Redis库,在GOPATH路径下执行安装命令:go get github.com/garyburd/redigo/redis

    通过golang添加和获取key-value

    package main
    
    import (
    	"fmt"
    	"github.com/garyburd/redigo/redis"
    )
    
    func main() {
    	//通过go向redis写入和读取数据
    	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("Set", "name", "tomjerry")
    	if err != nil {
    		fmt.Println("set err=", err)
    		return
    	}
    
    	r, err := redis.String(conn.Do("Get", "name"))
    	if err != nil {
    		fmt.Println("set err=", err)
    		return
    	}
    
    	//返回的r是interface{}
    	fmt.Println(r)
    }
    

     通过golang操作Redis的hash数据类型

    package main
    
    import (
    	"fmt"
    	"github.com/garyburd/redigo/redis"
    )
    
    func main() {
    	//通过go向redis写入和读取数据
    	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("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
    	}
    
    	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
    	}
    
    	fmt.Printf("操作r1=%v r2=%v
    ", r1, r2)
    }
    

    对hash数据结构,field-val是批量放入和读取

    package main
    
    import (
    	"fmt"
    	"github.com/garyburd/redigo/redis"
    )
    
    func main() {
    	//通过go向redis写入和读取数据
    	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("HMSet", "user02", "name", "john", "age", 19)
    	if err != nil {
    		fmt.Println("hmset err=", err)
    		return
    	}
    
    	r, err := redis.Strings(conn.Do("HMGet", "user02", "name", "age"))
    	if err != nil {
    		fmt.Println("hget err=", err)
    		return
    	}
    	
    	for i, v := range r {
    		fmt.Printf("r[%d]=%s
    ", i, v)
    	}
    }
    

    四、Redis链接池

    通过Golang对Redis操作,还可以通过Redis链接池, 流程如下:
    1、事先初始化一定数量的链接,放入到链接池
    2、当Go需要操作Redis时,直接从Redis链接池取出链接即可。
    3、这样可以节省临时获取Redis链接的时间,从而提高效率。

    package main
    
    import (
    	"fmt"
    	"github.com/garyburd/redigo/redis"
    )
    
    var pool *redis.Pool
    
    func init() {
    	pool = &redis.Pool{
    		MaxIdle:     8,   //最大空闲链接数
    		MaxActive:   0,   // 表示和数据库的最大链接数,0表示没有限制
    		IdleTimeout: 100, // 最大空闲时间
    		//初始化链接的代码, 链接哪个ip的redis
    		Dial: func() (redis.Conn, error) {
    			return redis.Dial("tcp", "localhost:6379")
    		},
    	}
    }
    
    func main() {
    	//先从pool取出一个链接
    	conn := pool.Get()
    	defer conn.Close()
    
    	_, err := conn.Do("Set", "name", "nancy")
    	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)
    
    	conn2 := pool.Get()
    	defer conn2.Close()
    
    	_, err = conn2.Do("Set", "name2", "汤姆猫~~2")
    	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)
    }
    
  • 相关阅读:
    复利计算(修改后)
    复利计算测试(C语言)
    实验一、命令解释程序的编写
    《构建之法》之第一二三章读后感
    复利计算1.0 2.0 3.0
    复利计算总结
    Scrum 项目7.0——第一个Sprint的总结和读后感
    Scrum 项目7.0——第一个Sprint的演示和回顾
    Scrum 项目4.0&&5.0
    操作系统——进程调度模拟程序
  • 原文地址:https://www.cnblogs.com/xidian2014/p/10702478.html
Copyright © 2011-2022 走看看