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

【Redis】——Redis基础的数据结构以及应用场景

什么是redis数据库

  • Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景
  • ,Redis 还支持 事务 、持久化、Lua 脚本、多种集群方案(主从复制模式、哨兵模式、切片机群模式)、发布/订阅模式,内存淘汰机制、过期删除机制
  • Redis 应用非常广泛,如 Twitter、暴雪娱乐、Github、Stack Overflow、腾讯、阿里巴巴、京东、华为、新浪微博等,很多 中小型公司也在使用;

应用

  • 记录朋友圈点赞数、评论数和点击数(hash)
  • 记录朋友圈说说列表(排序),便于快速显示朋友圈(list)
  • 记录文章的标题、摘要、作者和封面,用于列表页展示(hash)
  • 记录朋友圈的点赞用户ID列表(list),评论ID列表(list),用 于显示和去重计数(zset)
  • 缓存热点数据,减少数据库压力(hash)
  • 如果朋友圈说说 ID 是整数 id,可使用 redis 来分配朋友圈说说 id(计数器)(string)
  • 通过集合(set)的交并差集运算来实现记录好友关系(set) 游戏业务中,每局战绩存储(list)

Redis存储的结构

Redis 内部整体的存储结构是一个大的 HashMap,通过 key -value 的方式来存储组织数据的,key冲突通过 链表去实现,每个dictEntry为一个key/value对象,value为RedisObject

所有的key值都是string类型。

key值的命名规范:

【推荐】Redis key命名需具有可读性以及可管理性,不该使用含义不清的key以及特别长的key名;

强制】以英文字母开头,命名中只能出现 小写字母、数字、英文点号(.) 和 英文半角冒号(:);

强制】不要 包含 特殊字符,如下划线、空格、换行、单双引号以及其他转义字符

 【强制】命名规范:业务模块名:业务逻辑含义:其他:value类型

例如:user:basic.info:{userid}:string

Redis中的value数据结构的类型?

Redis提供了丰富的数据类型,常见的有五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。

  • string 是一个安全的二进制字符串;
  • 双端队列 (链表)list:有序(插入有序);
  • 散列表 hash:对顺序不关注,field 是唯一的
  • 无序集合 set:对顺序不关注,里面的值都是唯一的;
  • 有序集合 zset:对顺序是关注的,里面的值是唯一的;根据 member 来确定唯一;根据 score 来确定有序;

String

String是一种安全字符串。
什么安全字符串?

使用安全字符串的函数都不会是超出字符串缓冲区。

常用指令

//设置 key-value 类型的值
127.0.0.1:6379> set name sjp
OK
# 根据 key 获得对应的 value
127.0.0.1:6379> get name
"sjp"
# 判断某个 key 是否存在
127.0.0.1:6379> exists name
(integer) 1
# 返回 key 所储存的字符串值的长度
127.0.0.1:6379> strlen name
(integer) 3
# 删除某个 key 对应的值
127.0.0.1:6379> del name
(integer) 1#批量设置 key-value类型的值
127.0.0.1:6379> mset name:1001 sjp name:1002 lisi
OK
# 批量获取多个 key 对应的 value
127.0.0.1:6379> mget name:1001 name:1002
1) "sjp"
2) "lisi"

string的应用 

直接缓存整个对象的 JSON

命令例子: 

SET user:1 '{"name":"sjp", "age":18}'。

采用将 key 进行分离为 user:ID:属性,采用 MSET 存储,用 MGET 获取各属性值,命令例子: 

MSET user:1:name xiaolin user:1:age 18 user:2:name xiaomei user:2:age 20

计数器(字符串的内容为整数的时候可以使用)

# 设置 key-value 类型的值
127.0.0.1:6379> set count 1
OK
# 将 key 中储存的数字值增一
127.0.0.1:6379> incr count
(integer) 2
# 将key中存储的数字值加 10
127.0.0.1:6379> incrby count 100
(integer) 102
# 将 key 中储存的数字值减一
127.0.0.1:6379> decr count
(integer) 101
# 将key中存储的数字值键 10
127.0.0.1:6379> decrby count 10
(integer) 91

