海量用户通讯系统-Redis 添加用户|学习笔记

简介: 快速学习海量用户通讯系统-Redis 添加用户

开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:海量用户通讯系统-Redis 添加用户】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/626/detail/9808


海量用户通讯系统-Redis 添加用户

 

内容简介

一、流程图

二、相关代码

 

一、流程图

image.png

1.processor.go(总的处理器)

(1)根据客户端的请求,调用对应的处理器,完成相应的任务

2.smsProcess.go

(1)处理和短消息相关的请求

(2)群聊,

(3)点对点聊天

3.userProcess.go

(1)处理和用户相关的请求.

(2)登录

(3)注册

(4)注销

(5)用户列表管理

4.model[数据]

user.go

(1)定义一个User结构体

userDao.go

(1)dao: data accessobject

(2)编写对User对象(实例)操作的各种方法。主要就是增删改查.

error.go

(1)自定义错误

Ridis的连接池redis.go

Redis

use----》

100

用户信息str

200

用户信息str

经典项目-海量用户即时通讯系统

实现功能完成用户登录

在Redis手 动添加测试用户,并画图+说明注意(后面通过程序注册用户)

如输入的用户名密码正确在Redis中存在则赛录,否则退出系统,并给出相应的提示信息:

用户不存在或密码错误

你也可以重新注册,再查录

 

二、相关代码

package model

import

"errors"

moddl/

)

//自定义登录或注册是的错误

