redis笔记 -- 基础数据结构

redis笔记

基础的数据结构:string、list、hash、set、zset

容器型数据结构(list、hash、set、zset)通用规则
  • 如果容器不存在,就创建一个,再进行操作
  • 如果容器里没有数据了,就立即删除,回收内存

String

如图:

String 是reids 中最常见的数据类型

内部编码3种:int、raw、embstr
  • int: 保存在字符串对象结构的ptr属性里(将void*转换成 long),并将字符串对象的编码设置为int
    在这里插入图片描述
  • embstr编码是专门用于保存短字符串的一种优化编码方式。
    mbstr会通过一次内存分配函数来分配一块连续的内存空间来保存redisObject和SDS;
    优点:
    embstr相对于raw,创建字符串对象所需的内存分配次数从两次变为一次;
    释放 embstr编码的字符串对象同样只需要调用一次内存释放函数;
    embstr编码的字符串对象的所有数据都保存在一块连续的内存里面可以更好的利用 CPU 缓存提升性能。
    缺点:
    embstr编码的字符串对象实际上是只读的
    对embstr编码的字符串对象执行任何修改命令(例如append)时,程序会先将对象的编码从embstr转换成raw,然后再执行修改命令。
应用场景
缓存对象
  • 直接缓存整个对象的JSON
  • 将key分离为user:ID:属性, MSET存储。MGET 获取各属性值
常规计数(计算访问次数 点赞 转发 库存数量的场景)

Redis 处理命令是单线程,所以执行命令的过程是原子的。

分布式锁 SETNX

分布式锁命令:
加锁:

SET lock_key unique_value NX PX 10000 // unique_value是客户端生成的唯一标识

解锁(判断锁的 unique_value 是否为加锁客户端 – 是则将 lock_key 键删除):
解锁是有两个操作,这时就需要 Lua 脚本来保证解锁的原子性, Redis 在执行 Lua 脚本时,可以以原子性的方式执行

// 释放锁时,先比较 unique_value 是否相等,避免锁的误释放
if redis.call("get",KEYS[1]) == ARGV[1] thenreturn redis.call("del",KEYS[1])
elsereturn 0
end
共享Session信息

分布式系统单独存储 Session 流程图:
在这里插入图片描述
借助 Redis 对这些 Session 信息进行统一的存储和管理:
在这里插入图片描述

list 简单的字符串列表 按插入顺序排序 可以从头部或尾部向 List 列表添加元素

底层数据结构是由双向链表或压缩列表实现…
redis3.2后List 数据类型底层数据结构就只由 quicklist 实现

应用场景
消息队列

需求: 消息保序 处理重复消息 保证消息的可靠性

基于List的消息队列实现
  • 消息保序
    在这里插入图片描述
    生产者使用 LPUSH key value[value…] 将消息插入到队列的头部,如果 key 不存在则会创建一个空的队列再插入消息。
    消费者使用 RPOP key 依次读取队列的消息,先进先出。
    问题: 消费者不停调用RPOP命令, 消耗CPU.
    解决:Redis提供BRPOP命令 阻塞式读取, 客户端在没有读到队列数据时,自动阻塞,直到有新的数据写入队列,再开始读取新数据。
  • 处理重复的消息
    方案: 自行为每个消息生成一个全局唯一ID. 用LPUSH命令将消息插入队列时,在消息中包含全局唯一ID.
    eg. 把一条全局 ID 为 111000102、库存量为 99 的消息插入消息队列
>  LPUSH mq "111000102:stock:99"
  • 保证消息可靠性
    **问题:**如果消费者程序在处理消息的过程出现了故障或宕机,就会导致消息没有处理完成,那么,消费者程序再次启动后,就没法再次从 List 中读取消息了。
    解决: BRPOPLPUSH

问题: List 不支持多个消费者消费同一条消息
List实现消息队列优点:

  • redis存储,不受限于JVM内存上限
  • Redis具有持久化机制,数据安全性有保障

Hash

