【redis-01】redis基本数据类型和使用场景

redis系列整体栏目


内容链接地址
【一】redis基本数据类型和使用场景https://zhenghuisheng.blog.csdn.net/article/details/142406325

redis基本数据类型和使用场景

  • 一,redis基本数据类型和使用场景
    • 1,String数据类型
    • 2,Hash数据类型
    • 3,List数据类型
    • 4,Set数据类型
      • 4.1,抽奖设计
      • 4.2,点赞收藏设计
      • 4.3,社交系统实现
    • 5,Zset数据类型

一,redis基本数据类型和使用场景

在实际开发中,经常会用到一些缓存中间件,如redis,但是redis除了做缓存之外,还能做很多事情,本篇文章主要来讲解一下redis的基础数据类型。

我这边选用的是redis5.0的版本,然后通过docker安装的,因此直接进入docker容器内部,执行启动redis命令

//展示docker正在运行的容器,获取容器id
docker ps
//进入docker容器内部
docker exec -it d4fc743db4ad /bin/bash
//启动redis
redis-cli

在redis中,主要有5中数据类型:String数据类型、Hsah数据类型、list数据类型、set数据类型、zset数据类型

1,String数据类型

String类型在redis中的使用场景相对比较广泛,采用普通的 key-value 键值对的方式实现,一般更加的倾向于做缓存使用,如直接设置和获取某个值

set zhenghuisheng 18
get zhenghuisheng    

在这里插入图片描述

当然在实际开发中,一般都会设置某个前缀,别上面的是设置年龄,那么就会在前面拼接一个年龄前缀

set age:zhenghuisheng 18

同时也可能直接会存某个被序列化的json对象,直接作为字符串存储在redis中,如在小商城中,可以直接将用户下单的订单信息存储在redis中,通过前缀+订单id作为key,然后被序列化的对象作为value

set order:12345 "{userId:1,money:200,productId:1}"

除了作缓存之外,String类型还能做简单的分布式锁,由于内部执行命令的线程为单线程,因此可以直接通过setnx命令来执行一把分布式锁

//设置一把分布式锁
setnx stock:lock true
//释放分布式锁
del stock:lock true

如下图所示,当第一个线程拿到这把分布式锁后,后面的线程会抢不到,直到把这把锁释放,其他线程才能拿到

在这里插入图片描述

String类型也可以做session会话,比如在实际开发中,直接将用户的token存入到redis中

set session:userid:12345 "session_data" EX 3600  # 1小时过期

也可以做限流操作,如在实际开发中,结合aop和自定义注解统计每个接口1分钟内外部调用的次数,当超过1000次时则对这个ip进行限流的操作

incrby api:rate_limit:ip:123.45.67.89 1000
expire api:rate_limit:ip:123.45.67.89 60  # 60秒过期

最后就是这个自增,比如统计文章的浏览数,某个街道通过的车辆数等等,那么就可以结合自增来实现

incr zhenghuisheng

总结:在实际开发中,String类型可以用作简单的分布式锁、计数器、session会话、限流等

2,Hash数据类型

hash有点类似于hash表,更加倾向于存储对象类型的数据,比如在实际开发中存对象可能会用序列化的String类型存,但是其实也是可以选择使用hash的数据类型存储。

HSET user:1001 name "zhenghuisheng" age 25 email "alice@example.com"
HGETALL user:1001  # 获取用户的所有信息

还有就是存一些商品信息,价格,描述等

HSET product:2001 name "小米8" price 1200 stock 30 description "米8"
HGET product:2001 price  # 获取商品的价格

相对于String类型,hash类型存储这些对象信息是更加的节省空间,而且对数据管理更加灵活方便。

hash类型也存在缺陷,就是存储的对象不能太大,否则会造成 大key 的问题,造成redis阻塞

3,List数据类型

在这里插入图片描述

list底层采用的是双向链表,允许数据从双端进行插入或者删除,list的常用命令如下

LPUSH / RPUSH:在列表左/右侧插入元素。

LPOP / RPOP:从列表左/右侧弹出元素。

LRANGE:获取列表中指定范围内的元素。

LLEN:获取列表长度。

LREM:移除列表中指定的元素

结合双向链表的特性,可以实现很多数据结构,如通过list设计一个栈、队列、或者设计一个阻塞队列

设计一个栈的思路如,栈的本质是先进后出,因此可以通过左边进左边取的的设计思路结合

lpush + lpop

设计一个Queue队列的思路如下,队列的本质是先进先出,那么数据就从左边取,右边进的原则

lpop + rpush

