Redis系列---数据管理

Java 高频面试题场景(二):老年健康手环数据管理系统 老年健康手环数据管理系统是基于Spring Boot的后端开发项目,主要功能包括实时健康数据采集、异常预警和健康报告生成。系统采用MySQL存储数据,Redis缓存热点数据,RabbitMQ处理异常报警。关键技术点包括:1)通过Redis缓存机制优化高频查询性能;2)使用RabbitMQ消息队列实现异步报警通知;3)蓝牙SDK对接实现稳定数据传输;4)MyBatis动态SQL高效操作数据库。项目解决了依赖冲突、端口占用等Spring Boot常见问题,并通过令牌认证、数据加密和接口限流等措施保障系统安全性。 阅读详情

数据类型

redis中value的最大容量默认是 512M,各个数据类型初始容量如下:

  1. String:512M
  2. Set,ZSet,List,Hash:2^32 -1 个元素

总结:任何系统都是在内存和性能之间不断抉择,使用最少的内存提供可接受的反应速度。redis亦如此。

String

优点

简单直观,便捷存储单个元素/散列元素。提供字符串函数,append等

缺点

占用过多的键,内存占用量较大,同时用户信息内聚性比较差。难以管理

底层结构

简单动态字符串(simple dynamic string),字节数组+未用空间+已用空间,预分配空间,方便快速扩容及确定字段长度,牺牲空间换时间

使用场景

可以存储任意类型的数据,包括文本、数字等。

实际使用

  • 热点用户个人信息
  • 库存计数器
  • 分布式锁
  • 项目奖品策略
  • 广告点击次数
  • 验证码

List

优点

存储有序数据,支持从列表的两端进行元素的插入和删除操作。

缺点

数据耦合高,取内部元素相对耗时

底层结构

老版本是双向链表+压缩列表,双向链表即pre+value+next,压缩链表即分配一段连续内存,省掉pre和next的损耗,前者适合大量元素,后者适合少量元素;

新版本采用快速链表,是前两者的融合,pre+小型双向链表+next,即将长度较大的双向链表进行分段存储。

  • 压缩列表ziplist (插入元素过多或字符串太大,就需要调用 realloc 扩展内存 )
  • 双向链表linkedlist (需附加指针prev 和 next,较浪费空间,加重内存的碎片化 )

因为双向链表占用的内存比压缩列表要多,所以当创建新列表时,会优先考虑使用压缩列表,并且在有需要的时候才从压缩列表实现转换到双向链表实现。

压缩列表转化成双向链表条件有两个:

  • 列表中某个字符串值超过 list_max_ziplist_value(默认64字节 )
  • 列表的元素个数超过 list_max_ziplist_entries(默认 512个 )

使用场景

有序消息,或者固定容量数据。例如消息队列、最新消息排行

实际使用

消息队列虽然可以但不建议因为redis会丢消息,它是缓存不是持久存储,除非是不重要的消息;

  • 广告展示,默认展示最新条数,设置长度固定的list,每次从顶端插入,从尾端剔除元素;
  • 中奖名单,同样固定容量,顶端插入提出尾部元素。

Hash

优点

通过一个key对应多个字段和对应的值,适用于存储对象属性、配置信息等复杂数据结构。

缺点

数据占用空间过大时增删耗时旧,甚至引起reids卡顿

底层结构

压缩列表+hashtable,与list的压缩列表不同的是,它存储的不仅是feild+value交替存储;hashtable即java的hashmap,数组+链表。
渐进式扩容:新老hashtable交替执行,即旧数据慢慢同步至新hashtable中。

新建hash值时优先使用压缩列表实现,压缩列表使用更加紧凑的连续内存结构可以节省空间,其读写复杂度为O(n);当数据量过大或者字段过多读写效率减低,此时会转化为hashtable,占用更多的内存,读写复杂度降低为O(1)。转化条件:

  • 哈希类型元素个数大于hash-max-ziplist-entries配置(默认512个)
  • 有字段值大于hash-max-ziplist-value配置(默认64字节)

使用场景

总是需要获取单一属性的值,数据既耦合又方便存取。

实际使用

  • 地理位置信息对应关系
  • 项目配置信息

Set

优点

无序集合,可以存储多个字符串元素,并提供高效的集合操作,如交集、并集、差集等。

缺点

