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(); // …...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...