List

List 列表是双向链表实现,列表首尾操作(删除和增加)时间复杂度 O(1);.查找中间元素时间复杂度为O(n);

列表中数据是否压缩的依据:

1. 元素长度小于 48,不压缩;

2. 元素压缩前后长度差不超过 8,不压缩

基础命令:

# 从队列的左侧入队一个或多个元素
LPUSH key value [value ...]
# 从队列的左侧弹出一个元素
LPOP key
# 从队列的右侧入队一个或多个元素
RPUSH key value [value ...]
# 从队列的右侧弹出一个元素
RPOP key 
# 返回从队列的 start 和 end 之间的元素 0, 1 2 负索引
LRANGE key start end
# 从存于 key 的列表里移除前 count 次出现的值为 value 的
元素
# list 没有去重功能   hash set zset
LREM key count value
# 它是 RPOP 的阻塞版本,因为这个命令会在给定list无法弹出
任何元素的时候阻塞连接
BRPOP key timeout  # 超时时间 + 延时队列

应用场景

LPUSH + LPOP
# 或者
RPUSH + RPOP

队列

LPUSH + RPOP
# 或者
RPUSH + LPOP

消息队列

消息队列在存取消息时,必须要满足三个需求,分别是消息保序、处理重复的消息 和 保证消息可靠性

  • 生产者使用lpush往list集合中添加消息
  • 消费者使用 brpop往list集合中获取消息 

 BRPOP命令也称为 阻塞式读取,客户端在 没有 读到队列数据时,自动阻塞,直到有新的数据写入队列,再开始读取新数据

2、消息队列如何处理重复的消息?

消费者要实现重复消息的判断,需要 2 个方面的要求:

  • 每个消息都有一个全局的 ID。
  • 消费者 要记录已经处理过的消息的 ID。当收到一条消息后,消费者程序就可以对比收到的消息 ID 和记录的已处理过的消息 ID,来判断当前收到的消息有没有经过处理。如果已经处理过,那么,消费者程序就不再进行处理了。

 List 并不会为每个消息生成 ID 号,所以我们需要自行为每个消息生成一个全局唯一ID,生成之后,我们在用 LPUSH 命令把消息插入 List 时,需要在消息中包含这个全局唯一 ID

3.消息队列如何保证消息的可靠性?

消费者程序从 List 中读取一条消息后,List 就不会再留存这条消息了。所以,如果消费者程序在处理消息的过程出现了故障或宕机,就会导致消息没有处理完成,那么,消费者程序再次启动后,就没法再次从 List 中读取消息了。

,List 类型提供了 BRPOPLPUSH 命令,这个命令的 作用是让消费者程序从一个 List 中读取消息,同时,Redis 会把这个消息再插入到另一个 List(可以叫作备份 List)留存

Hash

Hash 是一个键值对(key - value)集合,其中 value 的形式如: value=[{field1,value1},...{fieldN,valueN}]。Hash 特别适合用于存储对象.

内部实现

Hash 类型的底层数据结构是由压缩列表或哈希表实现的:

如果 哈希类型元素个数小于 512 个(默认值,可由 hash-max-ziplist-entries 配置),所有值小于 64 字节(默认值,可由 hash-max-ziplist-value 配置)的话,Redis 会使用压缩列表作为 Hash 类型的底层数据结构。

基础命令

# 获取 key 对应 hash 中的 field 对应的值
HGET key field
# 设置 key 对应 hash 中的 field 对应的值
HSET key field value
# 设置多个hash键值对
HMSET key field1 value1 field2 value2 ... fieldn
valuen
# 获取多个field的值
HMGET key field1 field2 ... fieldn
# 给 key 对应 hash 中的 field 对应的值加一个整数值
HINCRBY key field increment
# 获取 key 对应的 hash 有多少个键值对
HLEN key
# 删除 key 对应的 hash 的键值对,该键为field
HDEL key field

应用

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

购物车

set

集合

Set 类型是一个 无序并唯一的键值集合,它的 存储顺序不会按照插入的先后顺序进行存储