大量数据会导致redis卡顿

底层结构

intset+hashTable;采用hashTable存储,只是value统一设置为null,为什么不用ziplist来节省空间是因为必须保证元素的唯一性。

inset可理解为数组,使用intset存储必须满足下面两个条件,否则使用hashtable,条件如下:

  • 对象保存的所有元素都是整数值(int)
  • 对象保存的元素数量不超过512个

使用场景

需要进行集合运算的数据。

  • 例如文章标签管理-可根据多个标签聚合查询文章;
  • 社交网络好友关系-将每个用户的好友列表存储在Redis的集合中,使用集合操作可以快速判断两个用户是否是好友,还可以进行好友推荐等功能。

实际使用

  • 经销商的门店服务列表,业务员可以交叉负责经销商底下的门店,利用经销商和门店的归属关系可以去重聚合出经销商的门店列表;
  • 策略集聚合,一个转盘会对应多个策略集,通过条件判断出新老用户概念,确定出需要聚合哪些的策略。

Zset

优点

存储多个字符串元素,并为每个元素关联一个分数,支持按照分数进行排序和范围查找。

缺点

  • 内存开销:Zset是基于跳表和哈希表实现的,存储数据时,会占用比简单的集合或列表更多的内存。因此,在存储较大规模的数据时,内存开销可能会显著增加。

  • 性能开销:在一些特定操作中,如按得分范围查询(ZRANGEBYSCORE)或根据排名进行范围查询(ZRANGE),操作的复杂度为O(log(N) + M),其中N是集合的大小,而M是返回的小集合大小。这与其他类型的数据结构相比,可能在性能上有所逊色,尤其是在处理大数据量时。

  • 数据排序:虽然Zset提供了自动排序功能,但在某些情况下(如频繁更新得分),这可能导致性能下降,尤其是在需要多次更新和读取的场景下。

底层结构

hashtable+skiplsit,hashtable存储k-score, skiplist中的每个node存储 层级+value+score,插入时按照score排序。

当元素数量不多时,hashtable和SkipList的优势不明显,而且更耗内存。因此zset还会采用ZipList结构来节省内存。

查询效率和红黑树相当。

使用场景

需要排序的数据

实际使用

业务员的补货数量排名。

HyperLogLog

优点

在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

缺点

HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

底层结构

类似于java的set

使用场景

比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。

实际使用

需要用set的地方都可以使用

GEO

优点

进行坐标计算

缺点

相较于一些专门的地理空间数据库(如 PostGIS),Redis Geo 的地理空间索引功能较为基本,可能不适合需要复杂空间分析的应用。

底层结构

有序集合(Sorted Set):Redis 使用有序集合来存储地理位置数据,每个地理位置由一个成员(通常是地点的名称或标识符)和对应的分值(经纬度信息)组成。分值是通过将经纬度转化为一个可以唯一标识该点的整数值。

使用场景

地理位置计算

实际使用

附近门店功能

Stream

简介

Stream 是 Redis 5.0 版本新增加的数据结构,主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能。
但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。

使用场景

在处理可丢失的信息时可以采用该方式,但一定要配合兜底的定时任务,防止消息丢失后完全处理失败。

实际使用

入金后修改只读账号状态

BitMap

Bitmap数据类型可以看作是一种特殊的字符串,它所占用空间中的每一个bit都只能是0或1。Redis内部将每个字符(bit)作为一个元素来处理,因此我们可以在非常小的空间中存储大量的位信息。这使得Bitmap非常适合于存储和处理大规模的布尔型信息,如用户的在线状态、活跃用户、用户访问记录等。

统计消费者的参与情况,和业务员的工作情况。

类型抉择

  • 多个集合操作(聚合操作)----用Set;
  • 集合数据排序(排序操作) ---- 分页排序建议使用ZSet;
  • 集合数据只有0、1两种状态(二值型数据)----------- 0/1状态数据建议使用Bitmap;
  • 集合中不重复元素个数(基数统计)----如果数据量达到亿级的话建议使用HyperLogLog。

当然以上都是套话,任何抉择都一样,搞清楚自己的需求,对症下药即可,当你对各种数据类型的特性了解之后,自然就可以做出最正确的选择。何时何地何事都如此。

空间占用

