Redis数据类型和使用场景

news2024/11/15 22:44:05

Redis五大基本数据结构

String,Hash,List,Set,ZSet

String

String是Redis最基本的数据结构,用来设置KV键值对,redis有16个数据库,可直接在当前数据库中set添加String的KV对。
使用场景

  1. KV对,记录学生ID和姓名。<ID, NAME>
  2. 对象的JSON存储
    可以把对象的json存为String的KV对。
    比如以学生学号为KEY,以json为VAL;
SET myjson "{\"name\":\"John\", \"age\": 30, \"city\":\"New York\"}"
GET myjson
=========== Output ===========
 "{\"name\":\"John\", \"age\": 30, \"city\":\"New York\"}"
  1. 实现分布式锁

多线程使用Redis时,如果产生资源竞争的情况,比如同时去修改某个资源,可以通过setnx或setex来做线程间同步,以及通过控制某个线程占有资源的时间避免死锁。

setnx:该函数设置KV对时,如果K已经存在,则能设置,若创建失败说明已经存在了。当分布式场景抢占资源时,线程1先来先创建KEY,如果线程2创建不成功,则线程1等待。因为Redis是单线程的,是线程安全的。线程1访问完临界资源后再删除KEY。线程2就可以创建KEY了。
setex:可以设置KEY的存活时间,避免线程一直占有资源不做释放而引发死锁。
psetex:单位是毫秒的设置过期时间的方法。

  1. 计数器

微博热门帖子的文章阅读人数。每当用户点进去,就执行一次INCR命令。对某个值做加1操作。
INCR的使案例:
(下面的‘article:1234’看起来奇怪,其实整体是个key)
1> 设置key:编号为1234的文章初始化阅读量为1 请添加图片描述
2> 每当有用户访问,就用INCR增加1
请添加图片描述
3> 当前文章阅读数量+1,总阅读量也+1(有场景不需要)
请添加图片描述
·incr相关操作

incr:表示+1
incrbyfloat:+n
decr:value-1。
decrby:val-n。
incrbyfloat:val做加减法均可

  1. 分布式系统全局序列号

mysql自增id已经到最大值, 无法满足分库分表下的id自增,需要独立的数据库中级来分配id。redis的incr命令可以实现id、序列号的生成。
用户多的场景下,不要每次取1个id,在redis中自增1000次,把序列号放入本地内存,当1000个id用完后,再去redis取,可以有效降低redis压力。

Hash

Redis中常用Hash存对象,每个hash像是一个对象的表中存了多组KV对,KV对代表成员变量和值。
Hset key field value
Hget key
使用场景

  1. 电商购物车
    一个用户只有一个购物车。用户1001的购物车可设对象键值为:‘cart:1001’。
    商品ID和添加数可记录为成员变量和值。
    1)以用户id为key === cart:1001
    2)商品id为field === 10088
    3)商品数量为value === 1
    购物车操作:
    1)添加商品 hset cart:1001 10088 1
    2)增加数量 hincrby cart:1001 10088 1
    3)商品总数 hlen cart:1001
    4)删除商品 hdel cart:1001 10088
    5)获取购物车所有商品 hgetall cart:1001
    在这里插入图片描述

优点:

  1. 方便管理,寻找方便,这样有数据之间是有逻辑关系的
  2. 比string更节省空间,一个对象类型有很多KV,如果都用KV存储,就很费内存空间,内存空间很重要,是节点数。一个hash表的key,可以关联很多。

缺点:

  1. 不如String灵活,过期功能不能在字段,只能在哈希表上,hash的key上,也就是hash表名。
  2. redis集群架构下不适合大规模使用,因为hash的KV对太多,都存在1个节点上,hash节点的压力会比其他节点压力大,使得redis集群压力分配不均衡。一台存10万个hash节点的机器,负载远比存10万个string的机器压力大。

List

