Redis__数据类型

文章目录

😊 @ 作者:Lion J
💖 @ 主页: https://blog.csdn.net/weixin_69252724
🎉 @ 主题:Redis__数据类型
⏱️ @ 创作时间:2024年04月28日
————————————————

这里写目录标题

  • 文章目录
  • Redis是什么?
    • NoSQL与原来的MySQL相比之下有什么优势:
    • Redis为什么这么快?
    • 为什么用Redis?
  • Redis的数据类型?
    • 基本数据类型
      • String
      • List
      • Hash 哈希
      • Set 集合
      • sorted set 有序集合
      • 总结
    • 三种基本数据类型
      • Bitmap(位图)
      • HyperLogLog(基数统计)
      • ***Geospatial(地理位置)
      • 总结

Redis是什么?

Redis 是一个 nosql 非关系型的数据库,支持网络,可基于内存也可持久化的,key-value 类型的数据库。
与一般数据库不同的是,redis 是存储在内存中的,他的读写速度非常快,常常被广泛应用到缓存之中。

NoSQL与原来的MySQL相比之下有什么优势:

  1. 易扩展,数据之间无关系,这样就非常容易扩展,无形之间也在架构的层面
    上带来了可扩展的能力。
  2. 高性能,NoSQL 数据库都具有非常高的读写性能,尤其在大数据量下,同样
    表现优秀。这得益于它的无关系性,数据库的结构简单。
  3. 灵活的数据模型 NoSQL 无须事先为要存储的数据建立字段,随时可以存储
    自定义的数据格式。’

Redis为什么这么快?

  1. Redis是基于内存, 内存的访问速度比磁盘快很多
  2. Redis 基于 Reactor 模式设计开发了一套高效的事件处理模型,主要是单线程事件循环和 IO 多路复用(Redis 线程模式后面会详细介绍到);
  3. Redis 内置了多种优化过后的数据类型/结构实现,性能非常高。
  4. Redis 通信协议实现简单且解析高效

那既然都这么快了,为什么不直接用 Redis 当主数据库呢?主要是因为内存成本太高且 Redis 提供的数据持久化仍然有数据丢失的风险。

为什么用Redis?

  1. 访问速度更快
    传统数据库数据保存在磁盘,而 Redis 基于内存,内存的访问速度比磁盘快很多。引入 Redis 之后,我们可以把一些高频访问的数据放到 Redis 中,这样下次就可以直接从内存中读取,速度可以提升几十倍甚至上百倍。
  2. 高并发一般像 MySQL 这类的数据库的 QPS 大概都在 4k 左右(4 核 8g) ,但是使用 Redis 缓存之后很容易达到 5w+,甚至能达到 10w+(就单机 Redis 的情况,Redis 集群的话会更高)。
    QPS(Query Per Second):服务器每秒可以执行的查询次数;

由此可见,直接操作缓存能够承受的数据库请求数量是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。进而,我们也就提高了系统整体的并发。

  1. 功能全面Redis 除了可以用作缓存之外,还可以用于分布式锁、限流、消息队列、延时队列、计数器、排行榜、数据排重等场景,功能强大!

Redis的数据类型?

Redis分为5中基本数据类型与3中特殊的数据类型

基本数据类型

Redis 共有 5 种基本数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。

这 5 种数据类型是直接提供给用户使用的,是数据的保存形式,其底层实现主要依赖这 8 种数据结构:简单动态字符串(SDS)、LinkedList(双向链表)、Dict(哈希表/字典)、SkipList(跳跃表)、Intset(整数集合)、ZipList(压缩列表)、QuickList(快速列表)。

  • Redis实现5种基本数据类型底层实现的数据结构如下表所示:
    在这里插入图片描述

String

String 是 Redis 中最简单同时也是最常用的一个数据类型。

String 是一种二进制安全的数据类型,可以用来存储任何类型的数据比如字符串、整数、浮点数、图片(图片的 base64 编码或者解码或者图片的路径)、序列化后的对象。

常用命令

SET key value                  --设置指定 key 的值
SETNX key value                --只有在 key 不存在时设置 key 的值
GET key                        --获取指定 key 的值
MSET key1 value1 key2 value2 ……--设置一个或多个指定 key 的值
MGET key1 key2 ...             --获取一个或多个指定 key 的值
STRLEN key返回 key             --所储存的字符串值的长度
INCR key                       --将 key 中储存的数字值增一
DECR key                       --将 key 中储存的数字值减一
EXISTS key                     --判断指定 key 是否存在
DEL key(通用)                 --删除指定的 key
EXPIRE key seconds(通用)      --给指定 key 设置过期时间 