设计一个阻塞队列的思路如下,就是在数据出的时候,阻塞一下,通过blpop实现

blpop + rpush

在实际开发中,如拉取订阅的消息时,可以采用这种list方式拉取数据,通过时间线进行排序,最近的消息排在前面,如微博那边就是这样子设计的,直接通过lpush + lpop的方式实现

LRANGE timeline:user_1001 0 9  # 获取最近的 10 条动态

还有在一些经常需要分页的场景中,如某类商品的详情页需要分页查看

LPUSH products_page_1 "product_1001" "product_1002"
LRANGE products_page_1 0 9  # 获取第 1 页的 10 条产品数据

还有查看一些日志,也可以通过这种队列的方式实现,如查看最近的100条日志

LRANGE error_logs 0 9  # 获取最新的 10 条日志

4,Set数据类型

Redis 中的 Set 数据类型是一个无序集合,集合中的元素是唯一的 ,因此首先是适合需要记录唯一元素。如统计某个网站一天有多少人浏览,这时就需要通过用户id进行去重操作,那么就可以寻找set这种数据结构类型

4.1,抽奖设计

set还可以设计一个抽奖的功能,通过里面的随机值来实现,批量插入10条数据

SADD lottery:2024 1 2 3 4 5 6 7 8 9 10

然后查看所有参与了抽奖的用户,此时10个用户已经就绪

SMEMBERS lottery:2024

在这里插入图片描述

随后抽奖两次,每次抽3个人,可以发现每次抽到的人都不一样

SRANDMEMBER lottery:2024 3

在这里插入图片描述

当然有时候业务也可能不一样,就是说第一次得奖者不能参与第二次抽奖,那么需要使用这个 SPOP 命令

SPOP lottery:2024 3

4.2,点赞收藏设计

点赞系统设计

  1. 用户点赞: 使用 Redis Set 来存储某个内容的点赞用户,每个内容对应一个 Set,用户的 ID 是集合中的元素,保证每个用户只能对某个内容点赞一次。
  2. 取消点赞: 用户取消点赞时,从 Set 中移除用户 ID。
  3. 统计点赞数: 通过 SCARD 命令统计集合的元素数量,即为点赞数。
  4. 查询某个用户是否点赞过: 使用 SISMEMBER 判断用户是否在 Set 中。
  5. 获取所有点赞的用户列表: 使用 SMEMBERS 获取点赞用户 ID 列表。

关键 Redis 命令

  • SADD: 向集合中添加元素(点赞)。
  • SREM: 从集合中移除元素(取消点赞)。
  • SCARD: 获取集合的元素数量(点赞数)。
  • SISMEMBER: 判断用户是否在集合中(查询是否已点赞)。
  • SMEMBERS: 获取集合中的所有元素(点赞用户列表)。

执行命令如下

SADD user:star:2024 1 2 3		//添加3个点赞用户
SREM user:star:2024 1			//用户1取消点赞
scard user:star:2024   			//统计点赞数
sismember user:star:2024  1		//查询某个用户是否点赞
smembers user:star:2024    		//获取所有的点赞列表

4.3,社交系统实现

使用 Redis 的 Set 数据类型可以有效地设计一个社交网络的好友关系系统。通过 Set,我们可以轻松管理用户的好友列表,实现好友的添加、删除、查询和好友推荐等功能 。一般的社交系统,都能通过这种关注模型实现

好友关系设计

  1. 添加好友:使用 Set 存储每个用户的好友列表,好友 ID 是集合中的元素。
  2. 删除好友:使用 SREM 从集合中移除好友 ID。
  3. 查看好友列表:使用 SMEMBERS 获取用户的所有好友 ID。
  4. 检查是否是好友:使用 SISMEMBER 判断某个用户是否在另一个用户的好友列表中。
  5. 推荐好友:可以使用集合的交集和并集来推荐可能的好友。

关键 Redis 命令

  • SADD: 向集合中添加元素(添加好友)。
  • SREM: 从集合中移除元素(删除好友)。
  • SMEMBERS: 获取集合的所有元素(查看好友列表)。
  • SISMEMBER: 检查元素是否在集合中(是否是好友)。
  • SINTER: 获取多个集合的交集(推荐好友)。
  • SUNION: 获取多个集合的并集(找出所有好友)。

执行命令如下