有序列表,类似队列或栈,取决于你使用lpush还是rpush。
函数操作
lpush:插入,不存list就创建
lpop:
lpop:
rpop:
场景

  1. 阻塞队列

阻塞队列有两个特性: 线程安全和阻塞(队列空时,出队就会阻塞,队列满,入队会阻塞)。
redis中的list相当于阻塞队列。它能保证线程安全,通过单线程模型来支持的。阻塞则只支持“队列为空”的情况,不考虑“队列满”。虽然有上限,但上限比较大。

实现:
1>如果list中存在元素,redis的blpop和brpop和lpop、rpop效果相同,当list为空,blpop和brpop会产生阻塞,一直阻塞到队列不空为止。
2> 阻塞时间可以设置,不一定是一直等待,等太久没有就走
3>阻塞期间,redis服务器还可以处理其它请求(特殊设定)。

  1. 消息队列
    消息队列相当于在阻塞队列上加了“消息类型”,先进先出再增加上按照指定类型做。

  2. 排行榜:分页查询的应用
    mybatis面试中常问的一个问题。redis的list中Lrange可以设定获取哪些范围到的值,效率很高。

  3. 公众号文章关注列表
    当小明关注了多个订阅号,当订阅号更新后,通过LPUSH把内容发送到小明的信息list中。
    如果是小明想获取大V的信息时,用LRANGE从不同订阅号队列中读取指定个数个信息。
    (一个主题场景下,包含着多个同类型的内容数据可以使用list结构)

  4. 微博大V粉丝列表
    redis的list可存量非常大42亿。

Set

无序的去重集合。
sadd key:
srem key:
可以跟很多个值
请添加图片描述
场景
1>用户画像:极短字符串。因为随机存取效率高于list。
推荐系统中的应用,给某个用户贴一系列标签,而且方便寻找与其它集合的交集、差集等,寻找近邻用户和近邻商品,所以存set集合是很好的选择。
2>统计UV
UV(访客数):set本身是去重,把日志中的唯一列存入Set中,天然的去重后查看set集合数即UV。
PV(页面访问量):页面访问
3>关注的人也关注了他
集合的差集。
4> 一切集合运算的场景

Zset:底层是跳表

有序的去重集合,排序是基于每个元素有值的,需要设定key和排序的数值
zadd
zget
zrem
在这里插入图片描述

场景
1> 微博热搜
zset可以统计PV,也就是页面访问次数,而页面访问次数排序后,就是热搜。
需要集合中元素带顺序,就是热搜中的TOK问题。
2 最高热度
当日前10、月度前10等系列同类型寻找最高热度的排序数据。

redis还有特殊数据结构:

1 geospatial:推算地理位置
2 hyperloglog:基数统计(找1个或多个集合里面总共的不重复的元素)
2.8.9中更新了,有算法可以用来做:网页UV,多少用户访问。
传统方式的做法:用set(无序集合)存用户id,如果保存大量用户,有的ID比如分布式ID比较大,用户量太大,消耗了大量内存存用户ID,目的是为了计数,不是存用户ID。优点:占用的内存是固定的。
通过han p log log需要12KB内存,但是有0.81%错误率,就能统计出页面UV。
PFCOUNT
3 bitmap:记录大场景下的每个个体的状态
直接统计用户是否在线,或者是否活跃,打卡未打卡。95MB就能存1E个位数据,能看到1E的用户谁在线。
而C++ for循环1E次,只需要1秒。所以效率非常高。
4 redis中的布隆过滤器:
是redis中的一种数据结构,它将MySQL数据库中所有可能存在的数据都缓存到布隆过滤器中。当攻击者访问不存在的数据时迅速返回避免请求打到数据库上导致数据库宕机问题。
Bloom Filter 是一种空间效率很高的随机数据结构,底层利用了位图。布隆过滤器能确定一定不存在,但是不能保证真实存在,利用哈希,给每个位置做记录。但不同的值可能影响,所以位图要开大一点,多用几个哈希函数。

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

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