应用场景

  1. 需要存储常规数据的场景
  • 举例:缓存 Session、Token、图片地址、序列化后的对象
    (相比较于 Hash 存储更节省内存)。
  • 相关命令:SET、GET。
  1. *需要计数的场景
  • 举例:用户单位时间的请求数(简单限流可以用到)页面单位时间的访问数
  • 相关命令:SET、GET、 INCR、DECR 。
  1. 分布式锁
  • 利用 SETNX key value 命令可以实现一个最简易的分布式锁(存在一些缺陷,通常不建议这样实现分布式锁)

List

许多高级编程语言都内置了链表的实现比如 Java 中的 LinkedList,但是 C 语言并没有实现链表,所以 Redis 实现了自己的链表数据结构。Redis 的 List 的实现为一个 双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。

常用命令

RPUSH key value1 value2 ... -- 在指定列表的尾部(右边)添加一个或多个元素
LPUSH key value1 value2 ... --在指定列表的头部(左边)添加一个或多个元素
LSET key index value        --将指定列表索引 index 位置的值设置为 value
LPOP key                    --移除并获取指定列表的第一个元素(最左边)
RPOP key                    --移除并获取指定列表的最后一个元素(最右边)
LLEN key                    --获取列表元素数量
LRANGE key start end        --获取列表 start 和 end 之间 的元素

应用场景

  1. 信息流展示
  • 举例:最新文章、最新动态。
  • 相关命令:LPUSH、LRANGE。

Hash 哈希

Hash 类似于 JDK1.8 前的 HashMap,内部实现也差不多(数组 + 链表)。不过,Redis 的 Hash 做了更多优化。

Redis 中的 Hash 是一个 String 类型的 field-value(键值对) 的映射表,特别适合用于存储对象,后续操作的时候,你可以直接修改这个对象中的某些字段的值。

常用命令

HSET key field value   --设置指定哈希表中指定字段的值
HSETNX key field value --只有指定字段不存在时设置指定字段的值
HMSET key field1 value1 field2 value2 ... --同时将一个或多个 field-value (域-值)对设置到指定哈希表中
HGET key field        --获取指定哈希表中指定字段的值
HMGET key field1 field2 ...--获取指定哈希表中一个或者多个指定字段的值
HGETALL key           --获取指定哈希表中所有的键值对
HEXISTS key field     --查看指定哈希表中指定的字段是否存在
HDEL key field1 field2 ...--删除一个或多个哈希表字段
HLEN key             --获取指定哈希表中字段的数量
HINCRBY key field increment--对指定哈希中的指定字段做运算操作(正数为加,负数为减) 

应用场景
对象数据存储场景

  • 举例:用户信息、商品信息、文章信息、购物车信息。
  • 相关命令:HSET (设置单个字段的值)、HMSET(设置多个字段的值)、HGET(获取单个字段的值)、HMGET(获取多个字段的值)。

Set 集合

Redis 中的 Set 类型是一种无序集合,集合中的元素没有先后顺序但都唯一,有点类似于 Java 中的 HashSet 。当你需要存储一个列表数据,又不希望出现重复数据时,Set 是一个很好的选择,并且 Set 提供了判断某个元素是否在一个 Set 集合内的重要接口,这个也是 List 所不能提供的。

你可以基于 Set 轻易实现交集、并集、差集的操作
比如你可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。这样的话,Set 可以非常方便的实现如共同关注、共同粉丝、共同喜好等功能。这个过程也就是求交集的过程。

常用命令

SADD key member1 member2 ...         --向指定集合添加一个或多个元素
SMEMBERS key                         --获取指定集合中的所有元素
SCARD key                            --获取指定集合的元素数量
SISMEMBER key member                 --判断指定元素是否在指定集合中
SINTER key1 key2 ...                 --获取给定所有集合的交集
SINTERSTORE destination key1 key2 ...--将给定所有集合的交集存储在 destination 中SUNION key1 key2 ...--获取给定所有集合的并集
SUNIONSTORE destination key1 key2 ...--将给定所有集合的并集存储在 destination 中SDIFF key1 key2 ...       --获取给定所有集合的差集
SDIFFSTORE destination key1 key2 ... --将给定所有集合的差集存储在 destination 中SPOP key count--随机移除并获取指定集合中一个或多个元素
SRANDMEMBER key count                -- 随机获取指定集合中指定数量的元素