var (

ErruserNotExist . errors.New(" user not exist)

ErrXnvlidPasswderrors.New("passwd or .

ErruserExisterrors.New( user exist )

)

package model

//一个用户信息的结构体

type  user  struct  {

userId int" json:“userId"

username string' json: "userName"'

userPud string 'Json:'userPwd'''

var pool redis.Pool

func 1n1tRed1s(addr string, idleConn, naxConn int,sdleTineout time .Duration) {

pool . &redis Pool(

MaxIdle: idleConn,

MaxActive: maxConn,

IdleTineout: idleTimeout,

Dial: func() (redis.Conn, error) (

return redis.D1al("tcp". addr)

}

}

}

func snituserDao() {

model.MyUserDao . nodel.MenUserDao(pool)

func msin()

1/在服务器墙链接到Redis

initredis("localhost:6379" 16, 1024, time*Second 300)

InituserDao()

var (

MyUserDao userDao

)

type UserDao struct (

pool "redis.Pool

}

func NenUserDao(pool redis.Pool)

(userDao *UserDao) (userDao *userDao) {

pool: pool,

}

return

}

func (ud QuserDao) Eetuser(conn redis.Conn,

id int) user User err error) {

result, err : redls.String(conn.Do("MGet", "users", 1d))10err1n11(

if  err redis.EcrN1 {

}

err=ErruserNotExist

}

return

err =Json.unmarsnas joyte(resur), user)

if  err  1=n11(

return

}

return

func (ud *userDao) Login(id int,

passad string) (user user, err error) {

conn :m ud.pool.Get()

defer conn.close()

user, err . ud. etuser(conn, 1d)

iferr1=n1l{

return

}

user.userPad 1.=passad {

err=ErrInvalidPassad

return

}

return

}

fmt Println("\tlt\t请选择(1-3):")

fmt.scanf(”%d\n", &key)

switch key {

case 1:

fmt . Println("登陆聊天室")

fmt . Print1n("请输入用户的id")

fmt. Scanf("%d\n", &userId)

fmt. Printhn(请输入用户的密码”)

fmt . Scanf("%s\n",&userPwd)

//完成登录

//1.创建一个 userProcess 的实例

up := &process userProcess{}

up.LoginKuserId, userPwd)

cast 2 :

fmt .Printin(在册用户)

//loop = false

case 3 :

fmt.Println("退出系统")

//loop = false

os . Exit(0)

default :

fnt.Pprintln("你的输入有误,请重新输入“)

}

useProcess.go

)

type UserProcess struct {

/暂时不需要字段. .

}

//给关联一个用户登录的方法

//写一个函数, 完成登录

func (this *userProcess) Login(userId int, userPwd string) (err error) {

//下一个就要开始定协议..

// fmt.Printf(" userId = %d userPwd=%s\n", userId, userPwd)

/ return ni1

//1.链接到服务器

conn, err := net.Dial("tcp", "localhost:8889")

if  err!=nil{

fmt.PrintIn("net.Dial err=", err)

return

//延时关闭

defer conn. close()

//2.准备通过 conn 发送消息给服务

var mes message Message

mes.Type = message.LoginMesType

//3. 创建一个 LoginMes 结构体

var loginMes message LoginMesloginMes UserId : userId

loginMes UsqrPwd . userPwd

//4. #loginMes 序列化

data, err := json.Marshal(loginMes)iferrl=nilf

fnt.Println("json.Marshal err=", err)return

//创建一个 Transfer 实例

tf := &utils. Transfer{

Conn : conn,

}

mes, err = tf.Readpkg()

// mes 就是

// 5. Jedatalta mes Data7Emes.Data = string(data)

//6.将mes进行序列化化

data, err ! = json.Marshal(mes)

iferrl=nilf

fnt. Println("json.Marshal err=", err)return

17.到这个时候data就是我们要发送的消息

11 7.1 先把 data 的长度发送给服务器

//先获取到 data 的长度->转成-个表示长度的 byte 切片

var pkgLen uint32

//先获取到data的 长度->转成一个表示长度的byte切片

var pkgLen uint32

pkgLen . uint32(1en(data))

var buf [4]byte

binary.B1gEnd an.PutUint32(buf[0:4), pkgLen)

//发送长度

n, err :. conn.Nrite(buf[:4])

ifn!=4 || err!=nil{

fmt.Println("conn.write(bytes) fail", err)

return

}

//fmt. Printf("客服端,发送消息的程度=%d 内容=%s", len(data), string(data))

//发送消息本身

err . conn.Mrite(dat)

If err l-nil l

fmt.Println("conn.rite(data) fall", err)

return

}

//休眠20

//time. sleep(20 . time.Second)

//fmt.Println("休眠了20..")

//这里还需要处理服务器端返回的消息。

//创建一个Transfer实例

tf := &utils. Transfer{

Conn : conn,

}

mes, err = tf.Readpkg() // mes就是

在Redis手动添加测试用户,并画图+说明注意后面通过程序注册用户)

127.0.0.1:6379>hget users 100

"{\"userId\":100\"userPvd":\ "123456 ", \"userName\":\"\"}"

127 0.0.1:6379) hset users 100 "{\"ues"userId":100. "userPwd":'123456":\"userName"a'scatt\"}"

0

127.0.0.1:6379> hget users 100

"{\"userld":100, userPvd"Ev"123456"\ "userNane "a"scott\") "

127.0.0.1:63797>

相关文章
|
11月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
1021 6
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
445 6
|
JSON NoSQL Redis
在Rocky9系统上安装并使用redis-dump和redis-load命令的指南
以上步骤是在Rocky9上使用redis-dump和redis-load命令顺利出行的秘籍。如果在实行的过程中,发现了新的冒险和挑战,那么就像一个勇敢的航海家,本着探索未知的决心,解决问题并前进。
547 14
|
机器学习/深度学习 数据采集 人机交互
springboot+redis互联网医院智能导诊系统源码,基于医疗大模型、知识图谱、人机交互方式实现
智能导诊系统基于医疗大模型、知识图谱与人机交互技术,解决患者“知症不知病”“挂错号”等问题。通过多模态交互(语音、文字、图片等)收集病情信息,结合医学知识图谱和深度推理,实现精准的科室推荐和分级诊疗引导。系统支持基于规则模板和数据模型两种开发原理:前者依赖人工设定症状-科室规则,后者通过机器学习或深度学习分析问诊数据。其特点包括快速病情收集、智能病症关联推理、最佳就医推荐、分级导流以及与院内平台联动,提升患者就诊效率和服务体验。技术架构采用 SpringBoot+Redis+MyBatis Plus+MySQL+RocketMQ,确保高效稳定运行。
1016 0
|
NoSQL 数据可视化 Linux
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
本文介绍了Redis的两个可视化管理工具:付费的Redis Desktop Manager和免费的Another Redis DeskTop Manager,包括它们的下载、安装和使用方法,以及在使用Another Redis DeskTop Manager连接Redis时可能遇到的问题和解决方案。
2208 1
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
|
存储 NoSQL Redis
投行系统的毫秒级榜单响应:如何用Redis ZSET破解同分排序难题?
通过Redis的ZSET数据结构和更新时间戳,解决投行交易系统实时排行榜中同分跳变的问题。具体方案为:将交易量作为整数部分,更新时间戳作为小数部分,确保同分时按最新更新排序,实现实时、高效、无需应用层干预的排行榜功能。一句话总结:通过Redis ZSET加更新时间戳,解决百万交易排行榜实时显示及同分难题。
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
587 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
NoSQL Linux Redis
Docker学习二(Centos):Docker安装并运行redis(成功运行)
这篇文章介绍了在CentOS系统上使用Docker安装并运行Redis数据库的详细步骤,包括拉取Redis镜像、创建挂载目录、下载配置文件、修改配置以及使用Docker命令运行Redis容器,并检查运行状态和使用Navicat连接Redis。
1916 3
|
存储 Prometheus NoSQL
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
353 3
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
620 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。