相关文章

【高效】极致简化vuex.js(仅需6行代码),让快速敏捷开发不是梦!

vuex.js import Vue from vue; import Vuex from vuex; Vue.use(Vuex); // 设置vuex所有变量 let state {_qiangGe: false,//需要添加全局变量就在此处回车添加一个即可&#xff0c;非常方便&#xff01;&#xff01;&#xff01; }, getters {}, mutations {}, actions …

Spring【Spring体系结构、IOC_控制反转思想、Spring实现IOC 】(一)-全面详解(学习总结---从入门到深化)

目录 Spring简介 Spring体系结构 IOC_控制反转思想 IOC_自定义对象容器 IOC_Spring实现IOC IOC_Spring容器类型 IOC_对象的创建方式 Spring简介 Spring是一个开源框架&#xff0c;为简化企业级开发而生。它以IOC&#xff08;控制 反转&#xff09;和AOP&#xff0…

视频转动图怎么做?一招轻松学会

当需要将下载的视频转gif动图时&#xff0c;该怎样来操作才能更加的简单快捷&#xff0c;相信很多小伙伴都会遇到这个问题。那么想要将视频做成二维码&#xff0c;一般情况下可以使用gif制作工具来处理&#xff0c;对于不经常制作的小伙伴而言&#xff0c;下载视频转gif&#x…

make/Makefile【Linux系统编程】

一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的规则来指定&#xff0c;哪些文件需要先编译&#xff0c;哪些文件需要后编译&#xff0c;哪些文件需要重新编译&#xff0c;甚至于进行更复杂的功能操作 makef…

哈希的应用(2)——布隆过滤器

布隆过滤器的提出 目录 布隆过滤器的提出 布隆过滤器概念 布隆过滤器的插入 ​编辑 布隆过滤器的查找&#xff08;保证可能存在&#xff0c;一定不存在&#xff09; 布隆过滤器的删除 布隆过滤器的优点 布隆过滤器的缺点 布隆过滤器的使用场景 布隆过滤器&哈希切…

基础算法之搜素(bfs和dfs模板和例题)

目录 一、深度优先搜索与回溯1、四阶数独2、排列类问题3、红与黑&#xff08;dfs或bfs和Flood fill&#xff09; 之前学习了暴力枚举策略&#xff0c;将所有可能的情况都枚举一遍以获得最优解&#xff0c;但是枚举全部元素的效率如同愚公移山&#xff0c;无法应付数据范围稍大的…

【LLM】Langchain使用[三](基于文档的问答)

文章目录 一、基于文档的问答1. 创建向量存储2. 不同类型的chain链 二、本地知识库问答Reference 一、基于文档的问答 1. 创建向量存储 使用Dock Array内存搜索向量存储&#xff0c;作为一个内存向量存储&#xff0c;不需要连接外部数据库创建向量存储&#xff1a;导入一个索…

复习第七课 C语言-指针数组,函数,string

目录 【1】指针和数组 【2】数组指针 【3】指针数组 【4】函数 【5】函数传参 【6】动态开辟堆区空间 【7】string函数族 【8】递归函数 练习&#xff1a; 【1】指针和数组 直接访问&#xff1a;通过数组名访问 间接访问&#xff1a;通过指针访问 》1. 一维数组 in…

动态规划之118杨辉三角(第6道)

题目&#xff1a;给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 题目链接&#xff1a;118. 杨辉三角 - 力扣&#xff08;LeetCode&#xff09; 示例&#xff1a; 解法&#xff1…

【iOS】内存管理五大区

参考博客&#xff1a;iOS内存管理学习第一篇-内存五大区 3.1 OC特性之 内存五大区域 1. 简述 程序要想执行&#xff0c;第一步就需要 被加载到内存中 内存五大区域: 栈区,堆区,BSS段(静态区),常量区(数据段),代码段. 栈区&#xff08;stack&#xff09;由编译器自动分配并释放…