SADD user:1:friends 2 3		//用户1添加用户2和3为好友
SADD user:2:friends 1 4		//用户2添加用户1和4为好友
SADD user:3:friends 1		//用户3添加用户1为好友SREM user:1:friends 2 		//用户1删除用户2
SMEMBERS user:1:friends		//查看用户1的全部好友
SISMEMBER user:3:friends 1 //检查用户1是不是用户3的好友SINTER user:1:friends user:3:friends	推荐用户3的好友,但用户1不是好友    

5,Zset数据类型

zset的使用命令和set差不多,就是要在前面加一个z。与set不同的是,zset内部是进行了排序的

其使用的基本实现如下,如简单的实现一个分数的排行榜

首先添加用户及其得分

# 1. 添加用户及其得分
ZADD leaderboard 100 "user1"
ZADD leaderboard 200 "user2"
ZADD leaderboard 150 "user3"

然后更新用户1的分数

# 2. 更新用户1的分数
ZADD leaderboard 250 "user1"

获取得分最高的前 3 名用户

ZRANGE leaderboard 0 2 WITHSCORES
# 返回:["user1", "250", "user2", "200", "user3", "150"]

查看 user1 的分数

ZSCORE leaderboard "user1"
# 返回:250

删除 user2

ZREM leaderboard "user2"

获取第 2 到第 4 名的用户(此时可能没有第 3 名和第 4 名)

ZRANGE leaderboard 1 3 WITHSCORES
# 返回:["user3", "150"](用户2已被删除)

获取得分最高的前 3 名用户(从高到低)

ZREVRANGE leaderboard 0 2 WITHSCORES
# 返回:["user1", "250", "user3", "150"]

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

mat工具的几个实用地方

背景 使用mat的过程中,有几个值得关注的注意点,可以帮助我们尽快查找到问题的答案 mat实用的注意点 一.打开直方图后排序,直观查看内存占用大小,如下图所示 二.查看某个对象实例的具体值,点击对象,点击List Object…

vulnhub靶场 DC-3

地址: https://download.vulnhub.com/dc/DC-3-2.zip 开启NAT模式 namp只扫到了一个端口 打开网页有一个登录的页面 目录扫描一下,可以找到一个 后台登录界面 看一下指纹信息 joomla cms 网上搜一下可以发现存在一个JoomScan工具 在kali上面安装一下 apt install joomscan …

CSP-J2024全真模拟题 阅读程序题3+程序填空题

由于明天考试&#xff0c;今天晚上给大家提供详细的答案和解析&#xff0c;求关注点赞和评论 28.将第 1 行改为 &#xff03;include<iostream>&#xff0c;程序的运行结果不变。&#xff08;&#xff09; A.对B.错 29.本程序用到了队列而不是栈的思想。&#xff08;&a…

大数据新视界 --大数据大厂之算法在大数据中的核心作用:提升效率与智能决策

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

缓存装饰器@cached_property

这个装饰器好像在好多包里都有&#xff0c;我在阅读源码的过程中&#xff0c;transformers.utils也有这个。查阅资料&#xff0c;大体上了解了它的用法。参考&#xff1a;[python]cached_property缓存装饰器 - faithfu - 博客园 这个装饰器用在类里面的某个方法前面&#xff0…

7个提升网站分页体验的 CSS 和 JavaScript 代码片段

文章目录 前言正文1.简洁直观的悬停分页效果2.实时显示页码的分页3.适合响应式设计的多功能分页4.专为移动设备优化的分页5.无数字的极简分页设计6.触屏友好的分页7.结合无限滚动与分页的设计 总结 前言 分页是内容丰富的网站中不可缺少的导航工具&#xff0c;能帮助用户更轻松…

C++_CH18_构造函数与析构函数

C_CH18_构造函数与析构函数 1 类的默认成员函数 在编写类的时候&#xff0c;C编译器会默认生成6个默认的函数&#xff0c;但是不显示出来&#xff1a; 需要关注以下两个方面: 第一:我们不写时&#xff0c;编译器默认生成的函数行为是什么&#xff0c;是否满足我们的需求。 …

Java流程控制语句——条件控制语句详解(附有流程图)#Java条件控制语句有哪些?#if-else、switch

在 Java 编程中&#xff0c;条件控制语句用于控制程序的执行路径&#xff0c;决定根据某些条件来选择执行某段代码或跳过某段代码。它们是 Java 编程的重要组成部分&#xff0c;帮助开发者根据不同的输入、状态或数据流来编写更加灵活和动态的代码。在本文中&#xff0c;我们将…

【省时省力】告别 Node.js 安装配置的繁琐!国内镜像源加速,版本切换轻松搞定