以String类型计算,k是tc:jdb:/UZJXTIP0CTZ6L0 v是32010670;

  • 2.4kw 5G
  • 1ww 25G

总结起来就是 1个kv占用218B。而在计算机中,一个英文字母/整数通常占用1个字节(1 B)。这是因为在使用 ASCII 编码时,单个英文字母(无论是大写还是小写)或者整数都可以用一个字节表示。

所以redis的空间占用大概是字节数的7倍。

数据特征

Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态。TTL返回的值有三种情况:正数,-1,-2

  • 正数:代表该数据在内存中还能存活的时间
  • -1:永久有效的数据
  • -2:已经过期的数据 或被删除的数据 或 未定义的数据

redis中的过期时间是单独存储的,Hash结构,field是内存地址,value是过期时间,保存了所有key的过期描述,在最终进行过期处理的时候,对该空间的数据进行检测, 当时间到期之后通过field找到内存该地址处的数据,然后进行相关操作。

在这里插入图片描述

数据删除策略

删除策略就是针对已过期数据的处理策略,已过期的数据是真的就立即删除了吗?其实并不是,redis有多种删除策略,在不同的场景下使用不同的删除方式会有不同效果。

不同的删除策略就是对内存占用与CPU占用之间的不同侧重。目前有三种删除策略:

  1. 定时删除:时间换空间,通过对cpu的无间断占用节约内存
  2. 惰性删除:空间换时间,通过对内存的占用节约cpu资源
  3. 定期删除:折中方案,花费少量cpu资源节约少量内存

定时删除

创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作
在这里插入图片描述

惰性删除

数据到达过期时间,不做处理,等该数据被访问时进行过期判断。如果未过期,直接返回数据,如果已过期,先删除数据,再返回数据不存在
在这里插入图片描述

定期删除

定时删除和惰性删除这两种方案都是走的极端,那有没有折中方案?是的,redis还引入了一种定期删除策略,进行了空间和性能的折中处理

已知redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,该方案是默认每秒进行十次过期扫描(100ms一次),过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。

  • 从过期字典中随机 20 个 key;
  • 删除这 20 个 key 中已经过期的 key;
  • 如果过期的 key 比率超过 1/4,那就重复步骤 1;

数据淘汰策略

基于FPGA的函数信号发生器设计 设计采用波形查找表和相位累加器的方法实现DDS,查找表的数据位宽为8位,采样点数为4096。波形产生范围是100Hz-20MHz,最小频率间隔为1Hz,用8个数码管显示频率,可产生正弦波、方波、三角波,波形用两个led显示,select信号控制,全灭为正弦波,一亮一灭为方波,全亮为锯齿波。为了使频率和相位便于调节,用3个拨码开关控制步进,用8个led显示状态。 阅读详情

相关推荐

把“思考”塞进 1 KB:我用纯 C 语言给单片机手搓了一个微型 Transformer 推理引擎

摘要:本文探讨了在64KB SRAM的MCU(如STM32H743)上部署精简Transformer模型的技术方案。通过将6层Transformer压缩至1层(隐藏维度128)、4-bit KV-Cache量化等优化手段,实现了240KB Flash占用和59KB RAM峰值,推理延迟184ms(400MHz Cortex-M7),准确率96.1%。关键创新包括:手工优化矩阵乘(CMSIS-NN)、查表法Softmax/LayerNorm、权重按Tile重排提升Cache命中率(60%→94%)。

qq_74383080的博客 2916

Redis之key和value可以存储的最大值

Redis之key和value可以存储的最大值

weixin_52690231的博客 1万+

实现飞书机器人推送消息到指定群组或者用户

飞书是一个集成了聊天、协作和办公功能的企业级平台,广泛应用于企业内部沟通和协作。飞书机器人(Feishu Bot)是一种强大的工具,允许开发者通过编程接口与飞书进行互动,从而实现自动化消息推送和任务管理。本文将详细介绍如何通过飞书机器人推送消息给指定的人或者群组,帮助您快速上手。

qq_41898196的博客 5852

redis各个类型的value值的最大容量

redis

彼岸花开 1477

【鸿蒙游戏上架审核规范指南】

华为鸿蒙游戏上架审核规范指南摘要

weixin_44161102的博客 897

Unity UI Toolkit避坑指南:从官方Samples到实际项目,这些‘坑’我帮你踩过了

