扫码订阅《 》或入驻星球,即可阅读文章!

GOLANG ROADMAP

阅读模式

  • 沉浸
  • 自动
  • 日常
首页
Go友会
  • 城市
  • 校园
Go学院
  • Go小课
  • Go小考
  • Go实战
  • 精品课
Go求职
  • 求职辅导🔥
  • Offer收割社群
  • 企业题库
  • 面试宝典
Go宝典
  • 在线宝典
  • B站精选
  • 推荐图书
  • 每日博文
Go仓库
实验区
  • Go周边
  • Go下载
  • Go月刊
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
author-avatar

GOLANG ROADMAP


首页
Go友会
  • 城市
  • 校园
Go学院
  • Go小课
  • Go小考
  • Go实战
  • 精品课
Go求职
  • 求职辅导🔥
  • Offer收割社群
  • 企业题库
  • 面试宝典
Go宝典
  • 在线宝典
  • B站精选
  • 推荐图书
  • 每日博文
Go仓库
实验区
  • Go周边
  • Go下载
  • Go月刊
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
  • 尚硅谷Go语言核心编程教程

    • 课程说明
    • 第1章 GOLANG 开山篇
    • 第2章 GOLANG 的概述
    • 第3章 GOLANG 变量
    • 第4章 运算符
    • 第5章 程序流程控制
    • 第6章 函数、包和错误处理
    • 第7章 数组与切片
    • 第8章 排序和查找
    • 第9章 map
    • 第10章 面向对象编程 ( 上 )
    • 第11章 面向对象编程 ( 下 )
    • 第12章 项目1:家庭收支记账软件项目
    • 第13章 项目2:客户信息关系系统
    • 第14章 文件操作
    • 第15章 单元测试
    • 第16章 goroutine和channel
    • 第17章 反射
    • 第18章 TCP 编程
    • 第19章 REDIS 的使用
    • 第20章 数据结构

扫码订阅《 》或入驻星球,即可阅读文章!

第19章 REDIS 的使用


GOLANG ROADMAP

# 19.1 REDIS基本介绍

【点击观看视频】Redis的基本介绍和原理示意
  1. Redis是NoSQL数据库,不是传统的关系型数据库。官网:https://redis.io/ (opens new window) 和 https://www.redis.cn/ (opens new window)
  2. Redis: REmote Dictionary Server(远程字典服务器),Redis性能非常高,单机能够达到15w qps,通常适合做缓存,也可以持久化。
  3. 是完全开源免费的,高性能的(key/value)分布式内存数据库,基于内存运行并支持

# 19.1.1 Redis的安装

image-20210121170348134

# 19.1.2 Redis操作的基本原理图

image-20210121170420189

# 19.2 REDIS的安装和基本使用

# 19.2.1 Redis的启动:

image-20210121170435676

# 19.3 REDIS的操作指令一览

http://redisdoc.com (opens new window)

# 19.3.1 Redis的基本使用:

【点击观看视频】Redis的基本使用

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

  1. 添加key-val [set]
  2. 查看当前redis的 所有key [keys*]
  3. 获取key对应的值.[getkey]
  4. 切换redis数据库 [selectindex]
  5. 如何查看当前数据库的key-val数量 [dbsize]
  6. 清空当前数据库的key-val和清空所有数据库的key-val[flushdbflushall]

# 19.4 REDIS的CRUD操作

# 19.4.1 Redis的五大数据类型:

Redis的五大数据类型是:String(字符串) 、Hash(哈希)、List(列表)、Set(集合) 和zset(sortedset:有序集合)

# 19.4.2 String(字符串)-介绍

【点击观看视频】Redis中对string的操作

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

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

redis中字符串value最大是 512 M

  • 举例,存放一个地址信息:

    address 北京天安门

    说明 :

    key:address value: 北京天安门

    image-20210121170703919

  • String(字符串)-CRUD

    举例说明Redis的 String字符串的CRUD操作.set[如果存在就相当于修改,不存在就是添加]/get/del

    image-20210121170738654

# 19.4.3 String(字符串)-使用细节和注意事项

  • setex(setwithexpire)键秒值

image-20210121170818038

  • mset[同时设置一个或多个 key-value 对]
  • mget[同时获取多个 key-val]

image-20210121170845804

# 19.4.4 Hash(哈希,类似golang里的Map)-介绍

【点击观看视频】Redis中Hash的基本使用

基本的介绍

Redishash 是一个键值对集合。varuser 1 map[string]string

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

  • 举例,存放一个User信息:(user 1 )

    user 1 name"smith" age 30 job"golangcoder"

    说明 :

    key:user 1

    name 张三 和 age 30 就是两对 field-value

    image-20210121171023112

