GO语言基础入门-Redis数据库入门 | 青训营笔记

112 阅读6分钟

前言

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天,其实第五届青训营已经正式开课n多天了,笔记不断更新中,都是我听完课之后的总结和平时自己的学习积累,分享出来给有需要的朋友。

本文内容

本文将涉及到redis数据库的基本使用、在Go语言使用redis的基本语法。

Go语言基础

1.Redis数据库

(1)Redis数据的介绍
  • redis是NoSQL数据库,不是传统的关系型数据库
  • redis:REmote Dictionary Server(远程字典服务器),redis性能非常高,单击能够达到15w qps,通常适合做缓存,也可以持久化。
  • 是完全开源免费的,高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是最热门的NoSQL数据库之一,也称为数据结构服务器。
(2)Redis的安装和使用

下载地址:官网

Windows版下载地址:github.com/tporadowski…

命令文档:redisdoc.com

基本命令

说明:redis安装好后,默认有16个数据库,初始默认使用0号库,编号0...15

1.添加key-val [set]
2.获取key对应的值 [get key]
3.切换redis数据库 [select index]
4.如何查看当前数据库的key-val数量 [dbsize]
5.查看当前redis中所有key [keys *]
6.清空当前数据库的key-val和清空所有数据库的key-val [flushdb、flushall]
(3)redis数据类型和CURD

redis的五大数据类型是:

String(字符串)、Hash(哈希)、List(列表)、Set(集合)和zset(sorted set:有序集合)

接下来介绍每个类型的使用...

(1)字符串类型

string是 redis 最基本的类型,一个key对应一个value

string类型是二进制安全的。除普通字符串外,也可以存放图片等数据

redis中字符串value最大是512M

设置生存时间(键 秒 值)

setex key seconds value

如果 setex name 10 jack,则这个name键在10s过后就会被删除

同时创建多个键值

mset key1 value1 key2 value2

同时查询多个键的值

mget key1 key2
(2)Hash类型

redis hash 是一个键值对集合。 var user1 map[string]string

redis hash 是一个string类型的field和value的映射表,hash特别合适用于存储对象。

创建单个字段

hset user1 name jack
hset user1 age 20

同时创建多个字段

hmset user2 name jane age 18

查询某个字段的值

hget user1 name
hget user1 age

查询某个key所有字段和值

hgetall user1

同时查询某个key的多个字段的值

hmget user1 name age

判断是否在某个字段

hexists user1 name

查询key的长度(有多少个字段)

hlen user1
(3)List类型

创建--左插

lpush name jack kangkang peter

创建--右插

rpush name jack kangkang peter

查询

lrange city 0 -1

取出一个值并删除-从左边开始

lpop name

取出一个值并删除-从右边开始

rpop name

如果所有值都取完了,list为空时会被删除

删除整个list

del name
(4)集合(set)类型

redis的set是string类型的无需集合

底层是HashTable数据结构,set也是存放很多字符串,字符串元素是无需的,而且元素的值不能重复

创建

sadd emails 123@qq.com 666@qq.com

查询所有值

smembers emails

判断是否存在某个值

sismember emails 123@qq.com

删除指定值

srem emails @666@qq.com
(4)GO操作Redis数据库
(1)安装引入第三方开源redis库

在使用redis前,先安装redis库,在GOPATH路径下执行安装指令

go get github.com/gomodule/redigo/redis
(2)GO连接redis数据库
package main
​
import (
    "fmt"
    "github.com/gomodule/redigo/redis" //引入redis包
)
func main() {
    conn, err := redis.Dial("tcp", "127.0.0.1:6379")
    if err != nil {
        fmt.Println("redis.Dial ERR:", err)
        return
    }
    defer conn.Close()
    fmt.Println("成功连接redis数据库!")
}
(3)GO向redis数据库写入数据
// 通过go 向redis写入数据 string [key-val]
    // (1)写入单个字段值
    _, err = conn.Do("Set", "name", "tom")
    if err != nil {
        fmt.Println("set 错误:", err)
        return
    }
    fmt.Println("插入数据成功!")

批量写入

