学习 Redis 基础数据结构,不讲虚的。

学习 Redis 基础数据结构,不讲虚的。

一个群友给我发消息,“该学的都学了,怎么就找不到心意的工作,太难了”。

很多在近期找过工作的同学一定都知道了,背诵八股文已经不是找工作的绝对王牌。企业最终要的是可以创造价值,或者首先需要干活的人,所以实战很重要。今天这篇文章就是给大家分享一下如何在我们实战生产中使用 redis。

如果不了解 redis 的同学,可以先学习之前的 redis 入门教程。reids 从黑铁到王者

⚠️注意:命令不区分大小写,而 key 是区分大小写的。

String

String 作为最基本的类型,就是普通的 get、set,做简单的 key - value 存储

应用场景:

  • 比如在商品编号的生成、订单编号的生成(当然现在很少用到了,毕竟现在这种编号已经不足以承载当今的电商服务)

  • 商品编号生成

  • 是否喜欢的文章

文章点赞打赏截图

Hash

  • Hash 是一个类似于 Map 的结构,我们可以将整个对象缓存到 redis 中(这个对象不可以在嵌套其他对象),每次读写缓存时可以直接操作 hash 这个对象里的某个字段值。
  • 类似于 Java 中的 Map<String, Map<Object, Object>>

语法:

redis 127.0.0.1:6379> HSET KEY_NAME FIELD VALUE 
  • 应用场景:购物车早期,当前小中厂可用

image-20210110223728047

List

  • List 就是编程中常用的字符串列表,列表的最大长度是 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。

  • 比如文章列表、粉丝列表等需要缓存的场景。

  • 可以作为一个单项或者双向队列,lpush、rpop、rpush、lpop。

  • LRANGE 命令可以指定元素获取区间,实现分页查询,比如微博新闻的列表页面、一些高性能查询的场景

  • 应用场景:

  1. 循环抓取新闻的主站点列表
redis 127.0.0.1:6379> RPOPLPUSH SOURCE_KEY_NAME DESTINATION_KEY_NAME
redis 127.0.0.1:6379> RPOPLPUSH news:list:websites news:list:websites
  1. 分页查询网站首页的新闻资讯,查询第 0~10 条的数据。
lrange article:list 0 10
Set

  • 无序列表,自动去重。

  • 和 Java 中的 hashset 一样,当需要进行大量数据的去重、之前你是基于 JVM 在内存去重,现在多机器部署的程序可以基于 redis 去重。

  • 比如需要进行交集计算,两个自媒体账号属于同一个人、他的粉丝一共有多少,需要将两个账号粉丝进行去重统计。当然,并集、差集都可以这样操作。

  • 应用场景:

    • 微信抽奖小程序

      image-20210111131808595

      image-20210111131949452

    • 微信朋友圈点赞

      image-20210111133506484

    • 微博好友关注社交关系

      共同关注的人:我去到 gakki 的微博,马上获得我和 gakki 共同关注的人

      image-20210111133650920

      我关注的人也关注他(大家爱好相同)

      image-20210111133831044

    • qq推荐可能认识的人

      image-20210111133958782

SortedSet

  • 排序的 set,去重但是可以排序,写进去的时候给一个分数,自动根据分数排序,这个可以玩儿很多的花样,最大的特点是有个分数可以自定义排序规则。

  • 比如说你要是想根据时间对数据排序,那么可以写入进去的时候用某个时间作为分数,人家自动给你按照时间排序了。

  • 排行榜:将每个用户以及其对应的什么分数写入进去,zadd board score username,接着 zrevrange board 0 99,就可以获取排名前100的用户;zrank board username,可以看到用户在排行榜里的排名。

  • 应用场景:

    • 根据商品销售对商品进行排序显示。

      image-20210111140054296

    • 抖音热搜

      image-20210111140639166

下面这三个你可能不太熟悉,耐心看完,这是通俗易懂的。

Bitmap