本文分享了Unity UI Toolkit在实际项目中的避坑经验和优化技巧,包括动画系统的高效替代方案、3D世界UI的创新实现方式、USS样式继承的反直觉规则等。通过详细的代码示例和性能优化策略,帮助开发者避免常见陷阱,提升开发效率。

weixin_29535577的博客 337

Redis面试题

redis是一个内存数据库,数据的读写操作都在内存中进行,因此速度非常快,常用于缓存,消息队列,分布式锁等场景。

jackhman的博客 1805

展锐平台wifi连接性问题解决方案

对于断开连接的问题,需要从kernel log中确认下,是上 层主动发起的断开(会下发disconnect的命令),还是CP侧上报的断开事件。同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。1、出现wifi连接正常,但无法上网问题,首先确认其他手机是否可以正常上网,排除网络自身问题;3 路由器配置问题,出现过一个案例,恢复出场设置问题就解决了,具体根因。

手机-手表蓝牙开发工程师的博客 2016

Redis的key和value大小限制 | value需要压缩吗?

Redis的key和value大小限制

西京刀客 1万+

【网络教程】Ubuntu有线连接消失,无法联网怎么办!(亲测有效!)

文章目录问题描述解决方案 问题描述 今天打开Ubuntu,突然发现无法连接网络,并且打开设置,发现设置里面的网络已经没有了有线连接,只有VPN设置选项,如图 解决方案 按照下列的代码执行即可! # 关闭网路 service NetworkManager stop # 删除NetworkManager缓存文件 sudo rm /var/lib/NetworkManager/NetworkManager.state # 打开网络 service NetworkManager start 运行完

XiaoqiangClub的博客 1万+

仿真学习系列(四十三):Sigrity仿真之平面谐振分析

在 SIGRITY 中,平面谐振分析(Plane Resonance Analysis)是一种用于分析信号完整性(SI)问题的高级仿真方法,尤其关注于层间电磁波的传播、谐振现象和信号衰减等问题。平面谐振分析通常用于电源分配网络(PDN)、信号线和参考平面之间的相互作用。本文将详细介绍如何在 SIGRITY 中进行平面谐振分析,并提供一些实用的分析方法与步骤,帮助工程师们识别和优化可能存在的设计问题。

案例文章,高速信号 475

Redis的 key 和 value大小限制

Redis 的 Keys 和 Values 都是 512 M的限制 官网介绍:https://redis.io/topics/data-types-intro

查理王的博客 1862

Meta新开源多语种语音基座Omnilingual ASR

Meta FAIR 团队最近祭出了,这不仅仅是对 MMS (Massively Multilingual Speech) 的简单升级,而是一次从“多任务学习”向“上下文学习(In-Context Learning)”的范式跃迁。通过将 Wav2Vec 2.0 编码器扩展至 70 亿参数,并引入 LLM 风格的 Decoder,Omnilingual ASR 不仅原生支持 1600+ 种语言,更具备了类似 GPT 的“零样本”扩展能力——只需给出几个音频-文本对,即可解锁从未见过的语言。

kakaZhui的博客 144

Redis 命令:哈希

与将多个键值对存储在多个 key 中相比,Hash 结构通过一个 key 以及内部的 field-value 可以存储更丰富的数据信息,并且获取数据时无需多个查询,可以实现更高效的数据访问。例如,如果我们有一个用户ID为查找的 key,我们可以将用户的多个属性(如姓名、年龄、生日等)作为 value 存储在哈希表中。通过 key 和 field,我们可以在 O(1) 时间内查找到相应的 value,避免了在多个 key 中查找的开销和并发修改控制的问题。是哈希表的名称,可以根据实际情况进行替换。

梁辰兴的博客 754

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Redis数据库的安装和使用(三)-哈希表相关指令

Redis数据库中hash部分 什么是哈希表 首先,先了解一下哈希表,相对于对于列表(list)的了解,哈希表就比较陌生了,哈希表在百度词典中的定义为: 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 因为本身接...

weixin_43327425的博客 1102

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

csredis封装_封装redis方法

