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)是行为设计模式的一种,它允许一个对象在其内部状态改变时改变它的行为。对象看起来像是改变了它的类。这种模式可以用于实现一些复杂的有限状态机,在不同的条件下改变对象的行为而无需修改对象本身。下面是一个关于状态模式的详细介绍,包括其概念、…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
