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

news2024/11/15 12:02:59

学习 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 1
      
      2. 判断是否打卡。
      GETBIT uid:sign:9527:202401 15
      
      3. 统计 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.0
      
      2. 返回给定 HyperLogLog 的基数估算。
      PFCOUNT key [key ...]
      127.0.0.1:6379> pfcount website:javapub:uv
      
      3. 将多个 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.coloradmin.cn/o/1439087.html

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

相关文章

16:定时器和计数器

定时器和计数器 1、定时器和计数器的介绍2、定时器是如何工作3、寄存器4、51单片机定时器简介&#xff08;数据手册&#xff09;5、定时器中的寄存器&#xff08;数据手册&#xff09;5.1、TCON&#xff08;定时器控制寄存器&#xff09;5.2、TMOD&#xff08;工作模式寄存器&a…

嵌入式学习之Linux入门篇笔记——13,Linux第一个程序HelloWorld

配套视频学习链接&#xff1a;http://【【北京迅为】嵌入式学习之Linux入门篇】 https://www.bilibili.com/video/BV1M7411m7wT/?p4&share_sourcecopy_web&vd_sourcea0ef2c4953d33a9260910aaea45eaec8 1.什么是 gcc&#xff1f; gcc 全称&#xff08;gun compiler…

【附代码】NumPy加速库NumExpr(大数据)

文章目录 相关文献测试电脑配置数组加减乘除数组乘方Pandas加减乘除总结 作者&#xff1a;小猪快跑 基础数学&计算数学&#xff0c;从事优化领域5年&#xff0c;主要研究方向&#xff1a;MIP求解器、整数规划、随机规划、智能优化算法 如有错误&#xff0c;欢迎指正。如有…

iPhone解锁 AnyMP4 iPhone Unlocker

AnyMP4 iPhone Unlocker是一款功能强大的iPhone解锁软件&#xff0c;旨在帮助用户轻松解决iPhone密码忘记、设备锁定等问题。无论是屏幕密码、指纹解锁还是Face ID&#xff0c;该软件都能提供有效的解决方案。 这款软件支持多种iPhone型号&#xff0c;包括最新的iPhone 14系列…

JavaEE作业-实验三

目录 1 实验内容 2 实验要求 3 思路 4 核心代码 5 实验结果 1 实验内容 简单的线上图书交易系统的web层 2 实验要求 ①采用SpringMVC框架&#xff0c;采用REST风格 ②要求具有如下功能&#xff1a;商品分类、订单、购物车、库存 ③独立完成&#xff0c;编写实验报告 …

【Go】三、Go并发编程

并发编程 我们主流的并发编程思路一般有&#xff1a;多进程、多线程 但这两种方式都需要操作系统介入&#xff0c;进入内核态&#xff0c;是十分大的时间开销 由此而来&#xff0c;一个解决该需求的技术出现了&#xff1a;用户级线程&#xff0c;也叫做 绿程、轻量级线程、协…

Leetcode—42. 接雨水【困难】

2024每日刷题&#xff08;112&#xff09; Leetcode—42. 接雨水 空间复杂度为O(n)的算法思想 实现代码 class Solution { public:int trap(vector<int>& height) {int ans 0;int n height.size();vector<int> l(n);vector<int> r(n);for(int i 0; …

《学成在线》微服务实战项目实操笔记系列(P1~P62)【上】

《学成在线》项目实操笔记系列【上】&#xff0c;跟视频的每一P对应&#xff0c;全系列12万字&#xff0c;涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳&#xff0c;参考这篇&#xff0c;相信会带给你极大启发。同时也欢迎大家提问与讨论&#xff0c;我会尽力帮大家解…

RK3568笔记十二:Zlmedia拉流显示测试

若该文为原创文章&#xff0c;转载请注明原文出处。 Zlmediakit功能很强大&#xff0c;测试一下拉流&#xff0c;在通过解码显示。 一、环境 1、平台&#xff1a;rk3568 2、开发板:ATK-RK3568正点原子板子 3、环境&#xff1a;buildroot 测试的代码在GitHub - airockchip/…

ubuntu20安装mongodb

