Redis 的标准使用规范之数据类型使用规范
数据类型使用规范
提示:以下是本篇文章正文内容,可供参考
(1)、字符文本(STRING)
【建议】选型为简易文本类缓存 :比如普通的字符、文本、Json
结构 ,通常能起到加速读写和降低后端压力的作用。
【建议】计数场景:用于对数值进行增减,同样适用于分布式系统
的增量和减量计算,如下:
incr/decr key // 自增 1
incrby/decrby key increment //增加指定数值
【建议】共享 Session:在分布式系统中,用户的每次请求会访问
到不同的服务器,这就会导致 session 不同步的问题。
(2)列表(REDIS_LIST)
【建议】栈:由于列表存储的是有序字符串,满足队列的特点,也
就能满足栈先进后出的特点,使用 lpush+lpop 或者 rpush+rpop
实现栈。
【建议】有序的对象列表:列表的元素不但是有序的,而且还支持
按照索引范围获取元素。比如我们可以使用命令 lrange key 0 9
分页获取文章列表。
(3)哈希表(REDIS_HASH)
【建议】在客户端中使用 redis 提供的原生 ttl 过期策略。
如:redisson 中的 RedissonMapCache 中的 ttl 过期策略是
使用的 lua 脚本实现,在某些情况下使用会存在问题。
【建议】key、field、value 结构场景,如购物车:hset [key]
[field] [value] 命令, 可以实现以用户 Id,商品 Id 为 field,
商品数量为 value,恰好构成了购物车的 3 个要素。
【建议】对象存储场景:hash 类型的(key, field, value)的结构
与对象的(对象 id, 属性, 值)的结构相似,也可以用来存储对象。
说明:Redis 中的 Hash 和 Java 的 HashMap 更加相似,是数
组+链表的结构,当发生 hash 碰撞时将会把元素追加到链表上,
值得注意的是在 Redis 的 Hash 中 value 只能是字符串。
(4)集合(REDIS_SET)
说明:Redis 中的 Set 和 Java 中的 HashSet 类似,内部的
键值对是无序、唯一的。相当于一个特殊的字典,字典中所有的
value 默认都是一个 NULL 值。当集合中最后一个元素被移除之后,
数据结构被自动删除,内存被回收。
【建议】通用的 HashSet 集合使用场景,对于 Set 中的取值、判
断、统计,添加跟移出都有很便利的支持。
比如:社交领域的 好友、关注、粉丝、感兴趣的人等场景:
sinter 命令可以获得 A 和 B 两个用户的共同好友;
sismember 命令可以判断 A 是否是 B 的好友;
scard 命令可以获取好友数量;
关注时,smove 命令可以将 B 从 A 的粉丝集合转移到 A 的好
友集合。
【建议】Set 具备随机获取能力,建议在一些对集合值随机取数场
景使用。
类似首页展示随机:美团首页有很多推荐商家,但是并不能全
部展示,set 类型适合存放所有需要展示的内容,而 srandmember
命令则可以从中随机获取几个。
【建议】Set 具备 Single 能力,建议在一些对集合值需要去重的
场景中使用。
类似存储某活动中中奖的用户 ID,因为有去重功能,可以保
证同一个用户不会中奖两次。
(5)有序集合(REDIS_ZSET)
说明:zset 也叫 SortedSet,一方面保证了内部 value 的唯
一性,另方面它可以给每个 value 赋予一个 score,代表这个
value 的排序权重,所以又具备排序功能。
【建议】过期提醒、删除等场景,比如:存的时候将 score 设置成
当时的时间戳。再跑个定时任务来处理大于某个时间戳的成员,提
醒或者清除掉。
【建议】带排序条件的列表集合,比如排行榜场景,但是和 list
不同的是 zset 它能够实现动态的排序,例如: 可以用来存储粉
丝列表,value 值是粉丝的用户 ID,score 是关注时间,我们可
以对粉丝列表按关注时间进行排序。
另外如存储学生的成绩,value 值是学生的 ID, score 是他
的考试成绩。我们对成绩按分数进行排序就可以得到他的名次。
(6)Lua 脚本
【建议】不建议使用 Lua 脚本,如果特殊需求需要用到原子能力,
Lua 脚本应尽量简单,否则会影响性能。
【建议】使用有意义的变量名和函数名,遵循一致的命名约定。通
常, 变 量 名 和 函 数 名 使 用 小 写 字 母 和 下 划 线 , 如 local
my_variable。
【建议】尽量使用 local 变量来减少全局变量的使用,以避免意
外地修改全局变量;尽量避免使用全局变量,因为它们可能会导致
意外的副作用和错误。
【建议】为 Lua 脚本添加注释,以便其他人更容易理解脚本的功
能和实现;尽量使用统一代码格式化风格,如缩进、空格等,以提
高代码的可读性和可维护性。
【建议】在 Lua 脚本中使用 pcall 或 xpcall 函数来捕获和处
理错误,以确保脚本在出现错误时不会崩溃。
【建议】不要在代码里面动态修改 lua 脚本,那样每次请求都是
一个新的 Lua 脚本,消耗大量内存;所有的 Lua 脚本必须先在测
试环境测试完成才能上生产。
【建议】尽量避免在 Lua 脚本中使用循环,因为它们可能会导致
性能问题。如果必须使用循环,请确保循环次数尽可能少。
【建议】尽量避免在 Lua 脚本中使用递归,因为它们可能会导致
堆栈溢出和性能问题。
相关文章:
Redis 的标准使用规范之数据类型使用规范
数据类型使用规范 提示:以下是本篇文章正文内容,可供参考 (1)、字符文本(STRING) 【建议】选型为简易文本类缓存 :比如普通的字符、文本、Json 结构 ,通常能起到加速读写和降低后端压力的作用。 【建议】…...
人工智能技术导论——基于产生式规则的机器推理
在引出本章的内容之前先介绍一个概念 知识 知识的概念 知识(Knowledge)是人们在改造客观世界的实践中形成的对客观事物(包括自然的和人造的)及其规律的认识,包括对事物的现象、本质、状态、关系、联系和运动等的认识…...
Apache Guacamole 安装及配置VNC远程桌面控制
文章目录 官网简介支持多种协议无插件浏览器访问配置和管理应用场景 Podman 部署 Apache Guacamole拉取 docker 镜像docker-compose.yml部署 PostgreSQL生成 initdb.sql 脚本部署 guacamole Guacamole 基本用法配置 VNC 连接 Mac 电脑开启自带的 VNC 服务 官网 https://guacam…...
在Linux中从视频流截取图片帧(ffmpeg )
Linux依赖说明: 说明: 使用到的 依赖包 1. ffmpegsudo apt update sudo apt-get install ffmpeg2. imagemagick (选装) (检测图像边缘信息推断清晰度,如果是简单截取但个图像帧>用不到<)sudo apt-get install imagemagick备注: 指令及相关参数说明核心指令: (作用: 执…...
使用脚手架来创建 express 项目
使用脚手架(scaffold)可以快速搭建Express应用程序的基本结构。Express自身提供了一个官方脚手架工具叫做express-generator,它可以帮助你快速地生成一个包含基本文件结构的Express项目。 安装Express Generator 首先,你需要全局…...
单片机常用的软件架构
参考 9种单片机常用的软件架构...
服务器模型 Reactor 和 Proactor
Proactor 具体流程如下: 处理器发起异步操作,并关注 IO 完成事件;事件分离器等待操作完成事件;分离器等待过程中,内核并行执行实际的 IO 操作,并将结果存储入用户自定义的缓冲区,最后通知事件分…...
使用 Grype 检查 .jar 包中的漏洞
在开发和部署 Java 应用时,确保依赖库和项目文件中的安全性至关重要。Grype 是一款强大的开源工具,用于扫描项目文件(如 .jar 包)中的已知漏洞。本篇博客将介绍如何手动安装 Grype 并使用它检测 .jar 包中的安全漏洞。 一、手动安…...
IDEA 常用插件推荐,美观又实用!
1、 TONGYl Lingma - Your Al Coding Assistant. Type less, Code more. 通义灵码,是一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力&…...
浮点数精度问题
为什么会产生精度问题? 我们带着这个问题去探寻浮点数二进制的存储原理 浮点数是怎么存在计算机中的? 浮点数在计算机中的表示通常遵循IEEE 754标准。其基本概念如下: 结构:浮点数由三部分组成: 符号位(…...
RK3576芯片在智能家居里中型智慧屏产品的应用方案分析
智能家居在近年来得到了快速发展,AI技术不断发展,人机交互十分成熟,各种家电也都迎来了智能化浪潮,智能家居为人们提供了优秀的产品体验,受到主流消费者的青睐,智能家居里的中型智慧屏产品也随之兴起。 瑞芯…...
什么是生成式 AI?
人工智能 (AI) 通过使用机器学习与环境交互并执行任务来模仿人类行为,而无需明确指示要输出的内容。 生成式 AI 描述 AI 中用于创建原创内容的一类功能。 人员通常与聊天应用程序中内置的生成式 AI 交互。 此类应用程序的一个常见示例是 Microsoft Copilot…...
计算机网络期末试题及答案
一、选择题(每空2分,共20分) 1、下列关于常用交换技术的描述不正确的是( )。 A、电路交换是面向连接可靠的,适合大量的、连续的数据传输。 B、分组交换采用存储转发方式,以较小的固定长度的分组作为数据传输单…...
MySQL中DML操作(一)
添加数据(INSERT) 1.选择插入 INSERT INTO 表名(列名1 , 列名2 , 列名3......) VALUES(值1 , 值2 , 值3......); 示例: 向departments表中添加一条数据,部门名称为market,工作地点ID为1。 insert into department…...
Django 模板继承
Django 模板继承的语法主要涉及两个关键标签:{% extends %} 和 {% block %}。 语法详解 {% extends %}: 用于指定当前模板继承自哪个父模板。语法:{% extends "父模板的路径" %} {% extends "base.html" %}{% block %}&…...
黑马点评17——多级缓存-Lua语法
文章目录 Lua语法初始Lua变量和循环条件控制、函数 变量和循环函数和条件控制 Lua语法 初始Lua https://www.lua.org/ 魔兽的一些插件就是用lua开发的。 centOs已经装好了lua,直接用~ 变量和循环 条件控制、函数 变量和循环 函数和条件控制...
如何在Linux 上运行 SciChart WPF图表控件?
SciChart – 一个跨平台图表库,可实现 Windows Presentation Foundation (WPF)、JavaScript 以及原生 iOS (Swift/Objective-C) 和 Android (Java/Kotlin),基于代号为 Visual Xccelerator 的专有 C 渲染引擎。这提供了 SciChart 众所周知的速度和性能&am…...
C--字符串函数处理总结
文章目录 函数接口strchrstrtok 常见应用int 转化 字符串1 2 3 4 (int ) ---> 1,2,3,4 (char []) 字符串转化为 int1,2,3,4(char []) ---> 1 2 3 4 (int ) 函数接口 strchr char *strch…...
PLSQL-将一份excel数据导入到一张物理表(Oracle)
–>> 很简单~ 平时用惯了DBeaver,突然要用PLSQL Developer,确实很生疏。 –>> 我的场景,将一份.csv文件数据手动导入到Oracle下的一张物理表中去。 研究了半天,看网上说的可以用:Tools → ODBC Importer &…...
【系统架构设计师】状态模式
状态模式(State Pattern)是行为设计模式的一种,它允许一个对象在其内部状态改变时改变它的行为。对象看起来像是改变了它的类。这种模式可以用于实现一些复杂的有限状态机,在不同的条件下改变对象的行为而无需修改对象本身。下面是一个关于状态模式的详细介绍,包括其概念、…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