// MSet可以一次性创建多个key-value数据
_, err = conn.Do("MSet", "name", "tom","age",18)
if err != nil {
    fmt.Println("mset 错误:", err)
    return
}
(4)GO查询redis数据库

通过go 向redis读取数据 string [key-val],因为返回r 是interface{},而name对应值为string,因此我们需要转换一下类型

// (1)查询单个字段值
r, err := redis.String(conn.Do("Get", "name"))
if err != nil {
    fmt.Println("Get 错误:", err)
    return
}
​
//(2)批量查询字段值
MSet可以一次性查询多个key-value数据
r2,err := redis.Strings(conn.Do("MGet","name","age"))
for _,v:=range r2 {
    fmt.Println(v)
}
​
fmt.Println("查询数据成功!")
fmt.Println(r)
​
(5)CURD完整案例
package main
​
import (
    "fmt"
    /* 1.安装引入第三方开源redis库 */
    "github.com/gomodule/redigo/redis" //引入redis包
)
​
func main() {
​
    /* 2.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()
    fmt.Println("成功连接redis数据库!")
​
    /* 3.GO向redis数据库写入数据 */// 通过go 向redis写入数据 string [key-val]
    // (1)写入单个字段值
    _, err = conn.Do("Set", "name", "tom")
    if err != nil {
        fmt.Println("set 错误:", err)
        return
    }
    fmt.Println("插入数据成功!")
​
    // (2)批量写入
    // MSet可以一次性创建多个key-value数据
    // _, err = conn.Do("MSet", "name", "tom","age",18)
    // if err != nil {
    //  fmt.Println("mset 错误:", err)
    //  return
    // }/* 4.GO查询redis数据库 */
    // (1)查询单个字段值
    r, err := redis.String(conn.Do("Get", "name"))
    if err != nil {
        fmt.Println("Get 错误:", err)
        return
    }
​
    // (2)批量查询字段值
    // MSet可以一次性查询多个key-value数据
    // r2,err := redis.Strings(conn.Do("MGet","name","age"))
    // for _,v:=range r2 {
    //  fmt.Println(v)
    // }
​
    fmt.Println("查询数据成功!")
    fmt.Println(r)
​
}
(5)redis数据库_连接池

说明:通过golang对redis操作,还可以通过redis链接池,流程如下:

(1) 事先初始化一定数量的链接,放入带链接池

(2) 当Go需要操作redis时,直接从redis链接池取出链接即可

(3) 这样可以节省临时获取redis链接的时间,从而提高效率。

package main
​
import (
    "fmt"
    "vendor/github.com/gomodule/redigo/redis"
)
​
// 定义一个全局的pool
var pool *redis.Pool
​
// 当启动程序时,就初始化连接池
func init() {
    pool = &redis.Pool{
        MaxIdle:     8,   // 最大空闲链接数
        MaxActive:   0,   //表示和数据库的最大链接数,0 表示没有限制
        IdleTimeout: 100, //最大空闲时间
        Dial: func() (redis.Conn, error) {
            return redis.Dial("tcp", "127.0.0.1:6379")
        },
    }
}
​
func main() {
    fmt.Println()
    /*  取出链接 */
    conn := pool.Get() // 从链接池中取出一个链接
    defer conn.Close() // 关闭链接池,一旦关闭链接池,就不能从链接池中取出链接。/* 创建数据 */
    _, err := conn.Do("Set", "name", "小美")
    if err != nil {
        fmt.Println("conn.Do err=", err)
        return
    }
​
    /* 读取数据 */
    r, err := redis.Strings(conn.Do("Get", "name"))
    if err != nil {
        fmt.Println("conn.Do err=", err)
        return
    }
    fmt.Println("r=", r)
}

总结

本文主要为您介绍了,如何使用go的第三方包go-redis连接Redis

更多详情操作请查看官方文档

写在最后

本文是我的日常学习笔记,如果哪里有写错,麻烦请指出来,感谢。这里我也推荐大家多写笔记,写笔记是一个很好的习惯,可以帮助我们更好的吸收和理解学习的新知识,新的一年大家一起加油!