go学习redis的学习与使用

news2025/1/4 15:03:38

文章目录

    • 一、redis的学习与使用
      • 1.Redis的基本介绍
      • 2.Redis的安装下载安装包即可
      • 3.Redis的基本使用
        • 1)Redis的启动:
        • 2)Redis的操作的三种方式
        • 3)说明:Redis安装好后,默认有16个数据库,初始默认使用0号库,编号0...15
      • 4.Redis的五大数据类型和CRUD操作
        • 1)Redis的五大数据类型是:**String(字符串)**、**Hash(哈希)**、**List(列表)**、**Set(集合)**和**zset(sorted set :有序集合)**
        • 2)String
        • 3)Hash
        • 4)List
        • 5)Set
    • 二、go操作redis
      • 1、安装第三方开源的redis库
      • 2、使用go语言开始进行操作
        • 1)操作string
        • 2)操作hash
        • 3)批量操作Set/Get数据
        • 4)给数据设置有效时间
        • 5)课堂练习
        • 6)Redis连接池

一、redis的学习与使用

1.Redis的基本介绍

1).Redis是NoSQL数据库,不是传统的关系型数据库

官网: http://redis.io/ 和http://www.redis.cn/

2).Redis:REmote DIctionary Server(远程字典服务器),Redis的性能非常高,单机可以达到15W gps.通常适合做缓存,也可以持久化

3)是完全开源免费的,高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化Nosql数据库,是最热门的NoSql数据库之一,也称为数据结构服务器

2.Redis的安装下载安装包即可

网址:https://github.com/tporadowski/redis/releases

下载好后的目录结构,其中有两个是redis的关键文件

redis客户端文件:redis-cli.exe

redis服务器文件:redis-server.exe

在这里插入图片描述

redis结构示意图

在这里插入图片描述

3.Redis的基本使用

1)Redis的启动:

启动Redis的服务器端程序(redis-server.exe),直接双击即可运行

在这里插入图片描述

2)Redis的操作的三种方式

在这里插入图片描述

说明:
1)使用telnet操作Redis
2)使用redis-cli.exe操作Redis,双击即可进入客户端
3)Golang操作redis

redis基本指令

http://redisdoc.com(已失效)

在这里插入图片描述

在这里插入图片描述

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

-1.添加key-val [set]

-2.查看当前redis的所有key [key * 获取key对应的值[get key]

-3.切换redis数据库[select index]

-4.如何查看当前数据库的key-val数量[dbsize]

在这里插入图片描述

-5.清空当前数据库的key-val和清空所有数据库的key -val[flush db flushall]

4.Redis的五大数据类型和CRUD操作

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

(字符串)-介绍

-1.string是redis的基本类型,一个key对应一个value

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

-3.redis中字符串value最大值是512M

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

address北京天安门

说明:

key :address

value : 北京天安门

127.0.0.1:6379> set address beijing
OK
127.0.0.1:6379> get address
"beijing"
127.0.0.1:6379>

-4.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)
127.0.0.1:6379>

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

  • setex(set with expire)键秒值
127.0.0.1:6379> setex mess01 10 hello,you
OK
127.0.0.1:6379> get mess01
"hello,you"
127.0.0.1:6379> get mess01
"hello,you"
127.0.0.1:6379> get mess01
"hello,you"
127.0.0.1:6379> get mess01
"hello,you"
127.0.0.1:6379> get mess01
(nil)  //mess01有效期就10秒,10秒后就销毁
127.0.0.1:6379>
  • mset[同时设置一个或多个key-value对]

​ MSET key vlaue [key value …]

​ 同时设置一个或多个key-value对

​ 如果某个给定key值已经存在,那么MSET会用新值覆盖原来的旧值

127.0.0.1:6379> mset worker01 tom worker02 scott
OK
127.0.0.1:6379> get worker01
"tom"
127.0.0.1:6379> get worker02
"scott"
127.0.0.1:6379> mget worker01 worker02
1) "tom"
2) "scott"
3)Hash

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

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

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

举例。存放一个User信息

user1 name  张三 age 10
说明
key : user1
name 张三 和 age 30 就是两对 field-value

实操:演示添加user的信息案例(name age job)

127.0.0.1:6379> hset user1 name "smith"
(integer) 1
127.0.0.1:6379> hset user1 age 30
(integer) 1
127.0.0.1:6379> hset user1 job "golang coder"
(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 job
"golang coder"
127.0.0.1:6379>

Hash使用细节和注意事项

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

127.0.0.1:6379> hmset user2 name jerry age 110 job "java coder"
OK
127.0.0.1:6379> hmget user2 name age job
1) "jerry"
2) "110"
3) "java coder"
127.0.0.1:6379>

