Redis 使用小记

Redis提供了五种主要的数据结构,每种都有其特定的用途和一系列操作。以下是每种数据结构及其常见操作的概述:

  1. String(字符串):

    • 基本操作: SET, GET, DEL 等。
    • 用于存储文本或二进制数据。
    • 支持的操作包括设置、获取、删除字符串值,以及更复杂的操作如追加(APPEND), 截取(GETRANGE), 和设置带过期时间的值(SETEX)。
  2. List(列表):

    • 基本操作: LPUSH, RPUSH, LPOP, RPOP 等。
    • 用于存储有序的字符串序列。
    • 支持的操作包括从列表两端推入或弹出元素,访问或修改特定索引的元素(LINDEX, LSET),以及截取列表的一部分(LRANGE)。
  3. Set(集合):

    • 基本操作: SADD, SREM, SMEMBERS, SISMEMBER 等。
    • 用于存储无序且唯一的字符串集合。
    • 支持的操作包括添加、删除元素,检查元素是否存在,以及执行集合间的运算如并集(SUNION), 交集(SINTER), 差集(SDIFF)。
  4. Sorted Set(有序集合):

    • 基本操作: ZADD, ZREM, ZRANGE, ZREVRANGE 等。
    • 类似于集合,但每个元素都关联了一个分数,用于排序。
    • 支持的操作包括添加、删除元素,根据分数或字典序获取元素范围,以及计算排名(ZRANK, ZREVRANK)。
  5. Hash(哈希表):

    • 基本操作: HSET, HGET, HDEL, HMGET 等。
    • 用于存储键值对集合,类似于Java中的Map
    • 支持的操作包括添加、获取、删除键值对,以及获取所有键(HKEYS)或值(HVALS)。

每种数据结构都设计有丰富的命令来满足不同的应用场景需求。例如,您可以使用字符串来存储简单的键值对,使用列表来实现队列或栈,使用集合来处理不重复的元素集,使用有序集合来维护一个按分数排序的元素集,或者使用哈希表来存储对象的多个字段和值。

在Redis中,哈希(Hash)和字符串(String)是两种基本的数据结构,它们各自有不同的性能特点和适用场景。

字符串是最基本的数据类型,可以存储文本、数字或二进制数据。它的操作通常很简单,如设置(SET)、获取(GET)和删除(DEL)。字符串适合存储单个的大型数据对象或简单的键值对。

哈希则类似于关联数组或字典,可以存储多个字段和对应的值。哈希表适合存储对象的属性或配置信息,支持对每个字段进行单独的操作,如添加(HSET)、获取(HGET)和删除(HDEL)。

性能方面,对于小型对象,RAM的速度和内存带宽对全局性能的影响不太明显。但是,对于大型对象(大于10KB),这种影响可能会变得明显。哈希在内存使用上通常比字符串更加高效,尤其是当你可以利用特殊编码时。例如,当哈希、列表、集合由纯整数组成,并且元素数量小于一定数目时,Redis会使用一种非常内存高效的编码方式,这可以节省多达10倍的内存(平均节省5倍内存)。

然而,这并不是没有代价的,因为ziplist(一种用于小型哈希、列表和有序集合的内部编码方式)在CPU使用上可能会有所折衷。此外,你不能部分地让哈希字段过期,而字符串可以单独设置过期时间。

总的来说,如果你需要存储和操作多个键值对,并且需要对单独的键/值对执行操作,那么哈希可能是更好的选择。但是,如果你只需要简单地存储一个大的字符串或二进制数据,那么字符串可能更合适。在实际应用中,最好根据具体需求进行基准测试,以确定哪种数据结构更适合你的用例123。

为了使用Go语言实现染色配置的增删改查功能,我们可以设计一个RESTful API服务。以下是一个可能的项目目录结构和文件设计:

dyeConfigService/
|-- cmd
|   |-- main.go
|-- internal
|   |-- handler
|   |   |-- handler.go
|   |-- service
|   |   |-- service.go
|   |-- repository
|   |   |-- repository.go
|-- pkg
|   |-- redisclient
|   |   |-- redisclient.go
|-- go.mod
|-- go.sum

在这个结构中:

  • cmd/main.go 是程序的入口点,它启动HTTP服务器。
  • internal/handler/handler.go 包含处理HTTP请求和响应的逻辑。
  • internal/service/service.go 包含业务逻辑,它调用repository层。
  • internal/repository/repository.go 包含与Redis交互的逻辑。
  • pkg/redisclient/redisclient.go 包含初始化Redis客户端的代码。
  • go.modgo.sum 是Go的模块依赖文件。

现在,让我们来看一下handler.go中处理HTTP请求的代码示例:

