第1.3 连接基础服务:连接数据服务 缓存

111 阅读4分钟
如果没有设置障碍,可以对有抱负的人才和行业说,“到目前为止,这是可以到达的最远地方”。

1.3.0 下载安装

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

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

1.3.0.1 缓存简介

那么缓存解决什么类型的问题?开发人员在使用时应注意什么它? 什么是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 不是那种 一个结构满足 所有需求 的解决方案。

1.3.1 安装后

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

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

1.3.2 维持连接和处理消息

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

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

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

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

	type Message struct {
		Id   string
		Text string
	}

1.3.3 完成存取操作

由之前的所知,我们使用的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)

	}

1.3.4 退出链接

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

   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
            

小结

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

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

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

有兴趣的查看本文代码。

 https://github.com/hahamx/examples/blob/main/tcps/3_with_tcp_service/tcp_receiver.go