hlen统计一个hash有几个元素

127.0.0.1:6379> hlen user2
(integer) 3
127.0.0.1:6379>

hexists key field

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

127.0.0.1:6379> hexists user2 name
(integer) 1
127.0.0.1:6379>
4)List

-1.(列表)-介绍

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

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

举例,存放多个地址信息

city 北京 天津 上海
说明
北京 天津 上海 就是三个元素
127.0.0.1:6379> lpush city beijing shanghai tianjing
(integer) 3
127.0.0.1:6379> lrange city 0 -1(0表示开头 -1表示尾部)
1) "tianjing"
2) "shanghai"
3) "beijing"
127.0.0.1:6379>

-2.关于list的基本命令介绍

lpush:从左边插入数据

rpush:从右边插入数据

lrange: 用法 lrange key start stop :返回列表key中指定区间内的元素,区间以偏移量start和stop指定,下标(index)参数start和stop都是以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。你也可以使用函数负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推

lpop :从我们列表的左边弹出一个数据

rpop :从我们列表的右边弹出一个数据

del : 删掉这个列表

实战演示

127.0.0.1:6379> lpush herolist aa bb cc
(integer) 3
127.0.0.1:6379> lrange herolist 0 -1
1) "cc"
2) "bb"
3) "aa"
127.0.0.1:6379> rpush herolist dd eee
(integer) 5
127.0.0.1:6379> lrange herolist 0 -1
1) "cc"
2) "bb"
3) "aa"
4) "dd"
5) "eee"
127.0.0.1:6379> lpop herolist
"cc"
127.0.0.1:6379> lrange herolist 0 -1
1) "bb"
2) "aa"
3) "dd"
4) "eee"
127.0.0.1:6379> rpop herolist
"eee"
127.0.0.1:6379> lrange herolist 0 -1
1) "bb"
2) "aa"
3) "dd"
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> 

-3.List-使用细节和注意事项

(1)index,按照索引下标获得元素(从左到右,编号从0开始)

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

(3)List的其他说明

  • List数据,可以从左或者右,插入添加
  • 如果值全移除,对应的键也就消失了
5)Set

(集合)-介绍

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

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

举例,存放多个邮件列表信息

email sggg@sohu.com tom@sohu.com
说明
key :email
sggg@sohu.com tom@sohu.com 这两个就是元素

关于set的基本命令

sadd :添加元素

smembers :取出所有值

sismember :判断是否存在该成员

srem :删除指定值

127.0.0.1:6379> sadd emails tom@sohu.com jack@qq.com
(integer) 2
127.0.0.1:6379> smembers emails
1) "tom@sohu.com"
2) "jack@qq.com"
127.0.0.1:6379> sadd emails kk@yy.com uu@qq.com
(integer) 2
127.0.0.1:6379> smembers emails
1) "uu@qq.com"
2) "tom@sohu.com"
3) "jack@qq.com"
4) "kk@yy.com"
127.0.0.1:6379> sadd emails jack@qq.com
(integer) 0  //0表示添加失败,因为set的元素是不可以重复的
127.0.0.1:6379> sismember emails tom@sohu.com
(integer) 1 //查看set里面是否含有tom@souhu.com这个元素 1代表存在 0代表不存在
127.0.0.1:6379> sismember emails tom~@sohu.com
(integer) 0
127.0.0.1:6379> srem emails tom@sohu.com
(integer) 1 //演示删除元素
127.0.0.1:6379> smembers emails
1) "kk@yy.com"
2) "uu@qq.com"
3) "jack@qq.com"
127.0.0.1:6379>

二、go操作redis

1、安装第三方开源的redis库

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

2)在使用redis前,先安装第三方Redis库,在GOPATH路径下执行安装指令:

D:\myfile\go\project>go get github.com/garyburd/redigo/redis

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

在这里插入图片描述

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

2、使用go语言开始进行操作

Set/Get接口

1)操作string

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

package main
import (
	"fmt"
	"github.com/garyburd/redigo/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毛毛和老鼠")
	if 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("Get err=",err)
		return
	}

	//返回的r是interfacce{}
	//因为name对应的值是字符串,因此我们需要转换[在一开始就用redis提供的方法进行转换]
	//nameString := r.(string) erro


	fmt.Println("操作成功!",r) //操作成功! tomjerry毛毛和老鼠
}
2)操作hash

说明:通过Golang对redis操作Hash数据类型

