学到生无可恋之 Redis

news2024/11/16 13:55:14

一把年纪了还是这么菜

1 Redis 是啥

Redis 是一个高性能的 Key-Value 数据库,key 的类型是字符串,value 的类型有:string 字符串类型、list 列表类型、set 集合类型、sortedset(zset) 有序集合类型、hash 类 型、bitmap 位图类型等。

上图是普通键值数据库到 Redis 的演进,可以看出 Redis 的 Value 类型丰富,有 2 种持久化方式并且支持集群。

2 Redis 数据类型及应用场景

2.1 String 类型

Reids 的 String 能表达 3 种值的类型:字符串,整数和浮点数。

常见命令:

命令名称命令格式命令描述
set

set key value

赋值

get

get key

取值

setnx

setnx key value

当 key 不存在时才赋值,可用于实现分布式锁。

set key value NX PX 3000 原子操作,px 设置毫秒数

set age 28 NX PX 10000 不存在则赋值,有效期 10 秒

incr

incr key

递增数字,可用于实现乐观锁

decrdecr key

递减数字

应用场景

开发一个图片存储系统,要求这个系统能快速地记录图片 ID 和图片在存储系统中保存时的 ID。同时,还要能够根据图片 ID 快速查找到图片存储对象 ID。

因为图片数量巨大,所以我们就用 10 位数来表示图片 ID 和图片存储对象 ID,例如,图片 ID 为 1101000051,它在存储系统中对应的 ID 号是 3301000051。

set photo_id photo_obj_id
set 1101000051 3301000051

问题来了,上述例子中保存 1 亿张图片的信息,用了约 6.4GB 的内存,一个图片 ID 和图片存储对象 ID 的记录平均用了 64 字节。而一组图片 ID 及其存储对象 ID 的记录,实际用两个 8 字节的 Long 类型就可以表示,因为 8 字节的 Long 类型最大可以表示 2 的 64 次方的数值。

但是,为什么 String 类型却用了 64 字节呢?其实,除了记录实际数据,String 类型还需要额外的内存空间记录数据长度、空间使用等信息,这些信息也叫作元数据。当实际保存的数据较小时,元数据的空间开销就显得比较大了。

2.2 列表

list 列表类型可以存储有序、可重复的元素。

常见命令:

命令名称       命令格式命令描述
lpush

lpush key v1 v2 v3

从左侧插入列表
lpoplpop key从左侧弹出
rpushrpush key v1 v2 v3从右侧插入列表
rpoprpop key从右侧弹出

应用场景:

1、作为栈或队列使用

2、适用于展示最新列表、排行榜等场景,且数据不频繁更新且不用分页展示

如:每个商品对应一个 List,这个 List 包含了对这个商品的所有评论,而且会按照评论时间保存这些评论,每来一个新评论,就用 LPUSH 命令把它插入 List 的队头。

2.3 Set

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的不可重复的。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。

常用命令:

命令名称命令格式命令描述
sadd

sadd key mem1 mem2 ....

为集合添加新成员

spop

spop key

返回集合中一个随机元素,并将该元素删除

srandmember

srandmember key

返回集合中一个随机元素,不会删除该元素

sinter

sinter key1 key2 key3

求多集合的交集

sdiff

sdiff key1 key2 key3

求多集合的差集

sunion

sunion key1 key2 key3

求多集合的并集

应用场景:

1 关注的用户,通过 spop 进行随机抽奖

2.4 Sorted Set

元素有序不可重复

常见命令

命令名称  命令格式命令描述

zadd

zadd key score1 member1 score2 member2 ...

为有序集合添加新成员

zcount

zcount key min max

返回集合中score值在[min,max]区间 的元素数量

zrank

zrank key member

获得集合中member的排名(按分值从 小到大)

zrange

zrange key start end

获得集合中指定区间成员,按分数递增排序

zrevrange

zrevrange key start end

获得集合中指定区间成员,按分数递减排序

应用场景:

1 点击排行榜、销量排行榜、关注排行榜等

2 多维排序

需求 1:

假设有5个app的下载量和最后更新时间分别如下:

wechat-下载量:12,最后更新时间:1;其score为:12.1

qq-下载量:12,最后更新时间:2;其score为:12.2

tiktok-下载量:10,最后更新时间:3;其score为:10.3

taobao-下载量:11,最后更新时间:5;其score为:11.5

alipay-下载量:11,最后更新时间:4;其score为:11.4

将上述数据存到redis,参照命令:zadd key score1 member1 score2 member2 ...

zadd TopApp 12000000.1564022201 wechat 12000000.1564022222 qq 9808900.1563552267 tiktok 11006600.1564345601 taobao 11006600.1564345600 alipay

