Golang笔记——go使用Redis

6 篇文章 1 订阅

Redis 基本介绍

在这里插入图片描述
Redis 的安装
在这里插入图片描述
Redis 操作的基本原理图
在这里插入图片描述

Redis 的安装和基本使用

Redis 的启动:
在这里插入图片描述
Redis 的操作指令一览
在这里插入图片描述
Redis 的基本使用:

说明: 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 的五大数据类型:

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

String(字符串) -介绍

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

redis 中字符串 value 最大是 512M

  • 举例,存放一个地址信息:
    address 北京天安门
    说明 :
    key : address
    value: 北京天安门
127.0.0.1:6379> set address ᄆᄆᄒᄅ
OK
127.0.0.1:6379> get address
"\xb1\xb1\xbe\xa9"

String(字符串) -CRUD

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

127.0.0.1:6379> del address
(integer) 1
127.0.0.1:6379> get address
(nil)

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

  • setex(set with expire)键秒值
127.0.0.1:6379> setex message01 10 hello.you
OK
127.0.0.1:6379> get message01
"hello.you"
127.0.0.1:6379> get message01
(nil)
  • mset[同时设置一个或多个 key-value 对]
  • mget[同时获取多个 key-val]
127.0.0.1:6379> mset worker01 tom workwe02 scott
OK
127.0.0.1:6379> get worker02
(nil)
127.0.0.1:6379> get workwe02
"scott"
127.0.0.1:6379> mget worker01 workwe02
1) "tom"
2) "scott"

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

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

  • 举例,存放一个 User 信息:(user1)
    user1 name “smith” age 30 job “golang coder”
    说明 :
    key : user1
    name 张三 和 age 30 就是两对 field-value

127.0.0.1:6379> hset user1 name "smith"
(integer) 1
127.0.0.1:6379> hest user1 age 30
(error) ERR unknown command 'hest'
127.0.0.1:6379> hset user1 age 30
(integer) 1
127.0.0.1:6379> hset user1 job soft-go
(integer) 1
127.0.0.1:6379> hget user1 name
"smith"
127.0.0.1:6379> hget user1 age
"30"
127.0.0.1:6379> hget user1 jib
(nil)
127.0.0.1:6379> hget user1 job
"soft-go"
  • 举例说明 Redis 的 Hash 的 CRUD 的基本操作.
  • hset/hget/hgetall/hdel
    演示添加 user 信息的案例 (name,age )
127.0.0.1:6379> hgetall user1
1) "name"
2) "smith"
3) "age"
4) "30"
5) "job"
6) "soft-go"
127.0.0.1:6379>

Hash-使用细节和注意事项

  1. 在给 user 设置 name 和 age 时,前面我们是一步一步设置,使用 hmset 和 hmget 可以一次性来设 置多个 filed 的值和返回多个 field 的值 。

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

  3. hexists key field 查看哈希表 key 中,给定域 field 是否存

127.0.0.1:6379> hmset user2 name jerry age 110 job soft-java
OK
127.0.0.1:6379> hmget user2 name age job
1) "jerry"
2) "110"
3) "soft-java"
127.0.0.1:6379> hlen user2
(integer) 3
127.0.0.1:6379> hexist name
(error) ERR unknown command 'hexist'
127.0.0.1:6379> hexists name
(error) ERR wrong number of arguments for 'hexists' command
127.0.0.1:6379> hexists user2 name
(integer) 1
127.0.0.1:6379>

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

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

  • 举例,存放多个地址信息:
    city 北京 天津 上海 说明 :
    key : city
    北京 天津 上海 就是三个元素

  • 入门的案例

127.0.0.1:6379> lpush city beijing shanghai tianjing
(integer) 3
127.0.0.1:6379> lrange city 0 -1
1) "tianjing"
2) "shanghai"
3) "beijing"
  • List(列表)-CRUD
    举例说明 Redis 的 List 的 CRUD 操作。
    lpush/rpush/lrange/lpop/rpop/del/
    说明:
    List 画图帮助学员理解(可以把 l 想象成一根管道.)
    在这里插入图片描述
127.0.0.1:6379> lpush herolist aaa bbb ccc
(integer) 3
127.0.0.1:6379> lrange herolist 0 -1
1) "ccc"
2) "bbb"
3) "aaa"
127.0.0.1:6379> r push herolist ddd eee
(error) ERR unknown command 'r'
127.0.0.1:6379> rpush herolist ddd eee
(integer) 5
127.0.0.1:6379> lrange herolist 0 -1
1) "ccc"
2) "bbb"
3) "aaa"
4) "ddd"
5) "eee"
127.0.0.1:6379> lpop herolist
"ccc"
127.0.0.1:6379>  lrange herolist 0 -1
1) "bbb"
2) "aaa"
3) "ddd"
4) "eee"
127.0.0.1:6379> rpop herolist
"eee"
127.0.0.1:6379>  lrange herolist 0 -1
1) "bbb"
2) "aaa"
3) "ddd"
127.0.0.1:6379> del herolist
(integer) 1
127.0.0.1:6379>  lrange herolist 0 -1
(empty list or set)
127.0.0.1:6379>
  • List-使用细节和注意事项
    在这里插入图片描述
    Set(集合) - 介绍

Redis 的 Set 是 string 类型的无序集合。

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

  • 举例,存放多个邮件列表信息:
    email sgg@sohu.com tom@sohu.com
    说明 :
    key : email
    tn@sohu.com tom@sohu.com 就是二个元素
    redis>sadd email xx xxx