Key-value 集合, 适合用于存储对象
在这里插入图片描述
数据结构: 哈希表, 如果哈希类型元素个数小于 512 个, 所有值小于 64,会使用压缩列表作为底层数据结构.

应用场景
缓存对象

一般对象用 String + Json 存储,对象中某些频繁变化的属性可以考虑抽出来用 Hash 类型存储。

# 存储一个哈希表uid:1的键值
> HMSET uid:1 name Tom age 15
2
# 存储一个哈希表uid:2的键值
> HMSET uid:2 name Jerry age 13
2
# 获取哈希表用户id为1中所有的键值
> HGETALL uid:1
1) "name"
2) "Tom"
3) "age"
4) "15"
购物车

案例待学习

Set

哈希表或整数集合实现

  • 适合用来数据去重和保障数据的唯一性
  • 可以用来统计多个集合的交集、错集和并集等
  • Set 的差集、并集和交集的计算复杂度较高,在数据量较大的情况下,如果直接执行这些计算,会导致 Redis 实例阻塞。
在主从集群中,为了避免主库因为 Set 做聚合计算(交集、差集、并集)时导致主库被阻塞,我们可以选择一个从库完成聚合统计,或者把数据返回给客户端,由客户端来完成聚合统计.
点赞

Set 类型可以保证一个用户只能点一个赞,这里举例子一个场景,key 是文章id,value 是用户id。

共同关注
抽奖活动
  • 如果允许重复中奖,可以使用 SRANDMEMBER 命令。
  • 如果不允许重复中奖,可以使用 SPOP 命令。

Zset

压缩列表或跳表

排行榜
电话\姓名排序

待补充:

BitMap

HyperLogLog

GEO

Stream

使用场景

消息队列,相比于基于 List 类型实现的消息队列,有这两个特有的特性:自动生成全局唯一消息ID,支持以消费组形式消费数据。

Redis 是否适合做消息队列?
  • 如果你的业务场景足够简单,对于数据丢失不敏感,而且消息积压概率比较小的情况下,把 Redis 当作队列是完全可以的。
  • 如果你的业务有海量消息,消息积压的概率比较大,并且不能接受数据丢失,那么还是用专业的消息队列中间件吧。

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

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

相关文章

持续集成交付CICD:GitLabCI 运行前后端项目

目录 一、理论 1.spring项目自动构建 2.阿里云云效 Maven 3.Maven安装 4.Go安装 5.NPM安装 二、实验 1.GitLabCI 运行Maven项目 2.GitLabCI 运行Go项目 3.GitLabCI 运行NPM项目 三、问题 1.前端脚手架如何初始化项目 2.NPM下载如何指定 3.Go项目下载源如何指定 …

c++面试题

1.static的使用 1)修饰局部变量:在函数内部使用static修饰局部变量,会使它成为静态局部变量。静态局部变量只会被初始化一次,且只有在第一次调用该函数时才会被初始化,之后每次调用该函数时都会保留上一次的值.从原来…

Vue生命周期:组件的生命之旅

🍃引言 在Vue.js中,每个组件都有其独特的生命周期。这个生命周期指的是组件从创建到销毁的一系列过程。了解并正确使用Vue的生命周期钩子,对于优化组件性能、管理组件状态以及实现特定功能至关重要。本文将详细介绍Vue的生命周期及其各个阶段…

SpringBoot+Redis编写一个抢红包雨的案例。附源码。

案例演示 SpringBootRedis编写一个抢红包雨的案例。附源码 1、案例分析,整体方案介绍 预备上线一个红包雨活动。这个红包雨的思路是活动开始前25分钟,在后台创建活动。然后前端用户进入,到点后将设置的金额拆分成多个小红包,开启倒…

转向更卷的奶茶 库迪这是要在咖啡上认怂?

卖咖啡刚满一年,陆正耀就带着名为“茶猫”的奶茶项目再度登场。 根据多位网友的爆料,茶猫采取和库迪咖啡一样的联营商模式,且有低价补贴策略,主打低价茶饮市场,全场统一定价6.9元。 熟悉的加盟模式,熟悉的…