# 19.4.5 Hash(哈希,类似golang里的Map)-CRUD

举例说明Redis的 Hash的CRUD的基本操作.

hset/hget/ hgetall / hdel

演示添加user 信息的案例 (name,age)

image-20210121172144399

# 19.4.6 Hash-使用细节和注意事项

【点击观看视频】Redis中Hash的使用细节
  • 在给user设置 name 和 age 时,前面我们是一步一步设置,使用hmset 和 hmget 可以一次性来设置多个 filed 的值和返回多个field的值 。

  • hlen 统计一个hash 有几个元素.

  • hexistskeyfield

    查看哈希表key中,给定域field是否存在

image-20210121172221515

# 19.4.7 课堂练习

举例,存放一个Student信息:

stu1 name 张三 age 30 score 80 address 北京

说明:

通过相关指令,完成对student的crud操作

# 19.4.8 List(列表)-介绍

【点击观看视频】Redis中List的基本介绍

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

List本质是个链表,List 的元素 是有序的,元素的值可以重复.

举例,存放多个地址信息:

city 北京 天津 上海

说明 :

key:city

北京 天津 上海 就是三个元素

  • 入门的案例

image-20210121172458050

# 19.4.9 List(列表)-CRUD

【点击观看视频】Redis中List的基本使用

举例说明Redis的List的CRUD操作。

lpush/rpush/lrange/lpop/rpop/del/

  • 说明:

    List画图帮助学员理解(可以把l想象成一根管道.)

    image-20210121172552669

herosList的演示

image-20210121172701494

image-20210121172718272

# 19.4.10 List-使用细节和注意事项

【点击观看视频】Redis中List的使用细节
  1. index,按照索引下标获得元素(从左到右,编号从0开始)

  2. LLEN key 返回列表key的长度,如果key不存在,则key被解释为一个空列表,返回0

  3. List的其他说明

    List数据,可以从左或者右插入添加

    如果值全移除,对应的键也就消失了

# 19.4.11 Set(集合)-介绍

【点击观看视频】Redis中Set的介绍和使用
  • Redis的Set是string类型的无序集合。
  • 底层是HashTable数据结构,Set 也是存放很多字符串元素,字符串元素是无序的,而且元素的值不能重复
  • 举例,存放多个邮件列表信息:
email sgg@sohu.comtom@sohu.com
说明 :
key:email
tn@sohu.comtom@sohu.com 就是二个元素
redis>sadd email xx xxx
1
2
3
4
5

image-20210121173625773

# 19.4.12 Set(集合)-CRUD

举例说明Redis的 Set 的CRUD操作.

  • sadd
  • smembers[取出所有值]
  • sismember[判断值是否是成员]
  • srem[删除指定值]
  • 演示添加多个电子邮件信息的案例

image-20210121174024908

# 19.4.13 Set课堂练习

  • 举例,存放一个商品信息:

    包括 商品名、价格、生产日期。

    完成对应的crud操作

# 19.5 GOLANG操作REDIS

【点击观看视频】Go连接到Redis

# 19.5.1 安装第三方开源Redis库

1 ) 使用第三方开源的redi库:github.com/garyburd/redigo/redis

2 ) 在使用Redis前,先安装第三方Redis库,在GOPATH路径下执行安装指令: D:\goproject>gogetgithub.com/garyburd/redigo/redis

3 ) 安装成功后,可以看到如下包

image-20210121174128032

  • 特别说明: 在安装Redis库前,确保已经安装并配置了Git, 因为 是从github下载安装Redis库的,需要使用到Git。 如果没有安装配置过Git,请参考: 如何安装配置Git

# 19.5.2 Set/Get接口

【点击观看视频】Go操作Redis(string类型)
package main

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

func main() {
	//1.链接到redis
	conn,err := redis.Dial("tcp","127.0.0.1:6379")
	if err != nil{
		fmt.Println("redis.Dial err=",err)
		return
	}
	defer conn.Close()

	//2.向redis写入数据
	_,err = conn.Do("Set","name","tan")
	if err != nil {
		fmt.Println("set err=",err)
		return
	}

	//3.读取redis数据
	r,err := redis.String(conn.Do("Get","name"))
	if err != nil {
		fmt.Println("get err=",err)
		return
	}

	fmt.Println("操作ok",r)

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 19.5.3 操作Hash

【点击观看视频】Go操作Redis(hash类型)
package main

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

func main() {
	//1.链接到redis
	conn,err := redis.Dial("tcp","127.0.0.1:6379")
	if err != nil{
		fmt.Println("redis.Dial err=",err)
		return
	}
	defer conn.Close()

	//2.向redis写入数据
	//一个一个放入
	_,err = conn.Do("HSet","user01","name","john")
	if err != nil {
		fmt.Println("set err=",err)
		return
	}

	_,err = conn.Do("HSet","user01","age",18)
	if err != nil {
		fmt.Println("set err=",err)
		return
	}

	//3.读取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
	}

	fmt.Printf("操作ok r1=%v r2=%v\n",r1,r2)


	//批量放入
	_,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\n",i,v)
	}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