package main
import (
	"fmt"
	"github.com/garyburd/redigo/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
	}
	//写入age
	_, err=conn.Do("HSet","user01","age",10)
	if err != nil {
		fmt.Println("hset err=",err)
		return
	}

	//3.通过go向redis读入数据string [key-val]
	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,r2=%v\n",r1,r2) //操作成功! r1=john,r2=10
}
3)批量操作Set/Get数据

说明:通过Golang对Redis操作,一次操作可以Set/Get多个key-val数

package main
import (
	"fmt"
	"github.com/garyburd/redigo/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("HMSet","user02","name","tom","age",19)
	if err != nil {
		fmt.Println("HMSet err=",err)
		return
	}

	//3.通过go向redis读入数据string [key-val]
	r, err :=redis.Strings(conn.Do("HMGet","user02","name","age"))
	if err != nil {
		fmt.Println("hGet err=",err)
		return
	}
	// fmt.Printf("r=%v\n",r) //r=[tom 19]
	for i,v := range r {
		fmt.Printf("r[%d]=%v\n",i,v)
	}

}
4)给数据设置有效时间

说明:通过golang对redis操作,给key-value设置有效时间

core code

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

5)操作List

说明:通过golang对redis操作list数据类型

corecode

_,err=c.Do("lpush","herolist","no1.宋江",30,"no2.吴用",28)
5)课堂练习

在这里插入图片描述

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


func main() {
	var names string
	var ages int
	var skills string


	//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() //关闭

	fmt.Println("请输入names: ")
	fmt.Scan(&names)
	fmt.Println("请输入ages: ")
	fmt.Scan(&ages)
	fmt.Println("请输入skills: ")
	fmt.Scan(&skills)
	//go操作redis进行写的操作
	_, err=conn.Do("HMSet","monster","name",names,"age",ages,"skill",skills)
	if err != nil {
		fmt.Println("HMSet err=",err)
		return
	}
    //go操作redis进行读的操作
	r, err :=redis.Strings(conn.Do("HMGet","monster","name","age","skill"))
	if err != nil {
		fmt.Println("HMGet err=",err)
		return
	}

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

 fmt.Println("操作完成")

}
6)Redis连接池

说明:通过Golang对redis的操作,还可以通过redis连接池,流程如下

-1.事先初始化一定数量的连接,放入到连接池

-2.当go需要操作redis时,直接从redis连接池取出连接即可

-3.这样可以节省临时获取redis连接的时间,从而提高效率

core code

var pool *redis.Pool
pool = &redis.Pool{
   MaxIdle:8
   MaxActive:0
   IdleTimeout:100
   Dial:func()(redis.Conn,error){
   	return redis.Dial("tcp","localhost:6379")
   },
}
c :=pool.Get()

-4.示意图

在这里插入图片描述

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
			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)


}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1316673.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入解析 Spring 和 Spring Boot 的区别

目录 引言 1. 设计理念 1.1 Spring 框架的设计理念 1.2 Spring Boot 的设计理念 2. 项目配置 2.1 Spring 框架的项目配置 2.2 Spring Boot 的项目配置 3. 自动配置 3.1 Spring 框架的自动配置 3.2 Spring Boot 的自动配置 4. 微服务支持 4.1 Spring 框架的微服务支持…

C# WPF上位机开发(加密和解密)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在报文传输的过程中,根据报文传输的形态,有两种形式,一种是明文传输,一种是加密传输。当然明文传输…

基于单片机的太阳能数据采集系统(论文+源码)

1. 系统设计 在本次太阳能数据采集系统的设计中,以AT89C52单片机为主要核心,主要是由LCD液晶显示模块、存储模块、温度检测模块、串口通信模块,光照检测模块等组成,其实现了对太阳能板的温度,光照强度的检测和记录&…

【Qt开发流程】之UDP

概述 UDP (User Datagram Protocol)是一种简单的传输层协议。与TCP不同,UDP不提供可靠的数据传输和错误检测机制。UDP主要用于那些对实时性要求较高、对数据传输可靠性要求较低的应用,如音频、视频、实时游戏等。 UDP使用无连接的数据报传输模式。在传…

2机5节点系统潮流MATLAB仿真

微❤关注“电气仔推送”获得资料(专享优惠) 电力系统潮流计算是电力系统最基本的计算,也是最重要的计算。所谓潮流计算,就是已知电网的接线方式与参数及运行条件,计算电力系统稳态运行各母线电压、各支路电流、功率及…

AntDesignBlazor示例——分页查询

本示例是AntDesign Blazor的入门示例,在学习的同时分享出来,以供新手参考。 示例代码仓库:https://gitee.com/known/BlazorDemo 1. 学习目标 分页查询框架天气数据分页功能表格自定义分页 2. 创建分页查询框架 Table组件分页默认为前端分…

《科技风》期刊发表投稿方式、收稿方向

