当前位置: 首页 > news >正文

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 脚本中使用递归,因为它们可能会导致
堆栈溢出和性能问题。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【学员提问】对于typescript的assert和casting,即类型断言和类型转换,我还不太理解,请结合例子梳理下知识点,并且出几道题考考我
  • 普发Pfeiffer TCP600TCP5000手侧
  • CleanMyMac X2024破解版mac电脑清理工具
  • Redis 集群会有写操作丢失吗?为什么?
  • 期权组合策略有什么风险?期权组合策略是什么?
  • 110个oracle常用函数总结
  • 2024年我的利基出版转型——新战略与重点解析
  • 【4.2 深度学习中的损失函数】
  • Linux系统【RockyLinux9.4】下K8S集群【1.31.0】安装部署指南
  • 【C语言】选择题错题集
  • 干货分享 | 激光测风雷达中准确监测温度、湿度和气压的重要性
  • HTML + js 生成一个线路走向图,可以标记总共有多少站,用户到达第几站了
  • 计算机毕业设计python校园物资招标投标竞标系统 w235g
  • Vue3.0项目实战(三)——大事件管理系统首页 layout 架子与文章分类的实现
  • 解决 Ubuntu 20.04 上 Fail2Ban 启动失败问题:指定 systemd 后端
  • JavaScript设计模式与开发实践系列之策略模式
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Rancher如何对接Ceph-RBD块存储
  • React Native移动开发实战-3-实现页面间的数据传递
  • Spring Boot快速入门(一):Hello Spring Boot
  • TypeScript迭代器
  • vuex 笔记整理
  • 给github项目添加CI badge
  • 基于组件的设计工作流与界面抽象
  • 7行Python代码的人脸识别
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​学习一下,什么是预包装食品?​
  • # Apache SeaTunnel 究竟是什么?
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (12)Linux 常见的三种进程状态
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (floyd+补集) poj 3275
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (纯JS)图片裁剪
  • (二)测试工具
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • ***原理与防范
  • .CSS-hover 的解释
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET关于 跳过SSL中遇到的问题
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400
  • [Android]使用Retrofit进行网络请求
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [bzoj 3534][Sdoi2014] 重建
  • [C++]入门基础(1)
  • [Django 0-1] Core.Handlers 模块
  • [EFI]DELL XPS13 9360电脑 Hackintosh 黑苹果efi引导文件
  • [Excel]如何找到非固定空白格數列的條件數據? 以月份報價表單為例
  • [Flutter]打包IPA