应用场景

  1. 需要存放的数据不能重复的场景
  • 举例:网站 UV 统计(数据量巨大的场景还是 HyperLogLog更适合一些)、文章点赞、动态点赞等场景。
  • 相关命令:SCARD(获取集合数量) 。
  1. 需要获取多个数据源交集、并集和差集的场景
  • 举例:共同好友(交集)、共同粉丝(交集)、共同关注(交集)、好友推荐(差集)、音乐推荐(差集)、订阅号推荐(差集+交集) 等场景。
  • 相关命令:SINTER(交集)、SINTERSTORE (交集)、SUNION (并集)、SUNIONSTORE(并集)、SDIFF(差集)、SDIFFSTORE (差集)。
    ------
  1. 需要随机获取数据源中的元素的场景
  • 举例:抽奖系统、随机点名等场景。
  • 相关命令:SPOP(随机获取集合中的元素并移除,适合不允许重复中奖的场景)、SRANDMEMBER(随机获取集合中的元素,适合允许重复中奖的场景)。

sorted set 有序集合

Sorted Set 类似于 Set,但和 Set 相比,Sorted Set 增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,还可以通过 score 的范围来获取元素的列表。有点像是 Java 中 HashMap 和 TreeSet 的结合体

命令

ZADD key score1 member1 score2 member2 ..--.向指定有序集合添加一个或多个元素
ZCARD KEY--获取指定有序集合的元素数量
ZSCORE key member--获取指定有序集合中指定元素的 score 值
ZINTERSTORE destination numkeys key1 key2 ...--将给定所有有序集合的交集存储在 destination 中,对相同元素对应的 score 值进行 SUM 聚合操作,numkeys 为集合数量
ZUNIONSTORE destination numkeys key1 key2 ...--求并集,其它和 ZINTERSTORE 类似
ZDIFFSTORE destination numkeys key1 key2 ...--求差集,其它和 ZINTERSTORE 类似
ZRANGE key start end--获取指定有序集合 start 和 end 之间的元素(score 从低到高)
ZREVRANGE key start end--获取指定有序集合 start 和 end 之间的元素(score 从高到底)
ZREVRANK key member--获取指定有序集合中指定元素的排名(score 从大到小排序)

应用场景

  1. 需要随机获取数据源中的元素根据某个权重进行排序的场景
  • 举例:各种排行榜比如直播间送礼物的排行榜、朋友圈的微信步数排行榜、王者荣耀中的段位排行榜、话题热度排行榜等等。
  • 相关命令:ZRANGE (从小到大排序)、 ZREVRANGE (从大到小排序)、ZREVRANK (指定元素排名)

总结

在这里插入图片描述

三种基本数据类型

HyperLogLog(基数统计)、Bitmap (位图)、Geospatial (地理位置)。

Bitmap(位图)

Bitmap 存储的是连续的二进制数字(0 和 1),通过 Bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态,key 就是对应元素本身 。我们知道 8 个 bit 可以组成一个 byte,所以 Bitmap 本身会极大的节省储存空间。

你可以将 Bitmap 看作是一个存储二进制数字(0 和 1)的数组,数组中每个元素的下标叫做 offset(偏移量)。
在这里插入图片描述
常用命令

SETBIT key offset value     --设置指定 offset 位置的值
GETBIT key offset           --获取指定 offset 位置的值
BITCOUNT key start end      --获取 start 和 end 之前值为 1 的元素个数
BITOP operation destkey key1 key2 ...--对一个或多个 Bitmap 进行运算,可用运算符有 AND, OR, XOR 以及 NOT

引用场景

  • 举例:用户签到情况、活跃用户情况、用户行为统计(比如是否点赞过某个视频)。
  • 相关命令:SETBIT、GETBIT、BITCOUNT、BITOP。

HyperLogLog(基数统计)

***Geospatial(地理位置)

主要用于存储地理位置信息,基于 Sorted Set 实现。
通过 GEO 我们可以轻松实现两个位置距离的计算、获取指定位置附近的元素等功能。

常用命令