手写Spring框架---MVC实现

目录 预备 自研框架MVC的实现 MVC架构草图&#xff1a; 大致流程 实现思路 自定义注解 JavaBean 请求的拦截-建立DispatcherServlet 责任链处理请求 RequestProcessor矩阵 Render矩阵 预备 在DispatcherServlet&#xff1a; 解析请求路径和请求方法依赖容器&#xf…

最全的 Spring 依赖注入方式,你都会了吗?

Spring 正如其名字&#xff0c;给开发者带来了春天&#xff0c;Spring 是为解决企业级应用开发的复杂性而设计的一款框架&#xff0c;其设计理念就是&#xff1a;简化开发。 Spring 框架中最核心思想就是&#xff1a; IOC&#xff08;控制反转&#xff09;&#xff1a; 即转移…

ChatGPT 最佳实践指南之:使用外部工具

Use external tools 使用外部工具 Compensate for the weaknesses of GPTs by feeding them the outputs of other tools. For example, a text retrieval system can tell GPTs about relevant documents. A code execution engine can help GPTs do math and run code. If a …

45、Spring Boot自动配置原理

Spring Boot自动配置原理 lmport Configuration Spring spi 自动配置类由各个starter提供&#xff0c;使用Configuration Bean定义配置类&#xff0c;放到META-INF/spring.factories下使用Spring spi扫描META-INF/spring.factories下的配置类使用lmport导入自动配置类

通讯录管理系统--进阶(动态开辟内存+保存数据到文件)

文章目录 动态开辟内存优化改进通讯录类型改进初始化通讯录函数改进添加联系人的函数增加销毁通讯录信息的函数 保存数据到文件优化保存通讯录数据到文件读取数据到通讯录 完整的代码展示 在 C语言实现通讯录的所有基本功能详细代码分析中&#xff0c;我们已经实现了通讯录的基…

Linux系统编程:文件系统和inode

目录 一. 磁盘的结构和读写数据的方式 1.1 磁盘级文件和内存级文件 1.2 磁盘的物理结构 1.3 访问磁盘数据的方式 二. 磁盘文件系统 2.1 磁盘的分区管理方法 2.2 文件名和inode的关系 三. 结合文件系统对文件创建和删除的相关问题的理解 3.1 文件创建时操作系统进行的工…

如何给合宙ESP32-C3刷写arduino固件,arduinoIDE的配置,测试代码

视频教程 https://github.com/Yu-1120/ESP32-C3 资料下载地址 合宙ESP32-C3刷写arduino固件 然后点击安装就可以了 arduino-IDE的配置 我用的版本&#xff1a;2.1.1&#xff08;版本不对也多大没关系&#xff09; 下载安装 选择 ESP32C3 Dev Module 安装环境 配置环境&am…

二十六、传输层协议(下)

一、滑动窗口 刚才我们讨论了确认应答策略&#xff0c;对每一个发送的数据段&#xff0c;都要给一个ACK确认应答. 收到ACK后再发送下一个数据段。这样做有一个比较大的缺点, 就是性能较差. 尤其是数据往返的时间较长的时候. 既然这样一发一收的方式性能较低, 那么我们一次发送…

snpEff注释结果解读

目录 1.帮助文档 1.1 常用参数 2. 命令的用法&#xff1a; 3. 结果文件解读 4. SNP下游的分析 利用snpEff软件对 snp.vcf &#xff08;利用gatk软件calling-snp&#xff09;进行注释&#xff0c;运行下述命令&#xff1a; ## 构建好物种的数据库 java -jar /opt/snpEff/s…

基于Spring Boot的扶贫助农商城系统设计与实现(Java+spring boot+MySQL+VUE)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的扶贫助农商城系统设计与实现&#xff08;Javaspring bootMySQLVUE&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java spr…