一个集合最多可以存储 2^32-1 个元素。概念和数学中个的集合基本类似,可以交集,并集,差集等等。。

存储结构

元素都为 整数且节点数量小于等于 512(set-max-intsetentries),则使用整数数组存储

元素当中有一个不是整数或者节点数量大于 512,则使用 字典存储; 

基础命令 

# 添加一个或多个指定的member元素到集合的 key中
SADD key member [member ...]
# 计算集合元素个数
SCARD key
# SMEMBERS key
SMEMBERS key
# 返回成员 member 是否是存储的集合 key的成员
SISMEMBER key member
# 随机返回key集合中的一个或者多个元素,不删除这些元素
SRANDMEMBER key [count]
# 从存储在key的集合中移除并返回一个或多个随机元素
SPOP key [count]
# 返回一个集合与给定集合的差集的元素SDIFF key [key ...]
# 返回指定所有的集合的成员的交集
SINTER key [key ...]
# 返回给定的多个集合的并集中的所有成员
SUNION key [key ...]

 set与list的区别

list可以存储重复元素,set只能存储非重复元素。

list是按照元素的插入的先后顺序进行存储,而set则是无序方式存储元素

应用

点赞

set可以保证一个用户只能点一个赞,例如,key是文章id,value是用户id

uid:1 、uid:2uid:3 三个用户分别对 article:1 文章点赞了。

#uid:1 uid:2 uid:3 用户对文章 article:1 点赞 
127.0.0.1:6379> sadd article:1 uid:1
(integer) 1
127.0.0.1:6379> sadd article:1 uid:2
(integer) 1
127.0.0.1:6379> sadd article:1 uid:3
(integer) 1#获取 article:1 文章所有点赞用户 :
127.0.0.1:6379> smembers article:1
1) "uid:3"
2) "uid:2"
3) "uid:1"#获取 article:1 文章的点赞用户数量:
127.0.0.1:6379> scard article:1
(integer) 3

推荐好友

Set 类型支持交集运算,所以可以用来计算共同关注的好友、公众号等。

key 可以是用户id,value 则是好友

#插入A的好友
127.0.0.1:6379> sadd follow:A sjp king lisi
(integer) 3
#插入B的好友
127.0.0.1:6379> sadd follow:B chen lisi sjp
(integer) 3
#A不同于B的好友
127.0.0.1:6379> sdiff follow:A follow:B
1) "king"
#A与B的共同好友
127.0.0.1:6379> sinter follow:A follow:B
1) "sjp"
2) "lisi"

抽奖

key为抽奖活动名,value为员工名称,把所有员工名称放入抽奖箱

#添加抽奖人员
127.0.0.1:6379> sadd lucky A B C D E
(integer) 5#允许重复抽奖
127.0.0.1:6379> srandmember lucky 1
1) "C"
127.0.0.1:6379> srandmember lucky 2
1) "E"
2) "D"
127.0.0.1:6379> srandmember lucky 3
1) "B"
2) "C"
3) "A"#不重复抽奖
127.0.0.1:6379> spop lucky 1
1) "A"
127.0.0.1:6379> spop lucky 2
1) "D"
2) "E"

zset

Zset 类型(有序集合类型)相比于 Set 类型多了一个排序属性 score(分值),对于有序集合 

有序集合保留了集合不能有重复成员的特性分值可以重复),但不同的是,有序集合中的元素可以排序。 zset 根据分值进行排序。

基础命令:

# 添加到键为key有序集合(sorted set)里面
ZADD key [NX|XX] [CH] [INCR] score member [score
member ...]
# 从键为key有序集合中删除 member 的键值对
ZREM key member [member ...]
# 返回有序集key中,成员member的score值
ZSCORE key member
# 为有序集key的成员member的score值加上增量increment
ZINCRBY key increment member
# 返回key的有序集元素个数
ZCARD key
# 返回有序集key中成员member的排名
ZRANK key member
# 返回存储在有序集合key中的指定范围的元素   order by id
limit 1,100
ZRANGE key start stop [WITHSCORES]
# 返回有序集key中,指定区间内的成员(逆序)
ZREVRANGE key start stop [WITHSCORES]

 应用场景