Bitmap 大家可能有些陌生,什么是 Bitmap 呢?

Bitmap 的底层数据结构用的是 String 类型的 SDS 数据结构来保存位数组,Redis 把每个字节数组的 8 个 bit 位利用起来,每个 bit 位 表示一个元素的二值状态(不是 0 就是 1)。

可以将 Bitmap 看成是一个 bit 为单位的数组,数组的每个单元只能存储 0 或者 1,数组的下标在 Bitmap 中叫做 offset 偏移量。

8 个 bit 组成一个 Byte,所以 Bitmap 会极大地节省存储空间。 这就是 Bitmap 的优势。

  • 比如判断用户是否登录状态,可以将用户 id 映射为一个唯一 id 编号,将 bit 位映射为 1。

  • 布隆过滤器底层选用的数据结构就是 bitmap(在程序中也用 bitset)。

  • 应用场景:

    • 用户每月签到情况。在签到统计中,每个用户每天的签到用 1 个 bit 位表示,一年的签到只需要 365 个 bit 位。一个月最多只有 31 天,只需要 31 个 bit 位即可。

      1. 编号 9527 的用户在 2024116 号打卡。
      SETBIT uid:sign:9527:202401 15 12. 判断是否打卡。
      GETBIT uid:sign:9527:202401 153. 统计 1 月份打卡次数,使用 `BITCOUNT` 命令。该指令用于统计给定的 bit 数组中,值 = 1 的 bit 位的数量。
      BITCOUNT uid:sign:9527:202401
HyperLogLog

HyperLogLog 并非 Redis 一家独有,Redis 只是基于 HyperLogLog 算法实现可一个 HyperLogLog 数据结构,并用该数据结构提供基数统计的功能。其优势就是可以做到只需要 12 kb 的空间大小,就可以实现接近 2^64 量级的基数统计。

HyperLogLog 数据结构并不会保存真实的元数据,所以其核心就是基数估算算法
在工程实践中,通常会用于 App 或页面的 UV 统计

  • HyperLogLog 是一种基数估算算法。所谓基数估算,就是估算在一批数据中,不重复元素的个数有多少。

  • 应用场景:

    • 计算 javapub.net.cn 网站的日活跃用户。通过 ip 在程序中用 HashSet 分析、如果有几百万用户,占用存储无疑是很大的。但是用了 HyperLogLog,事情变得如此简单。因为存储日活数据所需要的内存只有 12K。

      HyperLogLog 只提供了 3 个简单的命令。

      1. 添加元素到 HyperLogLog 中。
      PFADD key element [element ...]
      127.0.0.1:6379> pfadd website:javapub:uv 39.1.2.02. 返回给定 HyperLogLog 的基数估算。
      PFCOUNT key [key ...]
      127.0.0.1:6379> pfcount website:javapub:uv3. 将多个 HyperLogLog 合并为一个 HyperLogLog。PFMERGE destkey sourcekey [sourcekey ...]
      127.0.0.1:6379> pfmerge website:javapub:uv website:javapub-2:uv
      
GEO

看到这个名字就知道是经纬度坐标相关。需要涉及到地图的业务才会使用。

  • Redis GEO 有如下操作方法:

    • geoadd:添加地理位置的坐标。
    • geopos:获取地理位置的坐标。
    • geodist:计算两个位置之间的距离。
    • georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
    • georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
    • geohash:返回一个或多个位置对象的 geohash 值。
  • 应用场景:

    计算 Palermo 与 Catania 之间的距离:

    redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
    (integer) 2
    redis> GEODIST Sicily Palermo Catania
    "166274.1516"
    redis> GEODIST Sicily Palermo Catania km
    "166.2742"
    redis> GEODIST Sicily Palermo Catania mi
    "103.3182"
    redis> GEODIST Sicily Foo Bar
    (nil)
    redis>
    

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

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

相关文章