package handlerimport ("encoding/json""net/http""dyeConfigService/internal/service"
)type Handler struct {Service *service.Service
}func NewHandler(s *service.Service) *Handler {return &Handler{Service: s}
}func (h *Handler) GetDyeConfig(w http.ResponseWriter, r *http.Request) {// 解析HTTP参数userID := r.URL.Query().Get("userid")adPosID := r.URL.Query().Get("adposid")adID := r.URL.Query().Get("adid")// 调用service方法config, err := h.Service.GetDyeConfig(userID, adPosID, adID)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}// 序列化JSONjsonResponse, err := json.Marshal(config)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}// 返回响应w.Header().Set("Content-Type", "application/json")w.WriteHeader(http.StatusOK)w.Write(jsonResponse)
}// 其他的增删改方法类似...

service.go中,我们可以定义业务逻辑:

package serviceimport ("dyeConfigService/internal/repository"
)type Service struct {Repo *repository.Repository
}func NewService(r *repository.Repository) *Service {return &Service{Repo: r}
}func (s *Service) GetDyeConfig(userID, adPosID, adID string) (*DyeConfig, error) {// 访问Redisreturn s.Repo.GetDyeConfig(userID, adPosID, adID)
}// 其他的增删改方法类似...

repository.go中,我们定义与Redis交互的代码:

package repositoryimport ("dyeConfigService/pkg/redisclient"
)type Repository struct {Redis *redisclient.Client
}func NewRepository(redis *redisclient.Client) *Repository {return &Repository{Redis: redis}
}func (r *Repository) GetDyeConfig(userID, adPosID, adID string) (*DyeConfig, error) {// 构建keykey := buildKey(userID, adPosID, adID)// 从Redis获取数据data, err := r.Redis.Get(key).Result()if err != nil {return nil, err}// 解析数据var config DyeConfigerr = json.Unmarshal([]byte(data), &config)if err != nil {return nil, err}return &config, nil
}func buildKey(userID, adPosID, adID string) string {// 根据参数构建key// ...
}// 其他的增删改方法类似...

最后,在main.go中,我们初始化服务并启动HTTP服务器:

package mainimport ("dyeConfigService/internal/handler""dyeConfigService/internal/repository""dyeConfigService/internal/service""dyeConfigService/pkg/redisclient""net/http"
)func main() {// 初始化Redis客户端redis := redisclient.NewClient()// 初始化repositoryrepo := repository.NewRepository(redis)// 初始化servicesvc := service.NewService(repo)// 初始化handlerhdl := handler.NewHandler(svc)// 设置路由http.HandleFunc("/dyeconfig", hdl.GetDyeConfig)// 其他路由...// 启动HTTP服务器http.ListenAndServe(":8080", nil)
}

这只是一个简单的示例,实际项目中可能需要更多的错误处理、日志记录、配置管理等。此外,还需要添加身份验证、授权和其他中间件来保护API。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/821391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再谈癌症基础与转化研究中的大数据科学

再谈癌症基础与转化研究中的大数据科学 李升伟1 茅 矛1 陈 竺2 (1.特趣生物科技有限公司,广东省深圳市;2.上海交通大学医学院附属 瑞金医院,上海市) 癌症基础与转化研究中的大数据科学涵盖了从数据采集、整合、…

作为研究生应该怎么阅读文献

作为研究生,阅读文献是一个至关重要的学术活动,帮助你建立专业知识基础,了解领域内的最新研究进展,并为自己的研究找到合适的定位。下面是一些有效的文献阅读策略: 1. 确定阅读目标 初步了解:快速浏览文献…

Avalonia中嵌入网页程序(CefNet)运行在银河麒麟系统上

目录 操作系统版本项目目录结构引入Nuget包扩展一个CefNetApplication类改造App.cs文件启动类改造以及cef全局目录设置主窗口代码实现下载 cef 基础环境将cef基础环境放入Program代码里面设置的全局目录下打银河麒麟下的安装包复制安装包去银河麒麟系统上安装并看效果(完美)本文…

007 springboot整合mybatis-plus 增删改查 ajax(修改部分是) jquery 分页

文章目录 MybatisplusConfig.javaReceiveAddressJsonController.javaReceiveAddress.javaReceiveAddressMapper.javaIReceiveAddressService.javaReceiveAddressServiceImpl.javaServerResult.javaServletInitializer.javaSpringbootDemoApplication.javareceive_address.sqlRe…

国密SM2+RSA+AES+MD5加解密,验签流程,工具示例,增强版完善版(包含前后端加解密验签流程)

详见资源包 https://download.csdn.net/download/x948130516/89119461?spm1001.2014.3001.5503 前端引入依赖 使用hutool工具进行签名和验签时,前端需要传入第三个json对象参数,否则会验签失败 前端使用npm install --save sm-crypto引入依赖库 前…

ORACLE数据库版本与表名、字段名、视图名、序列名和主键最大长度的关系

