简介
如果没有设置障碍,可以对有抱负的人才和行业说,“到目前为止,这是可以到达的最远地方”。
那么缓存解决什么类型的问题?开发人员在使用时应注意什么它? 什么是Redis。
Redis通常被描述为内存中持久键值存储。我认为这不是一个准确的描述。redis确实将所有数据保存在内存中(稍后会详细介绍),并且确实将其写到磁盘上以实现持久性,但是不仅仅是一个简单的键值存储。
重要的是要摆脱这种误解,否则您的Redis观点及其解决的问题将太狭窄。现实是Redis公开了五种不同的数据结构,其中只有一种是典型的键值结构。
它提供五种数据结构分别是:String、List、Hash、Set和Sorted Set。它在内存中存储数据并持久化到磁盘。
安装后,通过命令如SET
和GET
操作键值。连接Redis服务器,处理异步消息并维持连接。示例代码展示设置和获取字符串值。
1 下载缓存并安装
下载安装你的缓存数据库服务器适当版本 redis.io
我们将使用它,怎样自己做?
就如之前的文章所讲,我们使用基础的telnet服务即可。
2 缓存数据结构简介
了解缓存五个数据结构,它们如何工作,它们公开了哪些方法以及可以使用哪些模型进行建模它们是了解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指令。
4 维持连接和处理消息
我们需要使用异步的方式去执行它,因为可能有多个返回值,因此,让我们定义退出通道 closech,和协程管理者 wg
而返回的消息,我们都保存到 msgGroup 以待处理。
var (
wg = sync.WaitGroup{}
closech = make(chan int)
msgGroup = []Message{}
addr = "localhost:6379"
)
消息内容我们将存入Message对象
type Message struct {
Id string
Text string
}
5 完成存取操作
由之前的所知,我们使用的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)
}
6 退出链接
然后我们退出该连接即可。
func ConnTcp() {
...
select {
case <-closech:
cn.Close()
os.Exit(1)
default:
fmt.Printf("never do this.")
}
就这样。 看似一个简单的连接,存入,取出操作。 其背后是无数的心血。
一个完美的独立小应用客户端就完成了。
最后在函数入口调用它。
func main() {
ConnTcp()
}
7 执行的结果
我们指令包括两个 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
8 小结
在使用数据库是,后台程序 经常需要减少往返 数据库读写的次数,此时可以使用redis作为缓存。
有时我们需要多次访问 redis 数据库才能 获得我们想要的数据。
但是 这种成本 与原始 成本相比,微不足道。
有兴趣的查看本文代码。
https://github.com/hahamx/examples/blob/main/tcps/3_with_tcp_service/tcp_receiver.go