public static classRedisHelper{public static readonlyConnectionMultiplexer _connectin;/// ///数据库id/// public static int DbNum { get; set; }/// ///连接方式/// public static string ConnectionString { get; s...

weixin_39874589的博客 325

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

redis key的淘汰策略

Redis中共有下面八种内存淘汰策略: volatile-lru:设置了过期时间的key使用LRU算法淘汰; allkeys-lru:所有key使用LRU算法淘汰; volatile-lfu:设置了过期时间的key使用LFU算法淘汰; allkeys-lfu:所有key使用LFU算法淘汰; volatile-random:设置了过期时间的key使用随机淘汰; allkeys-random:所有key使用随机淘汰; volatile-ttl:设置了过期时间的key根据过期时间淘汰,越早过期越早淘汰; noe

horse_xiao的博客 983

无涯教程-Redis - Hashes(哈希)

Redis哈希是字符串字段和字符串值之间的映射,在Redis中,每个哈希可以存储多达40亿个字段-值对(field-value)。

无涯教程 1136

Redis-Jedis-String

package com.redis.string; import com.redis.util.RedisUtil; import org.junit.jupiter.api.Test; import redis.clients.jedis.Jedis; import java.util.List; public class StringTest { /** * get ...

jinjin603的博客 365

Redis五大数据类型——Hash哈希

Redis五大数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sorted set:有序集合)。 一、介绍 Redis 中的(Hash)类型是一个 String 类型与 field 和 field-value 的映射表,适用于存储对象,将一个对象类型存储在Hash类型中要比存在 String 类型中占用要更小,更加节省内存空间 以下是 String 类型和 Hash 类型的结构比较: 二、数据结构 底层使用两种数据结构存...

祝我飞黄腾达 3287

关于Redis技术文章整理(C#.NET)

本文主要贴一些学习链接:以便查看。 (一):C#中使用Redis学习一 windows安装redis服务器端和客户端 (二):C#中使用Redis学习二 在.NET4.5中使用redis hash操作 (三):在c#中使用servicestackredis操作redis(很具体操作:五颗星) (四):Redis安装及C# 调用 (五):win7x64下的redis安装与使用 (六):R...

Kevin.Chen - 专注前行 209

redis——list类型的设计与实现

Redis list  --  双向链表,l(L)开头 命令 效果 备注 lpush listkey value 在list的头部添加value  lpush list01 lzj lrange listkey start end 表示从下标start开始取到end    lrang

此岸花开 638

redis学习-String类型的命令介绍以及特殊情况分析

接下来的所有类型的操作中,-1都代表最后。。创建键值对,当再次set已经存在的key时会覆盖掉之前的value;并且set可以将任意类型的数据转换成一个string类型的数据,比如对一个list类型的list1使用set list1 abc可以将list替换为string类型的abc。2. get key获取key对应的内容,仅对string类型的value使用。对指定key的value后添加其他信息,即对value的内容进行字符拼接;添加后会返回value的长度;

qq_65568592的博客 1107

探索社交智能新境界:Sotopia,一个开放的交互式学习环境

探索社交智能新境界:Sotopia,一个开放的交互式学习环境 在这个人工智能迅速发展的时代,我们迎来了Sotopia——一个旨在推动社会智能在语言代理中实现飞跃的开放式学习平台。通过本文,我们将一同揭秘Sotopia的精髓,探讨其技术深度,展示它无限的应用潜力,并突出其独特特性。 项目介绍 Sotopia,正如它的名字所寓意的那样,是一个乌托邦式的环境,在这里,代理(Agent)不仅能够交流互动,...

gitblog_00913的博客 834

redis || 通用命令和数据类型(string)

也就是字符串类型,是redis中最简单的存储类型。string:普通字符串。int:整数类型,可以做自增、自减操作。float:浮点类型,可以做自增、自减操作。不管是那种格式,底层都是字节数组成形式存储,只不过是编码方式不同。字符串类型的最大空间都不能超过512m。

qq_60271706的博客 108

Redis常用的基本命令整理

SET key value [EX seconds] [PX milliseconds] [NX|XX] 设置缓存K-V,如果key 已经存在,则重写 EX seconds -- 设置过期时间, 单位:seconds PX milliseconds -- 设置过期时间,单位:milliseconds NX -- 只有key 不存在时才设置K-V XX -- 只有key 存在时...

weixin_30469895的博客 145
上一篇: 微信开发心得
下一篇: Redis系列---常见问题
lipviolet
博客等级 码龄8年 5941粉丝 141原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lipviolet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值