在Oracle 12.1版本及之前(如Oracle 11g),建表表名的最大长度是30个字符。这个长度限制适用于所有标识符,包括表名、字段名、视图名、序列名和主键等。 如果尝试创建包含超过30个字符的表名,系统会报ORA-00972错误&…

mmap函数小实验

mmap函数小实验 文章目的参数 length 不是页大小的整数倍会怎样?研究过程length结论 参数 offset 取不同的值时会怎样?研究过程offset 结论 参考链接 文章目的 本文是为了深入理解mmap的参数length与offset对mmap函数行为的影响,从而更好地理…

反转链表【java】

给定一个链表的头节点head反转链表 方法一:循环 1.定义三个指针: pre指针:刚开始指向空 prenull cur指针:刚开始指向head节点 curhead temp指针:保存cur指针指向节点的下一个节点 2. 不断循环改变相邻两个节点的指…

Spring MVC 中的统一异常处理

文章目录 Spring MVC 中的统一异常处理Spring MVC 中跳转自定义 404 页面的两种常见方式在 web.xml 中指定自定义的 404 页面提供一个匹配 * 的 Controller 请求处理方法 使用 ExceptionHandler 注解使用 ControllerAdvice ExceptionHandler 注解使用示例控制生效的 Controlle…

JavaWeb前端/后端开发规范——接口文档概述及YApi平台的使用

前言: 整理下笔记,打好基础,daydayup!!! 接口文档 什么是接口文档? 目前主流的开发模式为前后端分离式开发,为了方便前后端的对接,就需要使用接口文件进行统一规范。 接口文档记载什么信息? 1&…

第19天:信息打点-小程序应用解包反编译动态调试抓包静态分析源码架构

第十九天 本课意义 1.如何获取到目标小程序信息 2.如何从小程序中提取资产信息 一、Web&备案信息&单位名称中发现小程序 1.国内主流小程序平台 微信 百度 支付宝 抖音头条 2.小程序结构 1.主体结构 小程序包含一个描述整体程序的app和多个描述各自页面的page …

goland2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 Goland 是一款由 JetBrains 公司开发的集成开发环境(IDE),专门用于 Go 语言的开发。它提供了丰富的功能和工具,帮助开发者更高效地编写、调试和管理 Go 语言项目。 功能特点&#x…

Milvus 老友汇|RAG 场景、电商平台、AI 平台……如何用向量数据库构建业务方案?

近日,Milvus 老友汇Arch Meetup 在深圳圆满落幕。本次 Meetup 由 Milvus 社区携手 Shopee 共同举办,同时还邀请到来自 AWS、点石科技的技术专家,分享电商行业、RAG 场景、AI 平台等如何基于向量数据库构建业务方案。 以下是本次 Meetup 的重点…

OSPF---综合实验

1、R4为ISP,其上只配置IP地址;R4与其他所直连设备间均使用公有IP; 2、R3-R5、R6、R7为MGRE环境,R3为中心站点; 3、整个OSPF环境IP基于172.16.0.0/16划分;除了R12有两个环回,其他路由器均有一个环…

Qt 实战(1)Qt 概述

一、Qt概述 1、什么是Qt? Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,也可以开发不带界面的…

HTML 入门

HTML 简介 1. 什么是 HTML? 全称:HyperText Markup Language(超文本标记语言)。 超文本:暂且简单理解为 “超级的文本”,和普通文本比,内容更丰富。 标 记:文本要变成超文本&…

java面试之线程八锁

所谓的“线程八锁”,其实就是考察 synchronized 锁住的是哪个对象 情况1:12 或 21情况2:1s后12,或 2 1s后 1情况3:3 1s 12 或 23 1s 1 或 32 1s 1情况4:2 1s 后 1情况5:2 1s 后 1情况6&#xff…

PLC扩展更自由,钡铼IOy系列模块实现DI/DO/AI/AO任意组合

随着工业自动化的不断发展,PLC(可编程逻辑控制器)作为工业控制领域的核心设备,扮演着至关重要的角色。而钡铼IOy系列模块作为PLC的重要扩展设备,不仅实现了DI(数字输入)、DO(数字输出…

nodejs读取并计算指定文件的MD5哈希值

读取并计算指定文件的MD5哈希值 /*** 读取并计算指定文件的MD5哈希值* param {string} file - 文件路径* returns {void} 不返回任何值,但会打印出文件的MD5哈希值*/ const fs require(fs); // 引入文件系统模块 const crypto require(crypto); // 引入加密模块 …

Scala之List

列表 不可变列表(List) 在Scala中,通过List来定义不可变列表,需要注意的是,List本身是一个抽象类,所以并不能直接使用List来构建对象,需要使用它的伴生对象来构建 package com.fesco.listimport scala.::object ListD…