【服务器数据恢复】HP EVA虚拟化磁盘阵列数据恢复原理方案

EVA存储结构&原理&#xff1a; EVA是虚拟化存储&#xff0c;在工作过程中&#xff0c;EVA存储中的数据会不断地迁移&#xff0c;再加上运行在EVA上的应用都比较繁重&#xff0c;磁盘负载高&#xff0c;很容易出现故障。EVA是通过大量磁盘的冗余空间和故障后rss冗余磁盘动态…

实例分割论文阅读之:《Mask Transfiner for High-Quality Instance Segmentation》

1.摘要 两阶段和基于查询的实例分割方法取得了显著的效果。然而&#xff0c;它们的分段掩模仍然非常粗糙。在本文中&#xff0c;我们提出了一种高质量和高效的实例分割Mask Transfiner。我们的Mask Transfiner不是在规则的密集张量上操作&#xff0c;而是将图像区域分解并表示…

TCP相关知识点

TCP相关知识点 参考&#xff1a; 《计算机网络》 (建议收藏)TCP协议灵魂之问&#xff0c;巩固你的网路底层基础 关于 TCP 三次握手和四次挥手&#xff0c;满分回答在此 (值得看) TCP处于网络体系结构中的运输层。 运输层主要为应用进程提供端到端的逻辑通信&#xff0c;然后对…

zzzzzzzzzzzzzzzzz

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

Snipaste使用

今天推荐一款好用的截图、贴图软件工具&#xff0c;名字叫Snipaste&#xff0c;以下是官方介绍的截图 软件官方下载地址&#xff1a; Snipaste 下载 1、截图功能 2、标注 3、开发中的使用 有时候在开发中需要临时把一些任务规则信息&#xff0c;放在代码编辑器旁边进行参考&am…

linux之wsl2安装远程桌面

0. 安装后的效果 1. wsl中打开terminal并安装库 sudo apt-get purge xrdp sudo apt install -y xrdp sudo apt install -y xfce4 sudo apt install -y xfce4-goodies 2.优化显示 sudo sed -i s/max_bpp32/#max_bpp32\nmax_bpp128/g /etc/xrdp/xrdp.ini sudo sed -i s/xserverbp…

安全名词解析-水坑攻击、鱼叉攻击、钓鲸攻击

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 水坑攻击02 鱼叉攻击03 钓鲸攻击 01 水坑攻击 水坑攻击&#xff08;Watering Hole Attack&#xff09;是一种针对特定目标的网络攻击方式。顾名思义&#xff0c;是在受害者必经之路设置了一个“水坑…

百亿规模京东实时浏览记录系统的设计与实现

百亿规模京东实时浏览记录系统的设计与实现 系统介绍 浏览记录系统主要用来记录京东用户的实时浏览记录&#xff0c;并提供实时查询浏览数据的功能。在线用户访问一次商品详情页&#xff0c;浏览记录系统就会记录用户的一条浏览数据&#xff0c;并针对该浏览数据进行商品维度…

分享80个行业PPT,总有一款适合您

分享80个行业PPT&#xff0c;总有一款适合您 80个行业PPT下载链接&#xff1a;https://pan.baidu.com/s/1sc44xGll2RZ8Q2aiKDbjEA?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知…

阿里云ECS服务器Linux安装Mysql8

链接&#xff1a;https://pan.baidu.com/s/1s9j7OhiOMV9e9Qq9GDbysA 提取码&#xff1a;dd5a --来自百度网盘超级会员V5的分享 Mysql官网:MySQL 关于Mysql Yum Repository介绍可以看下 更加简单 关于X86和ARM 传到服务器 进入所在包 cd /usr/local/develop/mysql8 解压 …

数据结构 - 线段树

1. 预制值&#xff1a; 构建的数组为&#xff0c;nums&#xff1a;【2&#xff0c; 5&#xff0c; 1&#xff0c; 4&#xff0c; 3】区间和问题&#xff0c;假设求区间 [1&#xff0c;3] 的和 2. 建树 2.1 构建线段树数组 int[] segT new int[4*n]&#xff08;为什么数组大…