排序

127.0.0.1:6379> zrevrange TopApp 0 -1
1) "qq" (12.2)
2) "wechat" (12.1)
3) "taobao" (11.5)
4) "alipay" (11.4)
5) "tiktok" (10.3)

如果有三维排序,四维排序呢?可以自定义得分权重计算公式 ,这个公式包含所有影响排序的因子,例如:downloadCount*1000 + updatedTime

2.5 Hash

例子1:采用 Hash 存储下表的数据

参考命令

1)hmset key field1 value1 field2 value2  同时将多个 field-value (域-值)对设置到哈希表 key 中

2)hmget key field1 field2  获取所有给定字段的值

实际指令

1)hmset user 1:name wyd 1:balance 1888 2:name hk 2:balance 110 3:name dd 3:balance 800

2)hmget user 1:name 1:balance 

缺点:

上述例子 key 都为 user,经过哈希都会定位到同一个 redis 节点,整个表的数据都存在一个 redis 节点,redis 分布式集群存储就发挥不了作用。

例子 2

key = 用户id      field = 商品id      value = 商品数量

参考指令

1)hset key field value

2)hincrby key field increment:为哈希表 key 中的指定字段的整数值加上增量 increment

3)  hlen key:获取哈希表中字段的数量

4)hdel key field1 field2:删除一个或多个哈希字段

5)hgetall key:获取指定 key 的所有字段和值

购物车操作

1)添加商品 hset cart:{用户id}  {商品id}  1

2)增加数量 hincrby cart:{用户id}  {商品id} 1

3)商品总数 hlen cart:{用户id}

4)删除商品 hdel cart:{用户id} {商品id}

5)获取购物车所有商品 hgetall cart:{用户id}

2.6 bitmap 位图类型

bitmap是进行位操作的,通过一个 bit 位来表示某个元素对应的值或者状态,其中的 key 就是对应元素本身。 bitmap本身会极大的节省储存空间。

常用命令:

命令名称命令格式命令描述

setbit

setbit key offset value

设置key在offset处的bit值(只能是0或者1)

bitcount

bitcount key

获得key的bit位为1的个数

getbit

getbit key offset

获得key在offset处的bit值

应用场景:

1、用户每月签到,用户id为key , 日期作为偏移量 1表示签到

2、统计活跃用户, 日期为key,用户id为偏移量 1表示活跃

3、查询用户在线状态, 日期为key,用户id为偏移量 1表示在线

1)setbit user:sign:1000 20200101 1 #id为1000的用户20200101签到
2)bitcount user:sign:1000 #获取id为1000的用户的签到次数

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

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

相关文章

Mybatis:Mybatis的各种查询功能(5)

Mybaits笔记框架:https://blog.csdn.net/qq_43751200/article/details/128154837 Mybatis的各种查询功能1. 查询一个实体类对象2. 查询一个List集合3. 查询单个数据4. 查询一条数据为map集合5. 查询多条数据为map集合方法一方法二1. 查询一个实体类对象 SelectMapp…

【图像融合】小波变换彩色图像融合(带面板)【含GUI Matlab源码 782期】

⛄一、小波变换彩色图像融合简介 0 引言 目前在各种图像采集与分析系统中已大量使用彩色CCD数码相机, 但是由于其视野有限, 常常获得的只是局部图像, 如果要保证一定的分辨率的前提下采集整体彩色图像, 只能先拍摄具有重叠部分的局部彩色图像, 随后对其进行手工或自动拼接的方…

29岁才转行软件测试,目前32了,我的一些经历跟感受

按惯例,先说下我基本情况。我是90年的,算是最早的90后,现在跟你介绍的时候还恬不知耻的说我是90后,哈哈,计算机专业普通本科毕业。在一个二线城市,毕业后因为自身能力问题、认知水平问题,再加上…

基于 Delphi 的前后端分离:之二

本系列文章之二 # 摘要 上一篇文章,我在页面里面,使用 JS 向服务器端获取数据,然后修改页面元素显示数据成功。接下来,真正的页面,是需要格式的,要好看。如何做到? # 开始 # 网页模板和 Del…

用于安装和维护光纤单模和多模的光纤网络测试套件

VIAVI 唯亚威OMK-3xV2 光纤测试套件是一系列小巧且坚固耐用的仪表,用于安装和维护单模 (SM) 和多模 (MM) 光纤网络。所有测试套件均配备光功率计,以及专用于光功率、插入损耗测量和连续性检查的双波长或四波长功率计光源。 优点 随时可用 - 超高可靠性和…

四大主流BI工具的对比分析!

