1.redis是NoSQL数据库,不是传统的关系型db
REmote DIctionary Server
性能很强。单机能达到15w qps
通常是适合做缓存,也可以持久化

基于内存运行,并支持持久化,也称为数据结构服务器

2.下载后直接解压,会得到server.exe and cli.exe

下载地址 双击运行,不需要安装

redis为什么要设置一个value ifabsent redis为什么默认16个db_golang

3.使用基础
先打开server.exe
再打开cli.exe
指令参考
redisdoc.com

4.redis默认有16个数据库 0-15 默认用0号库

5.用

redis为什么要设置一个value ifabsent redis为什么默认16个db_golang_02


flushdb 清空db

flushall 清空16个库

6.string
最基本的类型,一个key对应一个value
是二进制安全的,除了放文本,还能放图片等。
string value 最大是512M

设置时无法正常显示中文

redis为什么要设置一个value ifabsent redis为什么默认16个db_hg_03


大概是电脑默认用gbk编码。但是不影响程序使用

set【如果存在就是修改,不存在就是添加】/get/del

setex设置存在时间(s)

redis为什么要设置一个value ifabsent redis为什么默认16个db_hg_04

mset、mget一次操作多个值

redis为什么要设置一个value ifabsent redis为什么默认16个db_golang_05


7.Hash

redis hash是一个string类型的field和value的映射表

适合用于存储对象

使用hset、hget

redis为什么要设置一个value ifabsent redis为什么默认16个db_redis_06


查hgetall 删hdel

hmset、hmget、hlen、hexists

redis为什么要设置一个value ifabsent redis为什么默认16个db_数据库_07


8.list

是简单的字符串列表。按照插入顺序排序。可以添加元素到头部或尾部本质是一个链表,元素有序,元素的值可以重复

redis为什么要设置一个value ifabsent redis为什么默认16个db_redis_08


crud指令:

lpush/rpush/lrange/lpop/rpop/del

lrange key start stop
以0表示第一个,以此类推,也可以用-1表示最右边的元素,-2表示倒数第二个……

lindex llen
如果值全部移除,对应的key也消失了

9.set
string类型的无序集合。元素的值不能重复
crud:
sadd、smembers、sismember、srem

10.安装第三方的开源redis库
redis库

在GOPATH路径下执行安装指令:Install Redigo using the “go get” command:

go get github.com/gomodule/redigo

注意:安装前,确保已经安装并配置了git

执行过后可以看到,src下多了一个github.com的文件

redis为什么要设置一个value ifabsent redis为什么默认16个db_数据库_09


这就算是装完了

11.安装配置git
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

1)安装git,配置路径

Git 各平台安装包下载地址为:http://git-scm.com/downloads 当前版本(2.28.0) 64-bit version of Git for Windows

redis为什么要设置一个value ifabsent redis为什么默认16个db_数据库_10


redis为什么要设置一个value ifabsent redis为什么默认16个db_git_11


redis为什么要设置一个value ifabsent redis为什么默认16个db_golang_12


默认是vim做text editor,说是推荐换成别的,那我就换成vscode吧

redis为什么要设置一个value ifabsent redis为什么默认16个db_golang_13


redis为什么要设置一个value ifabsent redis为什么默认16个db_数据库_14


一路next过去2)安装后,配置git的环境变量Path

添加一个xxx\Git\bin

redis为什么要设置一个value ifabsent redis为什么默认16个db_hg_15

3)测试
到GOPATH执行
结果如下

GOPATH>git --version
git version 2.28.0.windows.1

12.go连接到redis

package main
import (
	"fmt"
	"github.com/gomodule/redigo/redis"
)

func main() {
	//通过go向redis写读数据
	//连接到redis
	conn, err := redis.Dial("tcp", 
		"localhost:6379")
	if err != nil {
		fmt.Println("redis.Dial err =", err)
		return
	}
	fmt.Println("conn success", conn)
}

13.go添加获取redis中的string

//通过go向redis写读数据
	//连接到redis
	conn, err := redis.Dial("tcp", 
		"localhost:6379")
	if err != nil {
		fmt.Println("redis.Dial err =", err)
		return
	}
	defer conn.Close() //及时关闭

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

	//读取数据
	// 返回一个接口r要转成对应的类型
	r, err := redis.String(conn.Do("Get", "name"))
	if err != nil {
		fmt.Println("get err =", err)
		return
	}
	fmt.Println(r)
	fmt.Println("do ok")

14.操作hash
一个一个放

conn, err := redis.Dial("tcp", 
		"localhost:6379")
	if err != nil {
		fmt.Println("redis.Dial err =", err)
		return
	}
	defer conn.Close() //及时关闭

	//写入数据
	_, err = conn.Do("HSet", "user01", "name", "丸子")
	if err != nil {
		fmt.Println("hset err =", err)
		return
	}
	_, err = conn.Do("HSet", "user01", "age", 15)
	if err != nil {
		fmt.Println("hset err =", err)
		return
	}

	//读取数据
	// 返回一个接口r要转成对应的类型
	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("r1 = %v\nr2 = %v\n", r1, r2)

15.批量操作hash

conn, err := redis.Dial("tcp", 
		"localhost:6379")
	if err != nil {
		fmt.Println("redis.Dial err =", err)
		return
	}
	defer conn.Close() //及时关闭

	//写入数据
	_, err = conn.Do("HMSet", "user02", "name", "John",
		"age", 33)
	if err != nil {
		fmt.Println("hmset err =", err)
		return
	}

	//读取数据
	// 返回一个接口r要转成对应的类型
	r, err := redis.Strings(conn.Do("HMGet", "user02", "name", "age"))
	if err != nil {
		fmt.Println("hmget err =", err)
		return
	}
	fmt.Printf("r = %v\n", r)
	for i, v := range r {
		fmt.Printf("r[%d] = %v\n", i, v)
	}

16.go还可以通过redis连接池操作redis
可以节省临时获取redis连接的时间

//定义一个全局的pool
var pool *redis.Pool
//启动程序时 初始化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() {
	//从pool中取出一个连接
	conn := pool.Get()
	defer conn.Close()
	_, err := conn.Do("Set", "name", "Xiaox")
	if err != nil {
		fmt.Println("do error,", err)
	}

	r, err := redis.String(conn.Do("Get", "name"))
	if err != nil {
		fmt.Println("do error,", err)
	}
	fmt.Println(r)
}