GEOADD key longitude1 latitude1 member1 ...--添加一个或多个元素对应的经纬度信息到 GEO 中
GEOPOS key member1 member2 ...             --返回给定元素的经纬度信息
GEODIST key member1 member2 M/KM/FT/MI     --返回两个给定元素之间的距离
GEORADIUS key longitude latitude radius distance--获取指定位置附近 distance 范围内的其他元素,支持 ASC(由近到远)、DESC(由远到近)、Count(数量) 等参数
GEORADIUSBYMEMBER key member radius distance--类似于 GEORADIUS 命令,只是参照的中心点是 GEO 中的元素

应用场景
需要管理使用地理空间数据的场景

  • 举例:附近的人。
  • 相关命令: GEOADD、GEORADIUS、GEORADIUSBYMEMBER 。
    总结

总结

数据类型DSC
Bitmap你可以将 Bitmap 看作是一个存储二进制数字(0 和 1)的数组,数组中每个元素的下标叫做 offset(偏移量)。通过 Bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态,key 就是对应元素本身 。我们知道 8 个 bit 可以组成一个 byte,所以 Bitmap 本身会极大的节省储存空间。
HyperLogLogRedisRedis 提供的 HyperLogLog 占用空间非常非常小,只需要 12k 的空间就能存储接近2^64个不同元素。不过,HyperLogLog 的计数结果并不是一个精确值,存在一定的误差(标准误差为 0.81% )。
导Geospatial indexGeospatial indexGeospatial indexGeospatial index(地理空间索引,简称 GEO) 主要用于存储地理位置信息,基于 Sorted Set 实现。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Virtualbox7.0.10--创建虚拟机

前言 下载Virtualbox7.0.10,可参考《Virtualbox–下载指定版本》 Virtualbox7.0.10具体安装步骤,可参考《Virtualbox7.0.10的安装步骤》 创建虚拟机 1.双击打开Virtualbox 后,单击“新建”,进入新建虚拟电脑页面 2. 设置虚拟电脑…

如何在Flask应用程序中使用JSON Web Tokens进行安全认证

密码、信用卡信息、个人识别号码(PIN)——这些都是用于授权和认证的关键资产。这意味着它们需要受到未经授权的用户的保护。 作为开发者,我们的任务是保护这些敏感信息,并且在我们的应用程序中实施强大的安全措施非常重要。 现在…

24.4.28(板刷dp,拓扑判环,区间dp+容斥算回文串总数)

星期一: 昨晚cf又掉分,小掉不算掉 补ABC350 D atc传送门 思路:对每个连通块,使其成为一个完全图,完全图的边数为 n*(n-1)/2 , 答案加上每个连通块成为完全图后的…

Anti-BAFF (mouse), mAb (blocking) (Sandy-2)

Adipogen开发了可以用于体内实验作为阻断剂的小鼠的抗BAFF单克隆抗体,为肿瘤学、免疫学、免疫治疗、自身免疫性疾病,小鼠模型体内实验等研究领域的实验者们对BAFF通路的研究提供了强有力的工具。 。 B细胞激活因子(BAFF)又称肿瘤坏…

通过Linux命令查看GPU使用情况以及各种参数解释

查看Linux服务器GPU使用情况,以及各种参数解释 查看GPU使用情况参数解释 查看GPU使用情况 静态查看命令 只能看当前这一时刻gpu的各项数据 nvidia-smi动态查看命令 顾名思义,可以实时监测gpu的各项数据。 watch -n 1 nvidia-smi参数解释 解释相关参…

国外大学和留学申请者之间的AI博弈

自推出 ChatGPT 以来,大学招生官一直在为生成式人工智能对大学申请文书所带来的影响而绞尽脑汁,应对这一变化的最直接的结果是,越来越多负责审阅申请资料的工作也被人工智能所取代。 用AI打败AI? 申请文书的替代方案 如今&#…

有趣的大模型之我见 | Llama AI Model

Llama 开源吗? 我在写《有趣的大模型之我见 | Mistral 7B 和 Mixtral 8x7B》时曾犹豫,在开源这个事儿上,到底哪个大模型算鼻祖?2023 年 7 月 18 日,Meta 推出了最受欢迎的大型语言模型(LLM)的第…

基于 Spring Boot 博客系统开发(二)

基于 Spring Boot 博客系统开发(二) 本系统是简易的个人博客系统开发,为了更加熟练地掌握SprIng Boot 框架及相关技术的使用。🌿🌿🌿 基于 Spring Boot 博客系统开发(一)&#x1f4…

git出错、文件无法删除、文件无法访问、文件或目录损坏且无法读取 等相关问题处理