有序集合比较典型的使用场景就是排行榜。例如 学生成绩的排名榜游戏积分排行榜视频播放排名、电商系统中商品的销量排名等。

相关文章:

【Redis】——Redis基础的数据结构以及应用场景

什么是redis数据库 Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。,Redis 还支持 事务 、持久化、Lua 脚本、多种集群方案(主…...

SpringBoot+WebSocket搭建多人在线聊天环境

一、WebSocket是什么? WebSocket是在单个TCP连接上进行全双工通信的协议,可以在服务器和客户端之间建立双向通信通道。 WebSocket 首先与服务器建立常规 HTTP 连接,然后通过发送Upgrade标头将其升级为双向 WebSocket 连接。 WebSocket使得…...

推荐适用于不同规模企业的会计软件:选择最适合您企业的解决方案

高效的会计软件不仅可以协助企业进行财务管理,做出科学的财务决策,还可以对企业数字化转型提供助力。不同规模的企业需要根据其特定需求选择适合的会计软件。那么有什么适合不同规模企业的会计软件推荐吗? 小型企业的选择 对于小型企业而言&…...

Apache Zookeeper架构和选举机制

ZooKeeper是一个开源的分布式协调服务,旨在解决分布式系统中的一致性、配置管理、领导者选举等问题。它由Apache软件基金会维护,是Hadoop生态系统的一部分,被广泛用于构建高可用、可靠和具有一致性的分布式应用程序和服务。 ZooKeeper提供了一个层次化的命名空间,类似于文…...

车联网TCU USB的配置和使用

1 usb_composition命令 # cat /sbin/usb/target # cd /sys/class/android_usb/android0 # cat functions console shows that QCOM’s default configuration Usage: usb_composition [Pid] [HSIC] [PERSISTENT] [IMMEDIATE] [FROM_ADBD] usb_composition 9025 n y y Then this…...

Linux系统USB摄像头测试程序(三)_视频预览

这是在linux上usb摄像头视频预览程序&#xff0c;此程序用到了ffmpeg、sdl2、gtk3组件&#xff0c;程序编译之前应先安装他们。 #include <sys/ioctl.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <zconf.h> …...

目标检测任务数据集的数据增强中,图像水平翻转和xml标注文件坐标调整

需求&#xff1a; 数据集的数据增强中&#xff0c;有时需要用到图像水平翻转的操作&#xff0c;图像水平翻转后&#xff0c;对应的xml标注文件也需要做坐标的调整。 解决方法&#xff1a; 使用pythonopencvimport xml.etree.ElementTree对图像水平翻转和xml标注…...

系统架构的演变

随着互联网的发展&#xff0c;网站应用的规模不断扩大&#xff0c;常规的应用架构已无法应对&#xff0c;分布式服务架构以及微服务架构势在必行&#xff0c;必需一个治理系统确保架构有条不紊的演进。 单体应用架构 Web应用程序发展的早期&#xff0c;大部分web工程(包含前端…...

IDC发布《亚太决策支持型分析数据平台评估》报告,亚马逊云科技位列“领导者”类别

日前&#xff0c;领先的IT市场研究和咨询公司IDC发布《2023年亚太地区&#xff08;不含日本&#xff09;决策支持型分析数据平台供应商评估》1报告&#xff0c;亚马逊云科技位列“领导者”类别。IDC认为&#xff0c;亚马逊云科技在解决方案的协同性、敏捷性、完整性、及时性、经…...

C#之OpenFileDialog创建和管理文件选择对话框

OpenFileDialog 是用于图形用户界面&#xff08;GUI&#xff09;编程的一个类&#xff0c;它用于显示一个对话框&#xff0c;允许用户选择要打开的文件。在需要用户加载或打开文件的应用程序中&#xff08;如文本编辑器、图像查看器或文档处理器&#xff09;&#xff0c;这是一…...

Java中使用MongoTemplate 简单操作MongoDB

Autowired private MongoTemplate mongoTemplate; User&#xff1a;封装的对象 插入&#xff1a;mongoTemplate.insert(user); 根据id查询&#xff1a;mongoTemplate.findById(id, User.class); 查询所有&#xff1a;mongoTemplate.findAll(User.class); 条件查询&#…...

[Mac软件]Pixelmator Pro 3.3.12 专业图像编辑中文版

Pixelmator Pro是专为Mac设计的功能强大&#xff0c;美观且易于使用的图像编辑器。借助广泛的专业级无损图像编辑工具&#xff0c;Pixelmator Pro可使您发挥出最佳的照片效果&#xff0c;创建华丽的构图和设计&#xff0c;绘制&#xff0c;绘画&#xff0c;应用令人惊叹的效果&…...

吴恩达 GPT Prompting 课程

Prompting Guidelines 目录 Guidelines for PromptingPrompting Principles Principle 1: Write clear and specific instructions1.1: Use delimiters to clearly indicate distinct parts of the input1.2: Ask for a structured output1.3: Ask the model to check whether …...

gpt3.5写MATLAB代码剪辑视频,使之保留画面ROI区域

% 输入和输出文件名 inputVideoFile input_video.mp4; outputVideoFile output_video.mp4;% 创建 VideoReader 和 VideoWriter 对象 videoReader VideoReader(inputVideoFile); outputVideo VideoWriter(outputVideoFile, MPEG-4); outputVideo.FrameRate videoReader.Fra…...

设计模式二十一:状态模式(State Pattern)

一个对象的内部状态发生变化时&#xff0c;允许对象改变其行为。这种模式使得一个对象看起来好像在运行时改变了它的类&#xff0c;主要目的是将状态的行为从主要对象中分离出来&#xff0c;使得主要对象不必包含所有状态的逻辑&#xff0c;而是将每个状态的行为封装在独立的类…...

【校招VIP】产品思维能力之产品设计

考点介绍&#xff1a; 对于产品经理来说最重要的就是产品思维&#xff0c;而拥有一个好的产品思维需要做到以下三点&#xff1a; 1、把握关键点的能力 2、出方案&#xff0c;协调资源&#xff0c;说服团队把资源倾斜到关键点上的能力 3、评估关键点进展程度的能力 『产品思维能…...

微信小程序卡片横向滚动竖图

滚动并不是使用swiper&#xff0c;该方式使用的是scroll-view实现 Swiper局限性太多了&#xff0c;对竖图并不合适 从左往右滚动图片示例 wxml代码&#xff1a; <view class"img-x" style"margin-top: 10px;"><view style"margin: 20rpx;…...

SpringBoot项目(支付宝整合)——springboot整合支付宝沙箱支付 从极简实现到IOC改进

目录 引出git代码仓库准备工作支付宝沙箱api内网穿透 [natapp.cn](https://natapp.cn/#download) springboot整合—极简实现版1.导包配置文件2.controller层代码3.进行支付流程4.支付成功回调 依赖注入的改进1.整体结构2.pom.xml文件依赖3.配置文件4.配置类&#xff0c;依赖注入…...

【AIGC】一款离线版的AI智能换脸工具V2.0分享(支持图片、视频、直播)

随着人工智能技术的爆发&#xff0c;AI不再局限于大语言模型&#xff0c;在图片处理方面也有非常大的进步&#xff0c;其中AI换脸也是大家一直比较感兴趣的&#xff0c;但这个技术的应用一直有很大的争议。 今天给大家分享一个开源你的AI换脸工具2.0&#xff0c;只需要一张所需…...

管理类联考——逻辑——真题篇——按知识分类——汇总篇——一、形式逻辑——选言——相容选言——或

文章目录 第五章 选言命题:相容选言-或;不相容选言-要么要么第一节 选言-相容选言-或-推结论-A或B为真,则非A→B,非B→A(否一则肯一)真题(2010-28)-选言-相容选言-或-推结论-(1)A或B为真,A为假:得B为真(否一则肯一);真题(2012-29)-选言-相容选言-或-推结论-(1)…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...