Redis数据类型——针对实习面试
目录
- Redis数据类型
- Redis常用的数据类型有哪些?
- String类型可以用于哪些场景?
- Set类型可以用于哪些场景?
- Bitmaps类型可以用于哪些场景?
- HyperLogLog类型可以用于哪些场景?
- Hash类型与Set类型有什么区别?
- Hash类型
- Set类型
- 如何用Redis实现排行榜功能?
- 1. 使用Sorted Set存储排行榜数据
- 2. 添加或更新用户分数
- 3. 获取排行榜
- 4. 用户分数变化
- 5. 删除用户
- 6. 获取用户排名
- 7. 范围查询
- 8. 排行榜的维护
Redis数据类型

Redis常用的数据类型有哪些?
-
String(字符串)
- 基本的字符串值,实际上是二进制安全的,可以包含任何数据,如文本或者二进制数据(图片、序列化的对象等)。
- 常用操作:
SET、GET、DEL、INCR(自增)、DECR(自减)等。
-
List(列表)
- 一个有序集合,可以添加、移除、查询元素。
- 常用操作:
LPUSH/RPUSH(在列表两端插入元素)、LPOP/RPOP(从列表两端弹出元素)、LRANGE(获取列表指定范围内的元素)等。
-
Set(集合)
- 一个无序集合,可以添加、移除、查询元素,自动处理重复。
- 常用操作:
SADD(添加元素)、SREM(移除元素)、SISMEMBER(判断元素是否存在)、SUNION(集合的并集)等。
-
Hash(哈希)
- 一个键值对集合,适合存储对象。
- 常用操作:
HSET(设置字段值)、HGET(获取字段值)、HDEL(删除字段)、HGETALL(获取所有字段和值)等。
-
Sorted Set(有序集合)
- 一个有序集合,每个元素关联一个分数,可以进行范围查询。
- 常用操作:
ZADD(添加元素)、ZRANGE(获取指定排名范围的元素)、ZREM(移除元素)、ZINCRBY(增加元素分数)等。
-
Bitmaps(位图)
- 通过String类型实现的位图,适合用于处理二进制开关,如签到功能。
-
HyperLogLog(基数统计)
- 用于基数统计,可以估算一个集合中不同元素的数量,占用空间固定且很小。
-
Geospatial(地理空间)
- 用于存储地理位置信息,支持计算两点间的距离和查询指定范围内的地理位置。
- 常用操作:
GEOADD(添加地理位置)、GEODIST(计算距离)、GEORADIUS(查询指定范围内的地理位置)等。
String类型可以用于哪些场景?
Redis的String类型是最基本的数据类型,它可以存储任何形式的字符串,包括二进制数据。以下是String类型可以用于的一些常见场景:
-
缓存
- 缓存是String类型最常见的用途之一。可以缓存数据库查询结果、对象、页面内容等,以减少数据库访问次数,提高系统性能。
-
计数器
- 由于String类型支持自增(
INCR)和自减(DECR)操作,它可以被用作计数器,例如统计页面访问次数、投票系统中的投票数等。
- 由于String类型支持自增(
-
会话存储
- 在分布式系统中,String类型可以用来存储用户会话信息,如用户登录状态、购物车信息等。
-
限速(Rate Limiting)
- 利用String类型的自增特性,可以实现令牌桶或漏桶算法来限制用户请求的频率。
-
分布式锁
- 可以使用String的
SETNX命令(如果键不存在则设置键的值)来实现分布式锁,以协调分布式系统中的资源访问。
- 可以使用String的
Set类型可以用于哪些场景?
Redis的Set类型是一个无序且元素唯一的集合,适用于多种场景,以下是一些常见的应用场景:
-
标签系统:在社交网络或博客平台中,可以将用户的兴趣标签存储在Set中,方便进行集合运算,如找出同时拥有某两个标签的用户。
-
去重功能:在需要确保数据唯一性的场景下,如热门搜索词、访问日志的去重,可以通过Set的唯一性特性来避免重复数据。
-
投票系统:在投票系统中,Set可以用于记录每个选项的投票者,由于Set不允许重复,这样可以确保每个用户只能对每个选项投一次票。
-
共同好友功能:在社交网络中,可以使用Set来存储每个用户的好友列表,通过计算两个Set的交集,可以找出两个用户之间的共同好友。
-
抽奖活动:在抽奖活动中,Set可以用来存储中奖者名单,由于Set具有去重功能,可以保证同一个用户不会中奖两次。
Bitmaps类型可以用于哪些场景?
Bitmap 存储的是连续的二进制数字(0 和 1),通过 Bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态,key 就是对应元素本身 。我们知道 8 个 bit 可以组成一个 byte,所以 Bitmap 本身会极大的节省储存空间。你可以将 Bitmap 看作是一个存储二进制数字(0 和 1)的数组,数组中每个元素的下标叫做 offset(偏移量)
以下是Bitmaps类型可以用于的一些场景:
-
用户在线状态:记录用户的在线或离线状态,使用位来表示每个用户的状态,其中1表示在线,0表示离线。
-
统计每日活跃用户:统计每天的活跃用户数量,可以为每一天创建一个单独的bitmap,每一位代表一个用户,如果用户在某一天登录,则将对应位置设为1。使用
BITCOUNT命令可以快速统计出当天有多少个活跃用户。 -
记录用户行为:记录用户的特定行为,如是否阅读了某篇文章、是否购买了某个商品等,每一位代表一个用户的行为。
-
签到系统:实现用户的签到功能,可以用一个bitmap来记录用户的签到情况,每一位代表一天,如果用户签到了就设置为1,否则为0。通过
BITCOUNT可以计算用户的连续签到天数。
HyperLogLog类型可以用于哪些场景?
Redis的HyperLogLog类型是一种概率数据结构,用于高效地估算集合中唯一元素的基数(即不重复元素的数量)。以下是HyperLogLog可以用于的一些场景:
-
独立访客计数(UV统计):统计网站或应用的独立访客数量,了解实际用户的数量,而不是简单地统计页面访问次数。
-
去重后的事件计数:在日志分析中统计独立操作次数,或者在广告分析中统计去重后的广告曝光次数或点击次数。
-
社交网络中的独立用户统计:估计某个话题的独立参与用户数量或某个用户的独立粉丝数量。
HyperLogLog的优势在于其高效率和极低的内存占用,通常只需要12KB的存储空间就可以估计数亿个唯一元素。不过,需要注意的是,HyperLogLog提供的是近似值,其标准误差为0.81%,对于大多数应用场景来说,这种误差是可以接受的。
Hash类型与Set类型有什么区别?
Redis的Hash类型和Set类型都是用于存储集合的数据结构,但它们在存储和使用上有一些关键的区别:
Hash类型
- 存储结构:Hash类型在Redis中是一个键值对集合,每个Hash可以存储多个字段(field)和值(value)对。
- 适用场景:
- 存储对象:Hash类型适合存储对象,因为对象通常由多个属性组成,每个属性可以看作是一个字段。
- 存储映射:当需要将一个键映射到多个值时,Hash类型可以作为一个映射表来使用。
- 操作:Hash类型支持对单个字段的操作,如
HSET(设置字段值)、HGET(获取字段值)、HDEL(删除字段)等。 - 内存效率:由于Hash类型存储的是键值对,因此对于存储具有多个属性的对象来说,它比Set类型更节省内存。
- 查询:可以查询Hash中的单个字段,也可以查询整个Hash的所有字段和值。
Set类型
- 存储结构:Set类型是一个无序集合,只存储独立的值,不存储键值对。
- 适用场景:
- 去重:当需要存储一组不重复的元素时,Set类型是一个很好的选择。
- 集合运算:Set类型支持集合的交集、并集、差集等操作,适合需要进行集合运算的场景。
- 操作:Set类型支持添加、删除、查询元素,以及集合运算,如
SADD(添加元素)、SREM(删除元素)、SISMEMBER(判断元素是否存在)等。 - 内存效率:由于Set类型只存储值,不存储键值对,因此对于只包含单个值的集合来说,它比Hash类型更节省内存。
- 查询:只能查询Set中的元素是否存在,不能查询元素的属性或值。
总结
- Hash类型适合存储和操作具有多个属性的对象或键值对集合。
- Set类型适合存储不重复的元素集合,并进行集合运算。
如何用Redis实现排行榜功能?
使用Redis实现排行榜功能是一种常见的应用场景,主要可以利用Redis的Sorted Set(有序集合)数据类型来实现。以下是实现排行榜功能的基本步骤和方法:
1. 使用Sorted Set存储排行榜数据
Sorted Set中的每个元素都会关联一个分数(score),这个分数可以用于对元素进行排序。在排行榜场景中,可以将用户的ID作为元素,将用户的分数(如积分、排名分等)作为score。
2. 添加或更新用户分数
使用ZADD命令向Sorted Set中添加新的用户或更新现有用户的分数。如果用户不存在,则添加用户;如果用户已存在,则更新其分数。
ZADD leaderboard <score> <user_id>
3. 获取排行榜
- 获取全部排行榜:使用
ZRANGE命令可以获取排行榜中的全部或部分用户及其分数。
ZRANGE leaderboard 0 -1 WITHSCORES
- 获取指定排名的用户:通过指定
ZRANGE命令的起始和结束索引,可以获取特定排名范围内的用户。
ZRANGE leaderboard <start_rank> <end_rank> WITHSCORES
4. 用户分数变化
当用户的行为导致其分数变化时,使用ZINCRBY命令来增加或减少用户的分数。
ZINCRBY leaderboard <increment> <user_id>
5. 删除用户
如果需要从排行榜中删除用户,可以使用ZREM命令。
ZREM leaderboard <user_id>
6. 获取用户排名
使用ZRANK或ZREVRANK命令可以获取用户在排行榜中的排名。
ZRANK leaderboard <user_id>
7. 范围查询
如果需要获取某个分数范围内的用户,可以使用ZRANGEBYSCORE命令。
ZRANGEBYSCORE leaderboard <min> <max> WITHSCORES
8. 排行榜的维护
- 定期清理:根据业务需求,可能需要定期清理排行榜,比如移除长时间不活跃的用户。
- 持久化:为了保证排行榜数据的安全性,可以配置Redis的持久化选项,如RDB或AOF。
相关文章:
Redis数据类型——针对实习面试
目录 Redis数据类型Redis常用的数据类型有哪些?String类型可以用于哪些场景?Set类型可以用于哪些场景?Bitmaps类型可以用于哪些场景?HyperLogLog类型可以用于哪些场景?Hash类型与Set类型有什么区别?Hash类型…...
roberta融合模型创新中文新闻文本标题分类
项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…...
《密码系统设计》实验二 4-6学时
文章目录 《密码系统设计》实验实验项目实验二 密码算法实现4-6 学时实践要求(30 分)1. 定义宏2. 使用特定的源文件3. 编译MIRACL库4. 配置KCM和Comba方法5. 编译和运行MEX工具6. 使用config.c工具总结1. 准备环境2. 下载和解压MIRACL库3. 定义宏4. 使用…...
Zypher Network:全栈式 Web3 游戏引擎,服务器抽象叙事的引领者
近期,《黑神话:悟空》的爆火不仅让 AAA 游戏重回焦点,也引发了玩家与开发者的热议。Web2 游戏的持续成功导致部分 Web3 玩家们的倒戈,对比之下 Web3 游戏存在生命周期短且商业模式难以明确的问题,尤其在当前加密市场环…...
2025生物发酵展(济南)为生物制造产业注入新活力共谱行业新篇章
2025第十四届国际生物发酵展将于3月3-5日济南盛大举办!产业链逐步完整,展会面积再创历史新高,展览面积较上届增涨至60000平方米,专业观众40000,品牌展商800,同期活动会议增加至50场,展会同期将举…...
git入门教程14:Git与其他工具的集成
一、Git与代码托管平台的集成 GitHub 集成方式: 在GitHub上创建或克隆仓库。在本地使用Git命令进行代码提交和推送(如git push)。GitHub提供Web界面进行代码浏览、协作和持续集成配置。 特点: 支持Pull Request,便于代…...
在Zetero中调用腾讯云API的输入密钥的问题
也是使用了Translate插件了,但是需要调用腾讯云翻译,一直没成功。 第一步就是,按照这上面方法做:百度、阿里、腾讯、有道各平台翻译API申请教程 之后就是:Zotero PDF translat翻译:申请腾讯翻译接口 主要是…...
【AD】1-8 AD24软件工程创建
1.点击文件,新建项目 2.如图进行设置工程名称和文件路径 3.创建原理图库及原理图,并保存 4.新建PCB库及PCB,并保存 5.单击右键工程保存 注意:先新建工程,在新建文件...
RT-Thread学习
文章目录 前言一、rtt的启动流程二、移植工作总结 前言 RT-Thread学习,这里记录对bsp的移植 一、rtt的启动流程 RT-Thread 支持多种平台和多种编译器,而 rtthread_startup() 函数是 RT-Thread 规定的统一启动入口。一般执行顺序是:系统先从…...
20241102在荣品PRO-RK3566开发板使用荣品预编译的buildroot通过iperf2测试AP6256的WIFI网速
20241102在荣品PRO-RK3566开发板使用荣品预编译的buildroot通过iperf2测试AP6256的WIFI网速 2024/11/2 14:18 客户端:荣耀手机HONOR 70【iPerf2 for Android】 服务器端:荣品PRO-RK3566开发板 预编译固件:update-pro-rk3566-buildroot-hdmi-2…...
网络模型——二层转发原理
网课地址:网络模型_二层转发原理(三)_哔哩哔哩_bilibili 一、路由交换 网络:用来信息通信,信息共享的平台。 网络节点(交换机,路由器,防火墙,AP)介质&#…...
【编程技巧】C++如何使用std::map管理std::function函数指针
一、问题背景 开发过程中遇到了需要根据const字符串调用不同函数的要求。在开发过程中为了快速实现功能,实际使用了if else等判断实现了不同函数的调用,徒增了不少代码行数。 明知道可以采用map管理函数指针,但是没有具体实现过,…...
导航栏小案例
实现类似于这样的效果 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>导航栏</title><style>*{margin: 0;padding: 0;}.div1{width: 100%;height: 60px;/* border: 1px solid blue; */background-color:rgb(…...
MyBatis一文入门精通,面试题(含答案)
一、MyBatis详细介绍 MyBatis 是一个流行的 Java 持久层框架,主要用于简化 SQL 数据库操作。它的设计初衷是通过 XML 或注解的方式配置和执行 SQL 语句,使得数据库操作更加灵活、方便和高效。相比于传统的 JDBC,MyBatis 提供了一些关键优势&…...
Ubuntu18.04服务器非root用户在虚拟环境下的python版本设定
最近需要跑一个python3.9.16版本的代码,Ubuntu18.04服务器上是上次博客中已经定死的python3.8.0版本 需要创建一个虚拟环境,并且在虚拟环境中配置python3.9.16版本 只需要创建一个虚拟环境 conda create -n yyy python3.9.16yyy是你的虚拟环境名字 创建…...
CodeS:构建用于文本到 SQL 的开源语言模型
发布于:2024 年 10 月 29 日 #RAG #Text2 SQL #NL2 SQL 语言模型在将自然语言问题转换为 SQL 查询(文本到 SQL )的任务中显示出良好的性能。然而,大多数最先进的 (SOTA) 方法都依赖于强大但闭源的大型语言…...
HTML 基础概念:什么是 HTML ? HTML 的构成 与 HTML 基本文档结构
文章目录 什么是 HTML ?HTML 的构成 ?什么是 HTML 元素?HTML 元素的组成部分HTML 元素的特点 HTML 基本文档结构如何打开新建的 HTML 文件代码查看 什么是 HTML ? HTML(超文本标记语言,HyperText Markup L…...
18 Docker容器集群网络架构:一、etcd 概述
文章目录 Docker容器集群网络架构:一、etcd概述1.1 etcd 的基本概念和特点1.1.1 定义1.1.2 特点1.2 etcd 在 Docker 集群网络中的作用1.3 etcd 集群的架构和原理1.3.1 架构1.3.2 原理Docker容器集群网络架构:一、etcd概述 etcd是一个高可用的分布式键值存储系统,它主要用于…...
R语言贝叶斯分层、层次(Hierarchical Bayesian)模型房价数据空间分析
原文链接:https://tecdat.cn/?p38077 本文主要探讨了贝叶斯分层模型在分析区域数据方面的应用,以房价数据为例,详细阐述了如何帮助客户利用R进行模型拟合、分析及结果解读,展示了该方法在处理空间相关数据时的灵活性和有效性。&a…...
SpringBoot 在初始化加载无法使用@Value的时候读取配置文件教程
怀旧网个人博客地址:怀旧网,博客详情:SpringBoot 在初始化加载无法使用Value的时候读取配置文件教程 读取数据库数据案例 // 创建YamlPropertiesFactoryBean对象 YamlPropertiesFactoryBean factory new YamlPropertiesFactoryBean(); // …...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