一、简介 1.Tableau Tableau 是一个 BI 分析和可视化工具。它为分析数据和创建交互式可视化提供了强大的功能。Tableau 旨在支持复杂的数据科学和分析,让数据专家可以使用一系列可视化工具构建分析。 2.Power BI Power BI 是 Microsoft 的产品,因此它…

[附源码]Python计算机毕业设计SSM久宠宠物店管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

Spring MVC中的拦截器

在之前学习JAVAWEB 的时候,我们学习了过滤器的知识。过滤器的作用是保护请求的服务器资源,在请求资源被执行之前,如果请求地址符合拦截范围,则会先执行过滤器。过滤器的执行时机,是在Servlet之前执行的。但是在使用了S…

Java项目导入IDEA的流程配置及常见问题解决(持续更新中...)

Java项目导入IDEA的流程配置及常见问题解决 本文主要演示一个普通 java 项目导入IDEA的流程步骤及可能出现的问题、原因及解决办法。 本文使用的部分软件版本如下: IDEA 2018.3 JDK 1.8 Windows 1.导入Java Priject 导入之后可能发出现大面积红色,这…

StringTable

文章目录1. String的基本特性2. String的内存分配3. String的基本操作4.字符串的拼接操作5. intern()的使用6. G1中的String去重操作1. String的基本特性 2. String的内存分配 使用String的intern方法可以把字符串加入到字符串常量池。同时可以使用该方法来证明JDK8中字符串常量…

PL7022/PL7022B原厂双节/两节锂电池串联充电IC和保护IC

双节锂电池串联管理系列选型表: 型号 封装 功能 PL7022B SOT23-6 双节4.2V锂电池串联保护电路 PL7022 SOT23-6 双节4.35V锂电池串联保护电路 PL7501C ESOP8 升压型双节锂电池串联充电电路(VIN:5V) PL7222 ESOP8 降压型双节锂电…

ABC 分析法(帕累托分析法、2/8分析法)

在任何特定群体中,重要的因子通常只占少数,而不重要的因子则占多数,因此只要能控制具有重要性的少数因子即能控制全局。例如,在企业中,通常认为它80%的利润来自于20%的项目或重要客户;全球最富有的 20% 人口…

帮公司面试了一个33岁的程序员,只因这一个细节,被我一眼看穿是培训班出来的,没啥工作经验...

首先,我说一句:培训出来的,优秀学员大有人在,我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配,是非常遗憾的事情。 最近,在网上看到这样一个留言,引发了程序员这个圈子不少的…

基于功能安全的车载计算平台开发:硬件层面

作为车载智能计算平台功能软件与系统软件的载体,硬件的失效可能直接导致功能软件输出不可信任的结果,从而违背安全目标。由于硬件故障在硬件生命周期中发生时间的随机性,在通过改善流程降低系统性失效的同时,ISO 26262功能安全标准…

Mysql的时间类型选定:Datetime,Timestamp,Bigint

1. 基本区别: 2. 其他特性: 1. TIMESTAMP是以utc格式存储,会自动检索当前时区对时间进行转换,而DATETIME不会。 2. 存入null时,TIMESTAMP会自动存储当前时间,而DATETIME存储null值。 3. 时间计算: DATETIME翻译为汉语即"时间戳",它是当前时间到 Unix元年(1…

RabbitMQ_消息的TTL与死信队列

什么是消息的TTL? TTL time to live,消息的TTL 消息的存活时间或过期时间 什么是死信队列? 当队列中的消息到达存活时间或过期时间后,若未设置死信队列,则该消息将被抛弃,反之则转入死信队列 死信队列 配置类 死…

Polygon zkEVM R1CS与Plonk电路转换

1. 引言 前序博客有: Polygon zkEVM的pil-stark Fibonacci状态机初体验Polygon zkEVM的pil-stark Fibonacci状态机代码解析rank-1 constraint system R1CS 由上图可知,zkEVM会借助SNARK来“验证((验证STARK证明)的SN…

博安生物再次冲刺港交所上市:负债规模高企,持续出现亏损

11月30日,山东博安生物技术股份有限公司(下称“博安生物”)再次向港交所递交招股书,准备在港交所主板上市。据贝多财经了解,博安生物曾于2022年5月13日递表,现已“失效”。 相较于此前招股书,博…

【图像分割】基于神经气体网络的图像分割与量化(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

了解抖音小程序的评级。为什么我的抖音小程序申请不了某个功能?

目录前言评级评级运营规范评级周期查看评级评级对应的权益小程序评级审核驳回场景信用分常见问题为什么我的小程序不能挂载短视频?前言 小程序评级体系是衡量小程序整体质量的参照,也是小程序获取对应权益的指南,旨在推动、鼓励开发者提升小…