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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 快速学习海量用户通讯系统-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>

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
78 6
|
2月前
|
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时可能遇到的问题和解决方案。
151 1
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
|
2月前
|
NoSQL Linux Redis
Docker学习二(Centos):Docker安装并运行redis(成功运行)
这篇文章介绍了在CentOS系统上使用Docker安装并运行Redis数据库的详细步骤,包括拉取Redis镜像、创建挂载目录、下载配置文件、修改配置以及使用Docker命令运行Redis容器,并检查运行状态和使用Navicat连接Redis。
332 3
|
2月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
39 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
2月前
|
存储 Prometheus NoSQL
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
34 3
|
1月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
45 0
|
2月前
|
NoSQL 关系型数据库 MySQL
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
371 0
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
|
2月前
|
NoSQL Redis
redis学习五、错误总结,redis正常运行时后会出现一些bug 总结。
本文介绍了Redis在正常运行时可能遇到的一个错误,即无法进行磁盘持久化的问题,并提供了通过设置`stop-writes-on-bgsave-error`为`no`来解决这一问题的方案。
112 0
|
4月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
143 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
4月前
|
缓存 NoSQL 关系型数据库
Redis学习总结
Redis学习总结
41 1
下一篇
DataWorks