方法一&#xff1a;直接安装(命令是直接从mongo官网Install MongoDB Community Edition on Ubuntu — MongoDB Manual复制的&#xff09; cat /etc/lsb-release sudo apt-get install -y gnupg curl curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \sudo gp…

VS Code中主程序C文件引用了另一个.h头文件,编译时报错找不到函数

目录 一、问题描述二、问题原因三、解决方法四、扩展五、通过CMake进行配置 一、问题描述 VS Code中主程序C文件引用了另一个.h头文件&#xff0c;编译时报错找不到函数 主程序 main.c #include <stdio.h> #include "sumaa.h"int main(int, char**){printf(&q…

秘塔科技推出AI搜索产品「秘塔AI搜索」

近日&#xff0c;国内一家人工智能科技公司&#xff08;秘塔科技&#xff09;推出了一款AI搜索产品——秘塔AI搜索&#xff0c;能够大幅提升搜索效率&#xff0c;解决日常生活、工作学习等场景中遇到的各类搜索需求。 秘塔AI搜索官网&#xff1a;https://metaso.cn/ 相较于传统…

Java 学习和实践笔记(2)

今天的学习进度&#xff1a; 注册并下载安装好了Java 8&#xff0c;之后进行以下配置。 1&#xff09;path 是一个常见的环境变量&#xff0c;它告诉系统除了在当前的目标下妹寻找此程序外&#xff0c;还可以到path指定的目录下找。 2&#xff09;Java Home 为以后其他的软…

FastAdmin西陆房产系统(xiluHouse)全开源

应用介绍 一款基于FastAdminThinkPHPUniapp开发的西陆房产管理系统&#xff0c;支持小程序、H5、APP&#xff1b;包含房客、房东(高级授权)、经纪人(高级授权)三种身份。核心功能有&#xff1a;新盘销售、房屋租赁、地图找房、房源代理(高级授权)、在线签约(高级授权)、电子合同…

MATLAB环境下用于提取冲击信号的几种解卷积方法

卷积混合考虑了信号的时延&#xff0c;每一个单独源信号的时延信号都会和传递路径发生一 次线性瞬时混合&#xff1b;解卷积的过程就是找一个合适的滤波器&#xff0c;进行反卷积运算&#xff0c;得到源信号的近似解。 声音不可避免的会发生衍射、反射等现象&#xff0c;所以&…

(注解配置AOP)学习Spring的第十七天

基于注解配置的AOP 来看注解式开发 : 先把目标与通知放到Spring里管理 : Service("userService") public class UserServiceImpl implements UserService {Overridepublic void show1() {System.out.println("show1......");}Overridepublic void show2…

Elasticsearch:使用 LangChain 文档拆分器进行文档分块

使用 Elasticsearch 嵌套密集向量支持 这个交互式笔记本将&#xff1a; 将模型 “sentence-transformers__all-minilm-l6-v2” 从 Hugging Face 加载到 Elasticsearch ML Node 中使用 LangChain 分割器将段落分块成句子&#xff0c;并使用嵌套密集向量将它们索引到 Elasticse…

【RL】Bellman Equation (贝尔曼等式)

Lecture2: Bellman Equation State value 考虑grid-world的单步过程&#xff1a; S t → A t R t 1 , S t 1 S_t \xrightarrow[]{A_t} R_{t 1}, S_{t 1} St​At​ ​Rt1​,St1​ t t t, t 1 t 1 t1&#xff1a;时间戳 S t S_t St​&#xff1a;时间 t t t时所处的sta…

基于蒙特卡洛的电力系统可靠性分析matlab仿真,对比EDNS和LOLP

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 1.课题概述 电力系统可靠性是指电力系统按可接受的质量标准和所需数量不间断地向电力用户供应电力和电能量的能力的量度&#xff0c;包括充裕度和安全性两个方面。发电系统可靠性是指统一并网的全部发电机…

【RT-DETR有效改进】重参数化模块DiverseBranchBlock助力特征提取(附代码 + 修改教程)

&#x1f451;欢迎大家订阅本专栏&#xff0c;一起学习RT-DETR&#x1f451; 一、本文介绍 本文给大家带来的是改进机制是一种替换多元分支模块&#xff08;Diverse Branch Block&#xff09;&#xff0c;Diverse Branch Block (DBB) 是一种用于增强卷积神经网络性能的结构…