一、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
1package main 2 3import ( 4 "fmt" 5 "github.com/garyburd/redigo/redis" 6) 7 8func main() { 9 //通过go向redis写入和读取数据 10 conn, err := redis.Dial("tcp", "127.0.0.1:6379") 11 12 if err != nil { 13 fmt.Println("redis.Dial err=", err) 14 return 15 } 16 17 defer conn.Close() 18 19 _, err = conn.Do("Set", "name", "tomjerry") 20 if err != nil { 21 fmt.Println("set err=", err) 22 return 23 } 24 25 r, err := redis.String(conn.Do("Get", "name")) 26 if err != nil { 27 fmt.Println("set err=", err) 28 return 29 } 30 31 //返回的r是interface{} 32 fmt.Println(r) 33}
通过golang操作Redis的hash数据类型
1package main 2 3import ( 4 "fmt" 5 "github.com/garyburd/redigo/redis" 6) 7 8func main() { 9 //通过go向redis写入和读取数据 10 conn, err := redis.Dial("tcp", "127.0.0.1:6379") 11 12 if err != nil { 13 fmt.Println("redis.Dial err=", err) 14 return 15 } 16 17 defer conn.Close() 18 19 _, err = conn.Do("HSet", "user01", "name", "john") 20 if err != nil { 21 fmt.Println("hset err=", err) 22 return 23 } 24 25 _, err = conn.Do("HSet", "user01", "age", 18) 26 if err != nil { 27 fmt.Println("hset err=", err) 28 return 29 } 30 31 r1, err := redis.String(conn.Do("HGet", "user01", "name")) 32 if err != nil { 33 fmt.Println("hget err=", err) 34 return 35 } 36 37 r2, err := redis.Int(conn.Do("HGet", "user01", "age")) 38 if err != nil { 39 fmt.Println("hget err=", err) 40 return 41 } 42 43 fmt.Printf("操作r1=%v r2=%v\n", r1, r2) 44}
对hash数据结构,field-val是批量放入和读取
1package main 2 3import ( 4 "fmt" 5 "github.com/garyburd/redigo/redis" 6) 7 8func main() { 9 //通过go向redis写入和读取数据 10 conn, err := redis.Dial("tcp", "127.0.0.1:6379") 11 12 if err != nil { 13 fmt.Println("redis.Dial err=", err) 14 return 15 } 16 17 defer conn.Close() 18 19 _, err = conn.Do("HMSet", "user02", "name", "john", "age", 19) 20 if err != nil { 21 fmt.Println("hmset err=", err) 22 return 23 } 24 25 r, err := redis.Strings(conn.Do("HMGet", "user02", "name", "age")) 26 if err != nil { 27 fmt.Println("hget err=", err) 28 return 29 } 30 31 for i, v := range r { 32 fmt.Printf("r[%d]=%s\n", i, v) 33 } 34}
四、Redis链接池
通过Golang对Redis操作,还可以通过Redis链接池, 流程如下:
1、事先初始化一定数量的链接,放入到链接池
2、当Go需要操作Redis时,直接从Redis链接池取出链接即可。
3、这样可以节省临时获取Redis链接的时间,从而提高效率。
1package main 2 3import ( 4 "fmt" 5 "github.com/garyburd/redigo/redis" 6) 7 8var pool *redis.Pool 9 10func init() { 11 pool = &redis.Pool{ 12 MaxIdle: 8, //最大空闲链接数 13 MaxActive: 0, // 表示和数据库的最大链接数,0表示没有限制 14 IdleTimeout: 100, // 最大空闲时间 15 //初始化链接的代码, 链接哪个ip的redis 16 Dial: func() (redis.Conn, error) { 17 return redis.Dial("tcp", "localhost:6379") 18 }, 19 } 20} 21 22func main() { 23 //先从pool取出一个链接 24 conn := pool.Get() 25 defer conn.Close() 26 27 _, err := conn.Do("Set", "name", "nancy") 28 if err != nil { 29 fmt.Println("conn.Do err=", err) 30 return 31 } 32 33 r, err := redis.String(conn.Do("Get", "name")) 34 if err != nil { 35 fmt.Println("conn.Do err=", err) 36 return 37 } 38 39 fmt.Println("r=", r) 40 41 conn2 := pool.Get() 42 defer conn2.Close() 43 44 _, err = conn2.Do("Set", "name2", "汤姆猫~~2") 45 if err != nil { 46 fmt.Println("conn.Do err~~~~=", err) 47 return 48 } 49 50 r2, err := redis.String(conn2.Do("Get", "name2")) 51 if err != nil { 52 fmt.Println("conn.Do err=", err) 53 return 54 } 55 fmt.Println("r=", r2) 56}