红队打靶练习:PHOTOGRAPHER: 1

目录 信息收集 1、arp 2、nmap 3、nikto 目录扫描 1、gobuster 2、dirsearch WEB 信息收集 enum4linux smbclient 8000端口 CMS利用 信息收集 文件上传漏洞利用 提权 信息收集 get user.txt get flag 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# a…

Codeforces Round 923 (Div. 3)

Codeforces Round 923 (Div. 3) Codeforces Round 923 (Div. 3) A. Make it White 题意&#xff1a;略 思路&#xff1a;找最小和最大的‘B’下标即可 AC code&#xff1a; void solve() {cin >>n;string s; cin>> s;int mn INF, mx 0;for (int i 0; i <…

Linux文件和目录管理

目录基础 Linux操作系统以目录的方式来组织和管理系统中的所有文件。所谓的目录&#xff0c;就是将所有文件的说明信息采用树状结构组织起来。每个目录节点之下会有文件和子目录。 所有一切都从 ‘根’ 开始&#xff0c;用 ‘/’ 代表, 并且延伸到子目录。 bin&#xff1a;B…

ongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(2)-Swagger框架集成

Swagger是什么&#xff1f; Swagger是一个规范且完整API文档管理框架&#xff0c;可以用于生成、描述和调用可视化的RESTful风格的 Web 服务。Swagger 的目标是对 REST API 定义一个标准且和语言无关的接口&#xff0c;可以让人和计算机拥有无须访问源码、文档或网络流量监测就…

Java并发基础:Deque接口和Queue接口的区别?

核心概念 Deque&#xff08;double ended queue&#xff0c;双端队列&#xff09;和Queue&#xff08;队列&#xff09;都是Java集合框架中的接口&#xff0c;它们用于处理元素的排队和出队&#xff0c;但是它们之间存在一些重要的区别&#xff0c;如下&#xff1a; 1、Queue…

HarmonyOS 创建components目录 定义全局自定义组件导出供整个项目使用

之前我的文章 harmonyOS 自定义组件基础演示讲解 我们讲解了 自定义组件的基础用法 但是 我们是写在单个page文件中的 这样 我们跨文件使用就很不友好了 如下图 指向 ets目录下 创建一个目录 按我们 前端开发以往的习惯 这个目录要叫 components 专门放组件集合的地方 然后 按…

《MySQL 简易速速上手小册》第3章:性能优化策略(2024 最新版)

文章目录 3.1 查询优化技巧3.1.1 基础知识3.1.2 重点案例3.1.3 拓展案例 3.2 索引和查询性能3.2.1 基础知识3.2.2 重点案例3.2.3 拓展案例 3.3 优化数据库结构和存储引擎3.3.1 基础知识3.3.2 重点案例3.3.3 拓展案例 3.1 查询优化技巧 让我们来聊聊如何让你的 MySQL 查询跑得像…

3.3-媒资管理之MinIo分布式文件系统上传视频

文章目录 媒资管理5 上传视频5.1 需求分析5.2 断点续传技术5.2.1 什么是断点续传5.2.2 分块与合并测试5.2.3 视频上传流程5.2.4 minio合并文件测试 5.3 接口定义5.4 上传分块开发5.4.1 DAO开发5.4.2 Service开发5.4.2.1 检查文件和分块5.4.2.2 上传分块5.4.2.3 上传分块测试 5.…

高并发对于服务器性能有什么要求?

随着互联网的普及和应用程序的复杂度增加&#xff0c;高并发已经成为许多应用程序必须面对的问题。高并发是指在短时间内有大量用户同时访问应用程序或数据库&#xff0c;对服务器性能提出了更高的要求。本文将探讨高并发对于服务器性能的要求。 一、高并发对服务器硬件的要求…