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(); // …...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...