一、错误历程与解决方案 1. 在用idea时,突然出现 部分git的命令无法使用,提示错误 2. 尝试删除项目文件夹,重新从git拉取代码 3.发现无法删除文件夹,删除操作没有任何反应,但是可以对文件夹重命名。 4.重新clone g…

Find My无人机|苹果Find My技术与无人机结合,智能防丢,全球定位

无人机是利用无线电遥控设备和自备的程序控制装置操纵的不载人飞机,或者由车载计算机完全地或间歇地自主地操作。无人机按应用领域,可分为军用与民用。军用方面,无人机分为侦察机和靶机。民用方面,无人机行业应用,是无…

ArcGIS Pro3.0软件破解版安装教程

软件名称:ArcGIS Pro 3.0 安装环境:Windows 软件大小:7.3GB 硬件要求:CPU2GHz,内存4G(或更高) 百度云下载链接 : https://pan.baidu.com/s/1CXy1MSwdQXdVnJoV2X422A 提 取 码 :r0w1 教学内…

【多维动态规划】Leetcode 64. 最小路径和【中等】

最小路径和 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 1: 输入:grid [[1,3,1],[1,5,1],[4,2,1]] 输出…

HotSpot JVM 为啥要叫做 HotSpot JVM?

1. Java与编译相关的三个概念: 首先了解三个概念 前端编译解释执行编译执行 ▌1.1、前端编译 编译器(javac)将源文件(.java)编译成java字节码文件(.class)的步骤是前端编译。 ▌1.2、解释执…

日本极致产品力 | 源自内蒙古,日本99.7%的人都喝过都百年畅销饮料

​《极致产品力》日本深度研学是一个顾问式课程,可以帮助企业找产品、找方向、找方法,在日本终端市场考察中洞悉热销产品背后的成功逻辑,了解最新最前沿的产品趋势和机会。结合日本消费趋势中国转化的众多经验,从品牌、包装、卖点、技术和生产工艺等多方面寻找中国市场的解决方…

【Linux系统化学习】死锁 | 线程同步

目录 死锁 死锁的必要条件 避免死锁 线程同步 条件变量 同步概念和竞态条件 条件变量接口 创建和初始化条件变量 等待条件满足 唤醒等待 毁条件变量 为什么 pthread_cond_wait 需要互斥量? 条件变量使用规范 等待条件代码 给条件发送信号代码 死锁 死锁是指在一…

Agent AI智能体在未来,一定与你我密不可分

随着Agent AI智能体的逐渐成熟,人工智能应用的不断深入与拓展,相信在不久的将来,他与你我的生活一定是密不可分的。 目录 ​编辑 1 Agent AI智能体是什么? 2 Agent AI在语言处理方面的能力 2.1 情感分析示例 2.2 文本分类任…

开发总结-Dao层(Mapper层)

Mybatis-plus新用法 VehicleBO one vehicleService.getOne(Wrappers.<VehicleBO>lambdaQuery().eq(VehicleBO::getVin, reqVo.getVin()));boolean b bizAccountApplyService.remove(Wrappers.<BizAccountApplyBO>lambdaQuery().eq(BizAccountApplyBO::getId, 14…

第一阶段--Day2--信息安全法律法规、网络安全相关标准

目录 1. 针对信息安全的规定 2. 网络安全相关标准 1. 针对信息安全的规定 《中华人民共和国计算机信息系统安全保护条例》1994年2月18日颁布并实施 中华人民共和国计算机信息系统安全保护条例__增刊20111国务院公报_中国政府网 《中华人民共和国国际联网安全保护管理…

纯血鸿蒙APP实战开发——Navigation实现多设备适配案例

介绍 在应用开发时&#xff0c;一个应用需要适配多终端的设备&#xff0c;使用Navigation的mode属性来实现一套代码&#xff0c;多终端适配。 效果图预览 使用说明 将程序运行在折叠屏手机或者平板上观看适配效果。 实现思路 本例涉及的关键特性和实现方案如下&#xff1a…

Android 音视频播放器 Demo(一)—— 视频解码与渲染

本篇作为 Android 音视频实战系列的第二篇文章&#xff0c;主要介绍视频解码与渲染过程。本系列文章目录如下&#xff1a; Android 音视频基础知识 Android 音视频播放器 Demo&#xff08;一&#xff09;—— 视频解码与渲染 Android 音视频播放器 Demo&#xff08;二&#xff…