在框架中从零开始连接数据库和缓存

举报
码乐 发表于 2024/02/12 17:49:26 2024/02/12
【摘要】 如果没有设置障碍,可以对有抱负的人才和行业说,“到目前为止,这是可以到达的最远地方”。 1.3.0 下载安装下载安装你的缓存数据库服务器适当版本 redis.io我们将使用它,怎样自己做?就如之前的文章所讲,我们使用基础的telnet服务即可。 1.3.0.1 缓存简介那么缓存解决什么类型的问题?开发人员在使用时应注意什么它? 什么是Redis。Redis通常被描述为内存中持久键值存储。我...
如果没有设置障碍,可以对有抱负的人才和行业说,“到目前为止,这是可以到达的最远地方”。

1 下载安装

下载安装你的缓存数据库服务器适当版本 redis.io

我们将使用它,怎样自己做?
就如之前的文章所讲,我们使用基础的telnet服务即可。

2 缓存简介

那么缓存解决什么类型的问题?开发人员在使用时应注意什么它? 什么是Redis。

Redis通常被描述为内存中持久键值存储。我认为这不是一个准确的描述。redis确实将所有数据保存在内存中(稍后会详细介绍),并且确实将其写到磁盘上以实现持久性,但是不仅仅是一个简单的键值存储。

重要的是要摆脱这种误解,否则您的观点Redis及其解决的问题将太狭窄。现实是Redis公开了五种不同的数据结构,其中只有一种是典型的键值结构。

了解这五个数据结构,它们如何工作,它们公开了哪些方法以及可以使用哪些模型进行建模它们是了解Redis的关键。

不过首先,让我们集中讨论公开数据的含义结构。

	•键 是标识数据(值)的字符串
	•值 是Redis不在乎的任意字节数组
	•Redis公开(并实现为)五个专用数据结构
	•结合使用以上内容,可以使Redis快速且易于使用,但不适用于每种情况

数据库只有一种数据结构 那就是 表 tables, 表可以是 即复杂又灵活(both complex and flexible)
无法对 表 做 建模,存储或操作 (model,store, or manipulate).它们的通用性并非没有缺点

redis 不是 千篇一律的结构 a one-size-fits-all structure,
相反处理标量,列表,哈希或集合,就直接将它们存储为标量,列表,哈希和集合。

 scalars, lists, hashes, or sets

不需要如mysql一般检查 是否 存在 值 , 比调用exist(key)更复杂,或者比O(1)慢。

指令,键,值  commands, keys, values
指令 commands

查询方式 Querying

关于redis的重点,keys 是所有的重要的事,values 无关紧要,值可以是任何东西,因为redis不关注它。
redis 不允许 查询一个 对象的值。 所有 redis 无法找到 对象中的值。

相对于SQL的 灵活 查询方式,redis的查询方式 显得 原始 和 神秘。

这正好表明 redis 不是那种 一个结构满足 所有需求 的解决方案。

3 安装后

在安装并启动服务后,缓存服务在端口6379中,localhost:6379

我们将连接服务并使用SET GET指令。

3.1 维持连接和处理消息

我们需要使用异步的方式去执行它,因为可能有多个返回值,因此,让我们定义退出通道 closech,和协程管理者 wg

而返回的消息,我们都保存到 msgGroup 以待处理。

var (
	wg       = sync.WaitGroup{}
	closech  = make(chan int)
	msgGroup = []Message{}
	addr     = "localhost:6379"
)

消息内容我们将存入Message对象

	type Message struct {
		Id   string
		Text string
	}

3.2 完成存取操作

由之前的所知,我们使用的conn连接 主要有 read 和 write,close 三个主要方法

首先我们设置一个name 键,值为 jack, SET name jack

	cn.Write([]byte("SET name jack \n"))

然后我们从缓存服务中取出,GET name 是不是很简单

	cn.Write([]byte("GET name \n"))

在完成存取操作后,将关闭通道的值设置为1,

	closech <- i

完成存取操作后,查看我们的服务返回的值

   func ConnTcp() {
   	 ...

	for i, v := range msgGroup {
	fmt.Printf("i:%v, v:%v\n", i, v)

	}

3.3 退出链接

然后我们退出该连接即可。

   func ConnTcp() {
   	 ...

	select {
	case <-closech:
		cn.Close()
		os.Exit(1)
	default:
		fmt.Printf("never do this.")
	}

就这样。 看似一个简单的连接,存入,取出操作。 其背后是无数的心血。
一个完美的独立小应用客户端就完成了。

最后在函数入口调用它。

  func main() {
		ConnTcp()
	}
  • 执行的结果

    我们指令包括两个 set get

    SET name jack    # 预期返回 ok
    GET name        # 预期返回 $4 和 jack  因为 jack 为 4个字母。
    

    我们把返回的数据按顺序存入队列,并且保留了响应的时间点,效果如下

      msg of:0, txt:{M:1672559234328 +OK}
      msg of:1, txt:{M:1672559234328 $4}
      msg of:2, txt:{M:1672559234328 jack
    

4 小结

在使用数据库是,后台程序 经常需要减少往返 数据库读写的次数,此时可以使用redis作为缓存。

有时我们需要多次访问 redis 数据库才能 获得我们想要的数据。

但是 这种成本 与原始 成本相比,微不足道。

有兴趣的查看本文代码。

 https://github.com/hahamx/examples/blob/main/tcps/3_with_tcp_service/tcp_receiver.go
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。