前言 最近电脑开发环境又意外出现了异常,每次更新系统都是冒着很大的风险,这次最直接的影响就是一些基于nodejs的前端项目. 不同项目的版本环境要求不一致,最新的nodejs并不总是满足项目要求,因此为了重新部署自己开发的以及别人开发的项目,需要根据项目随时切换到相应的版本.…

线性系统分析

一、定义 (1)叠加性 若 且 则称该系统具有叠加性。 叠加性:系统的一个输入不影响系统对其他输入的响应。 (2)均匀性 若 对任意常数a下式都成立 则称该系统具有均匀性。 均匀性:系统能够保持对输入信号的缩放因子不变。 (3)线性系统 若一个系统同时具有叠加性和…

手把手教你-MAC虚拟环境搭建TensorFlow开发环境

参考如下代码布置&#xff0c;直接运行&#xff0c;即可: 1) 安装virtualenv $ sudo pip install virtualenv 2&#xff09;创建虚拟环境文件夹 $ virtualenv --system-site-packages -p python2.7 ./EnvPy27 3) 激活环境 $ source EnvPy27/bin/activate 4) 更新pip $ pi…

基于机器学习的癌症数据分析与预测系统实现,有三种算法,bootstrap前端+flask

研究背景 癌症作为全球范围内最主要的死亡原因之一&#xff0c;已成为当代医学研究和公共健康的重大挑战。据世界卫生组织&#xff08;WHO&#xff09;的统计&#xff0c;癌症每年导致全球数百万人的死亡。随着人口老龄化、环境污染和生活方式的改变&#xff0c;癌症的发病率逐…

如何联系真正的开发者而非公司??

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

同态加密明文矩阵乘密文向量优化:BSGS小步大步法

摘要 本文介绍如何使用小步大步&#xff08;Baby-Step-Giant-Step&#xff0c;BSGS&#xff09;优化RLWE同态加密的明文矩阵和密文向量的乘法。使用 n n n\times n nn明文矩阵的对角打包和BSGS&#xff0c;可以将密文旋转的次数降低为 O ( n ) O(\sqrt{n}) O(n ​). 明文运算…

Vue3中el-table组件实现分页,多选以及回显

el-table组件实现分页&#xff0c;多选以及回显 需求思路1、实现分页多选并保存上一页的选择2、记录当前选择的数据3、默认数据的回显 完整代码 需求 使用 dialog 显示 table&#xff0c;同时关闭时销毁el-table 表格多选回显已选择的表格数据&#xff0c;分页来回切换依然正确…

U盘显示未被格式化:深度解析、恢复策略与预防之道

现象透视&#xff1a;U显示未被格式化的迷局 在日常的数字生活中&#xff0c;U盘作为我们随身携带的数据仓库&#xff0c;承载着无数重要的文件与回忆。然而&#xff0c;当U盘突然弹出“未被格式化”的警告时&#xff0c;这份便捷瞬间转化为焦虑与不安。这一提示不仅意味着U盘…

C#开发记录如何建立虚拟串口,进行串口通信,以及通信模板

记录时间;2024年4月 记录如何开启虚拟串口以及进行基础串口通信。 建立虚拟串口 使用的软件是vspd&#xff0c;建立虚拟串口之后就可以将他们当成实际物理连接的两个串口进行通信。 之后使用我们之前给出的通信模板&#xff0c;建立一个稍微规矩一点的界面。 界面建立 其中…

湖南(用户访谈)源点咨询 市场调研中何种情况下选择定性方式?

湖南&#xff08;市场调研&#xff09;源点咨询认为&#xff0c;很多调研方法被分组为"定性调研方法"或"收集资料的定性方法"。 这反映了对定性调研的继承&#xfe63;&#xfe63;它的根源在于社会科学&#xff0c;尤其在社会学和人类学&#xff0c;还有…

gRPC介绍

gRPC 是一个由谷歌开发的现代开源高性能 RPC 远程过程调用&#xff08; Remote Procedure Calls&#xff09;框架&#xff0c;具备良好的兼容性&#xff0c;可在多个开发环境下运行。 相较于目前主流的 HTTP API 接口&#xff0c;gRPC 接口采用了领先的 HTTP/2 底层架构设计作…

江科大51单片机

文章目录 led灯led点亮led闪烁流水灯 独立按键按键点灯按键消抖按键实现二进制流水灯按键实现流水灯 数码管静态数码管显示动态数码管显示 矩阵键盘定时器/中断串口通信led点阵屏DS1302实时时钟蜂鸣器AT24C02DS18B20LCD1602直流电机驱动AD/DA红外遥控 led灯 创建项目&#xff…