使用type实现接口继承效果

如何使用type实现接口继承的效果 接口继承的写法 // 接口继承 interface Person {name: stringage: numberhobby?: string say: (content: string) > void } interface Student extends Person {score: number }使用 type 模拟 interface的继承效果 // 使用type实现类似…

CSS选择器十二种方法

相信大家对元素应该是不陌生的,当我们页面中,我们想要布局,给元素添加样式的时候,我们应该怎么获取到指定元素呢? 优先级:ID 选择器 > 类选择器 > 标签选择器 > 通配符 1.元素选择器 通过标签名…

基于springboot+vue的秒杀商城(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

这是怎么了?继阿里11月故障后,淘宝这个问题20 天了还未修复!

继11月12号,阿里云发生大面积故障故障以来,已经过去了近 20天,但是截止到发文时间,作者发现淘宝还有部分功能存在问题,没法正常使用。 难道真是降本增笑,开猿截流,导致没有相关负责人员了&…

业余爱好-社会工程管理记账报税

税务问题笔记 印花税税费申报及缴纳财务和行为税合并纳税申报增值税及附加税费申报企业所得税季度A类申报残疾人就业保障金申报财务报表个税申报 印花税 印花税是对在经济活动和经济交往中书立、领受具有法律效力的凭证的行为征收的一种税。 税费申报及缴纳 财务和行为税合并…

LeetCode Hot100 75.颜色分类

题目: 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 so…

CentOS 7安装Java 8

前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 要在CentOS 7上安装Java 8,请按照以下步骤操作: 打开终端并以root身份登录。 更新系统软件包: …

大数据:Hadoop刷题

大数据:Hadoop刷题 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql要…

Day04:每日一题:2661. 找出叠涂元素

2661. 找出叠涂元素 给你一个下标从 0 开始的整数数组 arr 和一个 m x n 的整数 矩阵 mat 。 arr 和 mat 都包含范围 [1,m * n] 内的 所有 整数。从下标 0 开始遍历 arr 中的每个下标 i ,并将包含整数 arr[i] 的 mat 单元格涂色。请你找出 arr 中在 mat…

【PixPin】媲美QQ/Snipaste截图贴图OCR工具

PixPin PixPin是一款截图工具,它集成了截图、长截图、贴图、标注、OCR识别等众多功能,软件体积小巧,使用简单,是一款非常棒的截图工具。之前使用过Snipaste工具的小伙伴用起来应该是得心应手。 从左往右的功能依次是:…

jetson nano网络配置(有线、无线、USB)

文章目录 网络配置(有线、无线)1.前言1.1 RJ451.2 无线网卡 2.有线连接2.1 连接方法2.2 检测连接状态 3.无线3.1 网卡安装步骤3.2 连接方法3.3 检测连接状态 4.通过USB 线控制Jetson Nano4.1 连接4.2 查看设备4.3 查看设备IP 网络配置(有线、…

ThinkPHP 2.x任意代码执行漏洞

任务一: 复现环境中的代码漏洞 任务二: 尝试利用代码执行漏洞读取服务器web目录下的文件列表。 任务一: 1.搭建环境: 2.在php环境下直接输入{${phpinfo}}测试代码片段 2.写入一句话木马,用antsword连接&#xff0…

【Java8系列07】Java8日期处理

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

nodejs_vue+vscode美容理发店会员管理系统un1dm

按照设计开发一个系统的常用流程来描述系统,可以把系统分成分析阶段,设计阶段,实现阶段,测试阶段。所以在编写系统的说明文档时,根据系统所处的阶段来描述系统的内容。 绪论:这是对选题的背景,意…

停止在 TypeScript 中使用 any 类型

停止在 TypeScript 中使用 any 类型 TypeScript 是 Web 开发人员中最常用的编程语言之一。它具有出色的语言功能,允许我们轻松设计可扩展的应用程序。因此,开发人员倾向于在项目中选择 TypeScript 而不是 JavaScript。 然而,在使用 TypeScr…