127.0.0.1:6379> sadd emails tom@qq.com jack@qq.com yy@sohu.com yy@hh.com
(integer) 4
127.0.0.1:6379> smembers emails
1) "yy@hh.com"
2) "jack@qq.com"
3) "yy@sohu.com"
4) "tom@qq.com"
127.0.0.1:6379> sadd emails tom@qq.com
(integer) 0
  • Set(集合)- CRUD
    • 举例说明 Redis 的 Set 的 CRUD 操作. sadd
      smembers[取出所有值]
      sismember[判断值是否是成员] srem [删除指定值]
    • 演示添加多个电子邮件信息的案例
127.0.0.1:6379> sismember emails tom@qq.com
(integer) 1
127.0.0.1:6379> sismember emails efa@dd.com
(integer) 0
127.0.0.1:6379> srem emails tom@qq.com
(integer) 1
127.0.0.1:6379> smembers emails\
(empty list or set)
127.0.0.1:6379> smembers emails
1) "yy@hh.com"
2) "jack@qq.com"
3) "yy@sohu.com"

Golang 操作 Redis

**安装第三方开源 Redis 库**
  1. 使用第三方开源的 redis 库: github.com/garyburd/redigo/redis

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

  3. 安装成功后,可以看到如下包
    在这里插入图片描述

特别说明: 在安装 Redis 库前,确保已经安装并配置了 Git, 因为 是从 github 下载安装 Redis 库的, 需要使用到 Git。

Set/Get 接口

说明: 通过 Golang 添加和获取 key-value 【比如 name-tom~ 】

package main import (
	"fmt"
	"github.com/garyburd/redigo/redis" //引入 redis 包
)

func main(){
	//通过 go 向 redis 写入数据和读取数据
	//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. 通过 go 向 redis 写入数据 string [key-val]
	_, err = conn.Do("Set", "name", "tomjerry 猫猫") i
	f err != nil {
		fmt.Println("set	err=", err) return
	}
	
	//3. 通过 go 向 redis 读取数据 string [key-val] 
	r, err := redis.String(conn.Do("Get", "name"))
	if err != nil {
		fmt.Println("set	err=", err) return
	}

	//因为返回 r 是 interface{}
	//因为 name 对应的值是 string ,因此我们需要转换
	//nameString := r.(string)
	fmt.Println("操作 ok ", r)
	}
}

操作 Hash

说明: 通过 Golang 对 Redis 操作 Hash 数据类型
对 hash 数据结构,field-val 是一个一个放入和读取 代码:

package main 

import (
	"fmt"
	"github.com/garyburd/redigo/redis" //引入 redis 包
)
	
	
func main() {
	//通过 go 向 redis 写入数据和读取数据
	//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. 通过 go 向 redis 写入数据 string [key-val]
	_, 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
	}
	
	//3. 通过 go  向 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
	}
	
	//因为返回 r 是 interface{}
	//因为 name 对应的值是 string ,因此我们需要转换
	//nameString := r.(string)
	
	fmt.Printf("操作 ok r1=%v r2=%v \n", r1, r2)
}

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

package main 

import (
	"fmt"
	"github.com/garyburd/redigo/redis" //引入 redis 包
)
	
	
func main() {
	//通过 go 向 redis 写入数据和读取数据
	//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. 通过 go 向 redis 写入数据 string [key-val]
	_, err = conn.Do("HSMet", "user02", "name", "john","age",19) 
	if err != nil {
		fmt.Println("hset	err=", err) return
	}
	
	//3. 通过 go  向 redis 读取数据
	r1, err := redis.String(conn.Do("HMGet","user02", "name","age")) 
	if err != nil {
		fmt.Println("hget	err=", err) return
	}
	
	//因为返回 r 是 interface{}
	//因为 name 对应的值是 string ,因此我们需要转换
	//nameString := r.(string)

	for i ,v := range r{
		fmt.Printf("r[%d]=%s\n",i,v)
	}
	
	//fmt.Printf("操作 ok r1=%v r2=%v \n", r1, r2)
}

批量 Set/Get 数据
说明: 通过 Golang 对 Redis 操作,一次操作可以 Set / Get 多个 key-val 数据 核心代码:

_, err = c.Do("MSet", "name", "尚硅谷", "address", "北京昌平~")
r, err := redis.Strings(c.Do("MGet", "name", "address"))
for _, v := range r { fmt.Println(v)

}

给数据设置有效时间
说明: 通过 Golang 对 Redis 操作,给 key-value 设置有效时间 核心代码:

//给 name 数据设置有效时间为 10s
_, err = c.Do("expire", "name", 10)

操作 List
说明: 通过 Golang 对 Redis 操作 List 数据类型 核心代码:

_, err = c.Do(“lpush”, “heroList”, “no1:宋江”, 30, “no2:卢俊义”, 28) r, err := redis.String(c.Do(“rpop”, “heroList”))

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) { 
		// 初始化链接的代码, 链接哪个 ip 的 redis 
		return redis.Dial("tcp", "localhost:6379")
		},
	}
}

func main(){
	//先从pool取出一个链接
	conn := pool.Get()
	defer conn.Close()

	_, err := conn.Do("set","name","汤姆")
	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)

	//如果我们要从 pool 取出链接,一定保证链接池是没有关闭
	//pool.Close() conn2 := pool.Get()

	_, 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)
	//fmt.Println("conn2=", conn2)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩波的笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值