# 19.1 REDIS基本介绍
【点击观看视频】Redis的基本介绍和原理示意
- Redis是NoSQL数据库,不是传统的关系型数据库。官网:https://redis.io/ (opens new window) 和 https://www.redis.cn/ (opens new window)
- Redis: REmote Dictionary Server(远程字典服务器),Redis性能非常高,单机能够达到15w qps,通常适合做缓存,也可以持久化。
- 是完全开源免费的,高性能的(key/value)分布式内存数据库,基于内存运行并支持
# 19.1.1 Redis的安装
# 19.1.2 Redis操作的基本原理图
# 19.2 REDIS的安装和基本使用
# 19.2.1 Redis的启动:
# 19.3 REDIS的操作指令一览
# 19.3.1 Redis的基本使用:
【点击观看视频】Redis的基本使用
说明:Redis 安装好后,默认有 16 个数据库,初始默认使用 0 号库, 编号是 0 . 15
- 添加key-val [set]
- 查看当前redis的 所有key [keys*]
- 获取key对应的值.[getkey]
- 切换redis数据库 [selectindex]
- 如何查看当前数据库的key-val数量 [dbsize]
- 清空当前数据库的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: 北京天安门
String(字符串)-CRUD
举例说明Redis的 String字符串的CRUD操作.set[如果存在就相当于修改,不存在就是添加]/get/del
# 19.4.3 String(字符串)-使用细节和注意事项
- setex(setwithexpire)键秒值
- mset[同时设置一个或多个 key-value 对]
- mget[同时获取多个 key-val]
# 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
# 19.4.5 Hash(哈希,类似golang里的Map)-CRUD
举例说明Redis的 Hash的CRUD的基本操作.
hset/hget/ hgetall / hdel
演示添加user 信息的案例 (name,age)
# 19.4.6 Hash-使用细节和注意事项
【点击观看视频】Redis中Hash的使用细节
在给user设置 name 和 age 时,前面我们是一步一步设置,使用hmset 和 hmget 可以一次性来设置多个 filed 的值和返回多个field的值 。
hlen 统计一个hash 有几个元素.
hexistskeyfield
查看哈希表key中,给定域field是否存在
# 19.4.7 课堂练习
举例,存放一个Student信息:
stu1 name 张三 age 30 score 80 address 北京
说明:
通过相关指令,完成对student的crud操作
# 19.4.8 List(列表)-介绍
【点击观看视频】Redis中List的基本介绍
列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
List本质是个链表,List 的元素 是有序的,元素的值可以重复.
举例,存放多个地址信息:
city 北京 天津 上海
说明 :
key:city
北京 天津 上海 就是三个元素
- 入门的案例
# 19.4.9 List(列表)-CRUD
【点击观看视频】Redis中List的基本使用
举例说明Redis的List的CRUD操作。
lpush/rpush/lrange/lpop/rpop/del/
说明:
List画图帮助学员理解(可以把l想象成一根管道.)
herosList的演示
# 19.4.10 List-使用细节和注意事项
【点击观看视频】Redis中List的使用细节
index,按照索引下标获得元素(从左到右,编号从0开始)
LLEN key 返回列表key的长度,如果key不存在,则key被解释为一个空列表,返回0
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
2
3
4
5
# 19.4.12 Set(集合)-CRUD
举例说明Redis的 Set 的CRUD操作.
- sadd
- smembers[取出所有值]
- sismember[判断值是否是成员]
- srem[删除指定值]
- 演示添加多个电子邮件信息的案例
# 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 ) 安装成功后,可以看到如下包
- 特别说明: 在安装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)
}
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)
}
}
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)
}
}
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)
}
}
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)
}
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 ) 示意图
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)
}
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链接池