《科技风》杂志是经国家新闻出版总署批准,河北省科学技术协会主管,河北省科技咨询服务中心主办的国内公开发行的大型综合类科技期刊。 该刊集科技性、前瞻性、创新性和专业性于一体,始终以“把脉科技创新 引领发展风尚”为办刊宗旨&#xff…

回归预测 | MATLAB实现NGO-SCN北方苍鹰算法优化随机配置网络的数据回归预测 (多指标,多图)

回归预测 | MATLAB实现NGO-SCN北方苍鹰算法优化随机配置网络的数据回归预测 (多指标,多图) 目录 回归预测 | MATLAB实现NGO-SCN北方苍鹰算法优化随机配置网络的数据回归预测 (多指标,多图)效果一览基本介绍…

crmeb v5新增一个功能的完整示例记录

首先,需求 工作中的二开需求是这样的,修改首页的装修,并新增回收报价的功能 开始动手 第一步,我们要到后面的管理界面,去装修中修改首面的展示 首页的页面配置好之后,就要在 前端的展示程序中 配置相…

【音视频 | H.264】H.264视频编码及NALU详解

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

ChatGPT在指尖跳舞: open-interpreter实现本地数据采集、处理一条龙

原文:ChatGPT在指尖跳舞: open-interpreter实现本地数据采集、处理一条龙 - 知乎 目录 收起 Part1 前言 Part2 Open - Interpreter 简介 Part3 安装与运行 Part4 工作场景 1获取网页内容 2 pdf 文件批量转换 3 excel 文件合并 Part5总结 参考资料 往期推…

nodejs+vue+微信小程序+python+PHP校园二手交易系统的设计与实现-计算机毕业设计推荐

(2)管理员 进行维护,以及平台的后台管理工作都依靠管理员,其可以对信息进行管理。需具备功能有;首页、个人中心、学生管理、物品分类管理、物品信息管理、心愿贴、系统管理、订单管理等功能。系统分成管理员控制模块和学生模块。 本系统有良好…

极坐标下的牛拉法潮流计算39节点MATLAB程序

微❤关注“电气仔推送”获得资料(专享优惠) 潮流计算: 潮流计算是根据给定的电网结构、参数和发电机、负荷等元件的运行条件,确定电力系统各部分稳态运行状态参数的计算。通常给定的运行条件有系统中各电源和负荷点的功率、枢纽…

飞翔的鸟。

一.准备工作 首先创建一个新的Java项目命名为“飞翔的鸟”,并在src中创建一个包命名为“com.qiku.bird",在这个包内分别创建4个类命名为“Bird”、“BirdGame”、“Column”、“Ground”,并向需要的图片素材导入到包内。 二.代码呈现 pa…

Flask学习三:模型操作

ORM flask 通过Model操作数据库,不管你的数据库是MySQL还是Sqlite,flask自动帮你生成相应数据库类型的sql语句,所以不需要关注sql语句和类型,对数据的操作flask帮我们自动完成,只需要会写Model就可以了 flask使用对象关…

105基于matlab的阶次分析算法

基于matlab的阶次分析算法,用于变转速机械故障特征提取,可运行,包含寻找脉冲时刻,等角度时刻。数据可更换自己的,程序已调通,可直接运行。 105阶次分析变转速信号处理 (xiaohongshu.com)

Java 基础学习(十一)File类与I/O操作

1 File类 1.1 File类概述 1.1.1 什么是File类 File是java.io包下作为文件和目录的类。File类定义了一些与平台无关的方法来操作文件,通过调用File类中的方法可以得到文件和目录的描述信息,包括名称、所在路径、读写性和长度等,还可以对文件…

『K8S 入门』二:深入 Pod

『K8S 入门』二:深入 Pod 一、基础命令 获取所有 Pod kubectl get pods2. 获取 deploy kubectl get deploy3. 删除 deploy,这时候相应的 pod 就没了 kubectl delete deploy nginx4. 虽然删掉了 Pod,但是这是时候还有 service&#xff0c…

时序预测 | Python实现CNN-LSTM电力需求预测

时序预测 | Python实现CNN-LSTM电力需求预测 目录 时序预测 | Python实现CNN-LSTM电力需求预测预测效果基本描述程序设计参考资料预测效果 基本描述 该数据集因其每小时的用电量数据以及 TSO 对消耗和定价的相应预测而值得注意,从而可以将预期预测与当前最先进的行业预测进行比…

C语言:猜数字游戏

#include<stdio.h> #include<time.h> #include<stdlib.h> void menu() {printf("********************************\n");printf("****** 1.开始 2.退出 ******\n");printf("********************************\n"); } voi…