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 handler

import (
    "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
    }

    // 序列化JSON
    jsonResponse, 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 service

import (
    "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) {
    // 访问Redis
    return s.Repo.GetDyeConfig(userID, adPosID, adID)
}

// 其他的增删改方法类似...

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

package repository

import (
    "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) {
    // 构建key
    key := buildKey(userID, adPosID, adID)
    // 从Redis获取数据
    data, err := r.Redis.Get(key).Result()
    if err != nil {
        return nil, err
    }
    // 解析数据
    var config DyeConfig
    err = 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 main

import (
    "dyeConfigService/internal/handler"
    "dyeConfigService/internal/repository"
    "dyeConfigService/internal/service"
    "dyeConfigService/pkg/redisclient"
    "net/http"
)

func main() {
    // 初始化Redis客户端
    redis := redisclient.NewClient()

    // 初始化repository
    repo := repository.NewRepository(redis)

    // 初始化service
    svc := service.NewService(repo)

    // 初始化handler
    hdl := handler.NewHandler(svc)

    // 设置路由
    http.HandleFunc("/dyeconfig", hdl.GetDyeConfig)
    // 其他路由...

    // 启动HTTP服务器
    http.ListenAndServe(":8080", nil)
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

链表拓展之双向链表

前言 在前面已经总结了单链表,有了单链表的基础会很好理解双链表的实现,忘记了可以跳转——>http://t.csdnimg.cn/GFPk9 接下来就由我带着各位看官来认识今天的主角吧~ 什么是双向链表 在单链表的基础上,它有两个方向的链接,一…

加强fou循环的坑

今天遇到了一个有趣的事情,使用加强fou循环操作list时,会报错并发操作异常。 直到看了编译类,才发现,加强fou循环其实就是通过迭代器操作: 这里就会出现一个问题,迭代器在取出值时,就回去检测这…

分析ARP解析过程

一、实验环境 主机A和主机B连接到交换机,并与一台路由器互连,如图7.17所示,路由器充当网关。 图7.17 二、需求描述 查看 ARP 相关信息,熟悉在PC 和 Cisco 设备上的常用命令,设置主机A和主机B为同一个网段网关设置为路由接口地址。 三、推…

基于Python的景区票务人脸识别系统(V2.0)

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

排列特征重要性(Permutation Feature Importance)

5个条件判断一件事情是否发生,每个条件可能性只有2种(发生或者不发生),计算每个条件对这件事情发生的影响力。排列特征重要性模型的程序。 例一 在机器学习领域,排列特征重要性(Permutation Feature Impor…

QT 串口助手 学习制作记录

QT 串口助手qt 学习制作记录 参考教程:​​​​​​QT初体验:手把手带你写一个自己的串口助手_qt设计串口助手的流程图-CSDN博客 Qt之串口编程(添加QSerialPort模块)_如何安装 qt串口模块教程-CSDN博客 串口调试助手&#xff1…

2.2 @SpringBootApplication

2.2 SpringBootApplication 在前文的介绍中,读者已经了解到SpringBootApplication注解是加在项目的启动类上的。 SpringBootApplication实际上是一个组合注解,定义如下: SpringBootConfiguration EnableAutoConfiguration ComponentScan(exc…

python-常用数据结构(2)

6、某企业为职工发放奖金:如果入职超过5年,且销售业绩超过15000元的员工,奖金比例为0.2;销售业绩超过10000元的员工,奖金比例为0.15:销售业绩超过5000元的员工,奖金比例为0.1;其他奖金比例为0.05。如果是人职不超过5年,且销售业绩超过4000的员工,奖金比例为0.045;否则为0.01。输…

使用Python模仿文件行为

在Python中,你可以通过文件操作函数(如open()函数)以及模拟输入输出流的库(如io模块)来模拟文件行为。下面是一些示例,展示了如何使用这些工具在Python中模拟文件行为。 1、问题背景 在编写一个脚本时&…

深度挖掘响应式模式的潜力,从而精准优化AI与机器学习项目的运行效能,引领技术革新潮流

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 🔥 转载自热榜文章:探索设计模式的魅力:深度挖掘响应式模式的…

基于Docker构建CI/CD工具链(六)使用Apifox进行自动化测试

添加测试接口 在Spring Boot Demo项目里实现一个简单的用户管理系统的后端功能。具体需求如下: 实现了一个RESTful API,提供了以下两个接口 : POST请求 /users:用于创建新的用户。GET请求 /users:用于获取所有用户的列…

爬取东方财富股票代码

我们打开东方财富网站&#xff1a;http://quote.eastmoney.com/stocklist.html 假如懒得爬&#xff0c;也可以用现成的股票数据源&#xff1a;https://stockapi.com.cn 这展示了所有股票信息&#xff0c;不过需要我们分页去爬取 我们可以查询具体的html代码&#xff1a; <…

微信小程序-绘制图片并分享下载(painter)

1、引入painter插件 painter官网地址 1.1 可通过官网的方法引入painter插件&#xff0c; 官方插件下载地址 1.2 可下载本文附带的插件包直接引入 1.2.1 复制下载下来的文件中的painter文件夹&#xff0c;将其放在components目录下 1.2.2 页面中引入并使用 .json {"…

边缘计算网关主要有哪些功能?-天拓四方

随着物联网&#xff08;IoT&#xff09;的快速发展和普及&#xff0c;边缘计算网关已经成为了数据处理和传输的重要枢纽。作为一种集成数据采集、协议转换、数据处理、数据聚合和远程控制等多种功能的设备&#xff0c;边缘计算网关在降低网络延迟、提高数据处理效率以及减轻云数…

hot100 -- 链表(中)

不要觉得力扣核心代码模式麻烦&#xff0c;它确实比不上ACM模式舒服&#xff0c;可以自己处理输入输出 只是你对 链表 和 return 的理解不到位 &#x1f442; ▶ 屿前世 (163.com) &#x1f442; ▶ see you tomorrow (163.com) 目录 &#x1f382;两数相加 &#x1f6a9;删…

Python 全栈体系【四阶】(二十八)

第五章 深度学习 四、TensorFlow 1. Tensorflow 简介 1.1 什么是 Tensorflow TensorFlow 由谷歌人工智能团队谷歌大脑&#xff08;Google Brain&#xff09;开发和维护的开源深度学习平台&#xff0c;是目前人工智能领域主流的开发平台&#xff0c;在全世界有着广泛的用户群…

项目升级到jdk21后 SpringBoot相关组件的适配

了解到jdk21是一个LTS版本&#xff0c;可以稳定支持协程的功能。经过调研&#xff0c;将目前线上的jdk8升级到21&#xff0c;使用协程提升并发性能。 目前系统使用springBoot 2.0.3.RELEASE&#xff0c;并且引入了mybatis-spring-boot-starter、spring-boot-starter-data-redi…

电商技术揭秘22:智能仓储与物流优化(上)

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

Hot100【十一】: 347. 前 K 个高频元素

class Solution {public int[] topKFrequent(int[] nums, int k) {// 1.建立hash表来存储每个元素以及它的频率HashMap<Integer, Integer> num2Fre new HashMap<Integer, Integer>();for (int num : nums) {num2Fre.put(num, num2Fre.getOrDefault(num, 0) 1);}/…

白盒测试-基本路径覆盖

​ 路径覆盖可以使程序中的路径都被测试到&#xff0c;但是&#xff0c;要对程序中的路径做到完全覆盖经常是无法实现的。为了解决这一难题&#xff0c;我们需要在保证测试质量的前提下把测试的路径数量压缩到一定的范围内 ​ 基本路径覆盖法是在程序控制流图的基础上&#xf…