在应用中使用缓存服务

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
可观测可视化 Grafana 版,10个用户账号 1个月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 【6月更文挑战第24天】本文介绍redis缓存的基本知识和使用。Redis超越简单的键值存储,Redis查询直接针对键,不支持复杂查询,适合特定场景的高性能缓存。用于减少数据库交互,优化性能。并提供练习源码查阅。

简介

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

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

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

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

它提供五种数据结构分别是:String、List、Hash、Set和Sorted Set。它在内存中存储数据并持久化到磁盘。
安装后,通过命令如SETGET操作键值。连接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
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
30天前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
58 0
|
3天前
|
机器学习/深度学习 缓存 NoSQL
深度学习在图像识别中的应用与挑战后端开发中的数据缓存策略
本文深入探讨了深度学习技术在图像识别领域的应用,包括卷积神经网络(CNN)的原理、常见模型如ResNet和VGG的介绍,以及这些模型在实际应用中的表现。同时,文章也讨论了数据增强、模型集成等改进性能的方法,并指出了当前面临的计算资源需求高、数据隐私等挑战。通过综合分析,本文旨在为深度学习在图像识别中的进一步研究和应用提供参考。 本文探讨了后端开发中数据缓存的重要性和实现方法,通过具体案例解析Redis在实际应用中的使用。首先介绍了缓存的基本概念及其在后端系统性能优化中的作用;接着详细讲解了Redis的常见数据类型和应用场景;最后通过一个实际项目展示了如何在Django框架中集成Redis,
|
15天前
|
缓存 JavaScript 中间件
优化Express.js应用程序性能:缓存策略、请求压缩和路由匹配
在开发Express.js应用时,采用合理的缓存策略、请求压缩及优化路由匹配可大幅提升性能。本文介绍如何利用`express.static`实现缓存、`compression`中间件压缩响应数据,并通过精确匹配、模块化路由及参数化路由提高路由处理效率,从而打造高效应用。
50 5
|
25天前
|
存储 缓存 前端开发
缓存技术在软件开发中的应用与优化策略
缓存技术在软件开发中的应用与优化策略
|
1月前
|
缓存 算法 前端开发
深入理解缓存淘汰策略:LRU和LFU算法的解析与应用
【8月更文挑战第25天】在计算机科学领域,高效管理资源对于提升系统性能至关重要。内存缓存作为一种加速数据读取的有效方法,其管理策略直接影响整体性能。本文重点介绍两种常用的缓存淘汰算法:LRU(最近最少使用)和LFU(最不经常使用)。LRU算法依据数据最近是否被访问来进行淘汰决策;而LFU算法则根据数据的访问频率做出判断。这两种算法各有特点,适用于不同的应用场景。通过深入分析这两种算法的原理、实现方式及适用场景,本文旨在帮助开发者更好地理解缓存管理机制,从而在实际应用中作出更合理的选择,有效提升系统性能和用户体验。
73 1
|
28天前
|
开发工具 Android开发 iOS开发
从零开始学 Xamarin 开发,新手教程全攻略,安装环境、创建项目、设计界面,轻松开启开发之旅!
【8月更文挑战第31天】Xamarin是一种高效的跨平台移动应用开发工具,迎合了日益增长的移动应用需求。本文为Xamarin新手提供了一套详尽的入门指南,涵盖开发环境搭建、项目创建与配置、用户界面设计及功能实现等关键步骤。通过具体示例,帮助初学者快速上手Xamarin开发,开启移动应用创作之旅。
27 0
|
28天前
|
存储 缓存 NoSQL
【性能飙升的秘密】FastAPI应用如何借助缓存技术实现极速响应?揭秘高效Web开发的制胜法宝!
【8月更文挑战第31天】FastAPI是一个高性能Web框架,利用Starlette和Pydantic实现高效API构建。本文介绍如何通过缓存提升FastAPI应用性能,包括使用`starlette-cache[redis]`实现Redis缓存,以及缓存一致性和缓存策略的注意事项。通过具体示例展示了缓存的配置与应用,帮助开发者构建更高效的Web应用。
56 0
|
28天前
|
缓存 数据库 UED
【性能翻倍的秘密】Rails高手从不告诉你的缓存技巧,竟让应用瞬间提速,背后真相令人震惊!
【8月更文挑战第31天】缓存是提升Web应用性能的关键技术,Ruby on Rails内置了多种缓存机制,如页面缓存、动作缓存、片段缓存及数据库查询缓存,可显著减少数据库查询次数并加快页面加载速度。本文通过具体案例分析了这些缓存策略,并提供了示例代码,展示如何在实际应用中实施这些策略,帮助开发者提升用户体验。
40 0
|
1月前
|
缓存 NoSQL Go
缓存设计的好,服务基本不会倒
缓存设计的好,服务基本不会倒
|
1月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】应用中出现连接Redis服务错误(production.ERROR: Connection refused)的排查步骤
【Azure Redis 缓存】应用中出现连接Redis服务错误(production.ERROR: Connection refused)的排查步骤