# 19.5.4 批量Set/Get数据

package main

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

func main() {
	//1.链接到redis
	conn,err := redis.Dial("tcp","127.0.0.1:6379")
	if err != nil{
		fmt.Println("redis.Dial err=",err)
		return
	}
	defer conn.Close()

	//2.向redis写入数据
	//批量放入
	_,err = conn.Do("MSet","name","tan","address","西安")
	if err != nil {
		fmt.Println("MSet err=",err)
		return 
	}
	//一次读取
	r,err := redis.Strings(conn.Do("MGet","name","address"))
	if err != nil {
		fmt.Println("MGet err=",err)
		return 
	}
    
	for i, v := range r {
		fmt.Printf("r[%d]=%s\n",i,v)
	}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

# 19.5.5 给数据设置有效时间

package main

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

func main() {
	//1.链接到redis
	conn,err := redis.Dial("tcp","127.0.0.1:6379")
	if err != nil{
		fmt.Println("redis.Dial err=",err)
		return
	}
	defer conn.Close()

	//2.向redis写入数据
	//批量放入
	_,err = conn.Do("MSet","name","ru","address","北京")
	if err != nil {
		fmt.Println("MSet err=",err)
		return 
	}
	//一次读取
	r,err := redis.Strings(conn.Do("MGet","name","address"))
	if err != nil {
		fmt.Println("MGet err=",err)
		return 
	}
	//设置过期时间
	_,err = conn.Do("expire","name",10)

	for i, v := range r {
		fmt.Printf("r[%d]=%s\n",i,v)
	}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

# 19.5.6 操作List

package main

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

func main() {
	//1.链接到redis
	conn,err := redis.Dial("tcp","127.0.0.1:6379")
	if err != nil{
		fmt.Println("redis.Dial err=",err)
		return
	}
	defer conn.Close()

	//2.向redis写入数据
	_,err = conn.Do("lpush","herList","no1:宋江",30,"no2:卢俊义",28)
	if err != nil {
		fmt.Println("lpush err=",err)
		return 
	}
	//List 先进先出
	r0,err := redis.String(conn.Do("rpop","herList"))
	if err != nil {
		fmt.Println("MGet err=",err)
		return 
	}
	fmt.Println(r0)
	r1,err := redis.String(conn.Do("rpop","herList"))
	if err != nil {
		fmt.Println("MGet err=",err)
		return 
	}
	fmt.Println(r1)

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

# 19.5.7 Redis链接池

【点击观看视频】Redis连接池的介绍和原理
【点击观看视频】Redis连接池的使用案例

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

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

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

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

4 ) 示意图

image-20210121174840723

5 ) 链接池使用的案例

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)  {
			return redis.Dial("tcp","localhost:6379")
		},
	}
}

func main() {
	conn := pool.Get()
	defer conn.Close()

	_,err := conn.Do("Set","name","golang")
	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)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  • 19.1 REDIS基本介绍
  • 19.1.1 Redis的安装
  • 19.1.2 Redis操作的基本原理图
  • 19.2 REDIS的安装和基本使用
  • 19.2.1 Redis的启动:
  • 19.3 REDIS的操作指令一览
  • 19.3.1 Redis的基本使用:
  • 19.4 REDIS的CRUD操作
  • 19.4.1 Redis的五大数据类型:
  • 19.4.2 String(字符串)-介绍
  • 19.4.3 String(字符串)-使用细节和注意事项
  • 19.4.4 Hash(哈希,类似golang里的Map)-介绍
  • 19.4.5 Hash(哈希,类似golang里的Map)-CRUD
  • 19.4.6 Hash-使用细节和注意事项
  • 19.4.7 课堂练习
  • 19.4.8 List(列表)-介绍
  • 19.4.9 List(列表)-CRUD
  • 19.4.10 List-使用细节和注意事项
  • 19.4.11 Set(集合)-介绍
  • 19.4.12 Set(集合)-CRUD
  • 19.4.13 Set课堂练习
  • 19.5 GOLANG操作REDIS
  • 19.5.1 安装第三方开源Redis库
  • 19.5.2 Set/Get接口
  • 19.5.3 操作Hash
  • 19.5.4 批量Set/Get数据
  • 19.5.5 给数据设置有效时间
  • 19.5.6 操作List
  • 19.5.7 Redis链接池