04-快速掌握Redis,了解Redis中常见的结构类型及其应用场景

Redis快速入门

Remote Dctionary Server

Redis是用C语言开发的一个开源的、基于内存的(高性能)键值对(key-value)结构化NoSql数据库,每秒内查询次数可以达到100000+的QPS

  • 键值型: Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样(如字符串、数值、甚至json)

  • NoSql(Not Only Sql): 是一种非关系型数据库相对于传统关系型数据库而言有很大差异,是对关系型数据库的补充

Redis应用场景:数据库, 缓存(基于内存)、消息队列、任务队列、分布式锁

  • 单线程: 每个命令具备原子性
  • 低延迟,速度快(基于内存、IO多路复用、良好的编码)
  • 支持数据持久化
  • 支持主从集群(从节点可以备份主节点的数据)、分片集群
  • 支持多语言客户端

在这里插入图片描述

Redis常见命令

快速学习

Redis是典型的key-value数据库,key一般是字符串,而value包含很多不同的数据类型,操作不同的数据类型对应不同的命令

在这里插入图片描述

Redis官网将操作不同数据类型的命令也做了分组,我们可以去官网查看到不同的命令方便学习

在这里插入图片描述

help @group类型: 每一种数据类型对应不同的分组, 查看各种不同group(数据类型)去学习相关的命令

在这里插入图片描述

Redis通用命令

通用指令是部分数据类型都可以使用的指令, help [command]可以查看一个命令的具体用法,tab键可以自动补全命令并带有参数提示

命令功能
KEYS 通配符查看符合模板的所有key, 这种方式效率不高生产环境中不建议使用,因为redis是单线程的在查询期间无法执行其他命令
DEL [key...]删除一个或多个指定的key,返回删除key的数量
EXISTS [key...]判断指定的key是否存在(0表示不存在,1表示存在)
EXPIRE key seconds给一个key设置有效期,有效期到期时该key会被自动删除(redis是基于内存存储的,定时清理可以节省内存空间)
TTL key查看一个KEY的剩余有效期(默认key的有效期是-1表示永久有效,有效期是-2表示这个key被移除了)
# 查看keys命令的帮助信息
127.0.0.1:6379> help keys
# 语法格式
KEYS pattern
# 描述信息
summary: Find all keys matching the given pattern
since: 1.0.0
group: generic

String类型(value是字符串)

String字符串类型是Redis中最简单的存储类型, 其中value是字符串,字符串类型的最大空间不能超过512m

根据字符串的格式不同, String类型可以分为3类 ,不管是哪种字符串格式底层都是以字节数组形式存储,只不过是编码方式不同

  • string:普通字符串
  • int:整数类型,可以做自增、自减操作
  • float:浮点类型,可以做自增、自减操作

在这里插入图片描述

命令功能
`SET key value [nxex]`
GET key 根据key获取String类型的value
MSET [key value...]批量添加多个String类型的键值对
MGET [key...]根据多个key获取多个String类型的value,返回一个数组
INCR key每执行一次让一个整型的key自增1
INCRBY key 增长的数量让一个整型的key自增并指定步长(负数表示减少),例如incrby num -2 (让num值减少2)
INCRBYFLOAT key 增长的数量让一个浮点类型的数字自增并指定步长
SETNX key value添加一个String类型的键值对,前提是这个key不存在否则不执行,SET使用nx选项的效果和其效果一致
SETEX key seconds value添加一个String类型的键值对并且指定有效期,SET使用ex选项的效果和其效果一致

Key结构

当我们需要存储用户信息或商品信息到redis中时,有一个用户id是1,有一个商品id恰好也是1,此时如果使用id作为key就会发生冲突

Redis区分不同类型的key: Redis没有类似MySQL中的Table的概念, 它规定通过给key添加前缀加以区分key的类型

  • 添加前缀的规范: Redis的key允许有多个单词形成层级结构,多个单词之间用:隔开, 项目名:业务名:类型:id(具体根据自己的需求来删除或添加词条)

需求: 我们的商城项目有user和product两种不同类型的数据, 如果要存储的Value是一个Java对象(将对象序列化为JSON字符串后存储)

KEYVALUE(存储的Value是一个Java对象)
heima:user:1{“id”:1, “name”: “Jack”, “age”: 21}
heima:product:1{“id”:1, “name”: “小米11”, “price”: 4999}

在Redis的桌面客户端中还会以相同前缀作为层级结构,让数据看起来层次分明,关系清晰

在这里插入图片描述

Hash类型(value是HsahMap)

String结构是将对象序列化为JSON字符串后存储,由于字符串是个整体无法单独修改对象中某个字段的值,此时我们可以使用Hash类型

Hash类型也叫散列,其value是一个无序字典(类似于Java中的HashMap结构),可以将对象中的每个字段独立存储方便针对单个字段做CRUD

在这里插入图片描述

命令功能
HSET key field value添加或者修改hash类型key的field的值
HGET key field获取一个hash类型key的field的值
HDEL key field删除存储在哈希表中的指定字段
HMSET key [field value...]批量添加多个hash类型key的field的值
HMGET key [field...]批量获取多个hash类型key的field的值
HGETALL key获取一个hash类型的key中的所有的field和value
HKEYS key获取一个hash类型的key中的所有的field
HVALS获取一个hash类型的key中的所有的value
HINCRBY 步长(正数表示增加,负数表示减少)让一个hash类型key的字段值自增并指定步长
HSETNX key field value添加一个hash类型的key的field值,前提是这个field不存在否则不执行

List类型(value是双向链表)

Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构(左侧是队首右侧是队尾)

  • 特征: 有序(存取顺序一致), 元素可以重复, 插入和删除快, 查询速度一般,既可以支持正向检索和也可以支持反向检索
  • List类型常用来存储一个有序数据,例如朋友圈点赞列表,评论列表等

List的常见命令: L表左边,R表示右边,B表示阻塞, key表示一个LinkedList集合

  • 将入口和出口设置在同一边可以模拟一个栈
  • 将入口和出口设置在不同边可以模拟一个队列
  • 将入口和出口设置在不同边,出队时采用BLPOP或BRPOP可以模拟一个阻塞队列

在这里插入图片描述

命令功能
LLEN key获取列表长度
LPUSH key [element...] ...向某个key列表的左侧按照顺序插入一个或多个元素
LPOP key [count]移除并返回某个key列表的左侧第一个元素,没有则返回nil表示没有
LRANGE key start stop获取列表指定范围内的元素,stop的值是-1时表示查询所有元素
RPUSH key [element...]向某个key列表的右侧按照顺序插入一个或多个元素
RPOP key [count]移除并返回某个key列表右侧的第一个元素,没有则返回nil表示没有
LRANGE key star end返回一段角标范围内的所有元素
BLPOP和BRPOP key timeout与LPOP和RPOP类似,只不过在没有元素时会等待一段时间,而不是直接返回nil

Set类型(HashSet)

Redis的Set类型与Java中的HashSet类似,可以看做是一个value为null的HashMap

  • 特征:无序(存取顺序不一致),元素不可重复(相同元素会覆盖),查找快
  • 支持交集、并集、差集可以用来统计好友列表的功能

Set的常见命令: key表示HashSet集合

命令功能
SADD key [member...]向set中添加一个或多个元素
SREM key [member...]移除set中的一个或者多个元素
SCARD key返回set中元素的个数
SISMEMBER key member判断一个元素是否存在于set中(0表示不存在,1表示存在)
SMEMBERS获取set中的所有元素
SINTER key1 [key2...]求key1与key2等多个key的交集
SDIFF key1 [key2 ...]求key1与key2的差集(key1 - key2)
SUNION key1 [key2 ...]求key1和key2等多个key的并集(合并之后重复元素只会记录一次)

将下列数据用Redis的Set集合来存储

# 张三的好友有:李四、王五、赵六
127.0.0.1:6379> sadd zhangsan lisi wangwu zhaoliu
# 李四的好友有:王五、麻子、二狗
127.0.0.1:6379> sadd lisi wangwu mazi ergou
# 计算张三的好友有几人
127.0.0.1:6379>scard zhangsan
# 计算张三和李四有哪些共同好友,"wangwu"
127.0.0.1:6379> sinter zhangsan lisi
# 查询哪些人是张三的好友却不是李四的好友,"zhaoliu"和 "lisi"
127.0.0.1:6379> sdiff zhangsan lisi
# 查询张三和李四的好友总共有哪些人, "wangwu","zhaoliu","ergou","lisi", "mazi"
127.0.0.1:6379> sunion zhangsan lisi
# 判断李四是否是张三的好友
127.0.0.1:6379> sismember zhangsan lisi
# 判断张三是否是李四的好友
127.0.0.1:6379> sismember lisi zhangsan
# 将李四从张三的好友列表中移除
127.0.0.1:6379> srem zhangsan lisi

SortedSet类型

Redis的SortedSet是一个可排序的set集合,虽然功能与Java中的TreeSet有些类似但底层数据结构却差别很大, TreeSet底层是通过红黑树实现的

  • SortedSet中的每一个元素都携带一个score属性,redis底层基于score属性的值通过一个跳表(SkipList)加hash表实现对元素排序(默认升序)
  • 特征: 可排序, 元素不重复, 查询速度快
  • 因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能

SortedSet的常见命令:key表示TreeSet集合, 所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV

  • ZREVRANK key memeber : 降序获取sortedset中的指定元素的排名
命令功能
ZADD key score member [score member...]添加一个或多个元素到sortedset ,如果已经存在则更新其score值
ZREM key member [member...]删除sortedset中的一个或多个元素
ZSCORE key member获取sortedset中的指定元素的score值
ZRANK key member获取sortedset中的指定元素的排名(从0开始编号)
ZCARD key获取sortedset中的元素个数
ZCOUNT key min max统计指定score范围内的所有元素的个数
ZINCRBY key increment(数值可正可负) member让sortedset中的指定元素自增指定的increment值
ZRANGE key min max按照score排序后,获取指定排名范围内的元素(排名从0开始编号)
ZRANGEBYSCORE key min max按照score排序后,获取指定score范围内的元素
ZDIFF、ZINTER、ZUNION求差集、交集、并集

将班级的下列学生得分存入Redis的SortedSet中,Jack 85, Lucy 89, Rose 82, Tom 95, Jerry 78, Amy 92, Miles 76

# 将班级的下列学生得分存入Redis的SortedSet中
127.0.0.1:6379> zadd stu 85 Jack 89 Lucy 82 Rose 95 Tom 78 Jerry 92 Amy 76 Miles
# 删除Tom同学
127.0.0.1:6379> zrem stu Tom
# 获取Amy同学的分数,"92"
127.0.0.1:6379> zscore stu Amy
# 获取Rose同学的排名
127.0.0.1:6379> zrank stu Rose
# 查询80分以下有几个学生
127.0.0.1:6379> zcount stu 0 80
# 给Amy同学加2分,"94"
127.0.0.1:6379> zincrby stu 2 Amy
# 查出成绩前3名的同学,"Miles","Jerry","Rose"
127.0.0.1:6379> zrange stu 0 2
# 查出成绩80分以下的所有同学,"Miles","Jerry
127.0.0.1:6379> zrangebyscore stu 0 80

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年第九届数维杯国际大学生数学建模挑战赛A题

2023年第九届数维杯国际大学生数学建模挑战赛正在火热进行,小云学长又在第一时间给大家带来最全最完整的思路代码解析!!! A题思路解析如下: 完整版解题过程及代码,稍后继续给大家分享~ 更多题目完整解析点…

SpringCloud微服务:Nacos的集群、负载均衡、环境隔离

目录 集群 在user-service的yml文件配置集群 启动服务 负载均衡 order-service配置集群 设置负载均衡 当本地集群的服务挂掉时 访问权重 环境隔离 1、Nacos服务分级存储模型 一级是服务,例如userservice 二级是集群,例如杭州或上海 …

【AI视野·今日Sound 声学论文速览 第三十三期】Wed, 25 Oct 2023

AI视野今日CS.Sound 声学论文速览 Wed, 25 Oct 2023 Totally 8 papers 👉上期速览✈更多精彩请移步主页 Daily Sound Papers CDSD: Chinese Dysarthria Speech Database Authors Mengyi Sun, Ming Gao, Xinchen Kang, Shiru Wang, Jun Du, Dengfeng Yao, Su Jing W…

jQuery【事件处理器、鼠标事件、表单事件、键盘事件、浏览器事件、事件对象、jQuery遍历】(三)-全面详解(学习总结---从入门到深化)

目录 事件之绑定事件处理器 事件之鼠标事件 事件之表单事件 事件之键盘事件 事件之浏览器事件 事件对象 jQuery遍历 事件之绑定事件处理器 1、 .on() 在选定的元素上绑定一个或多个事件处理函数 $("#button").on("click", function(event){console…

Android---网络编程优化

网络请求操作是一个 App 的重要组成部分,程序大多数问题都是和网络请求有关。使用 OkHttp 框架后,可以通过 EventListener 来查看一次网络请求的详细情况。一次完整的网络请求会包含以下几个步骤。 也就是说,一次网络请求的操作是从 DNS 解析…

第四代智能井盖传感器:万宾科技智能井盖位移监测方式一览

现在城市化水平不断提高,每个城市的井盖遍布在城市的街道上,是否能够实现常态化和系统化的管理,反映了一个城市治理现代化水平。而且近些年来住建部曾多次要求全国各个城市加强相关的井盖管理工作,作为基础设施重要的一个组成部分…

Python windows安装Python3环境

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

Vue3 自定义hook函数

这个hook函数并不是Vue3 自带的,而是为了方便我们书写和复用代码。 当我们在setup函数中写了很多内容过后,就会变得很乱,所以我们将实现相同功能的数据、方法和生命周期等等打包单独放在一个文件中,就会整洁很多。 例如&#xf…

Linux友人帐之网络编程基础邮件服务器与DHCP服务器

一、邮件服务器概述 1.1邮件服务基础 邮件服务器是一种计算机程序,它通过电子邮件协议接收、存储、处理和发送电子邮件。邮件服务器可以与电子邮件客户端程序(如Outlook、Thunderbird等)或Web邮件界面(如Gmail、Outlook.com等&am…

操作系统OS/存储管理/内存管理/内存管理的主要功能_基本原理_要求

基本概念 内存管理的主要功能/基本原理/要求 **内存管理的主要功能: ** 内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配的麻烦,提高编程效率。地址转换。在多道程序环境下,程序中的逻辑地…

数字档案室建设评价

数字档案室建设评价应考虑以下几个方面: 1. 安全性:数字档案室的主要目的是确保档案资料的安全性。评价应考虑数字档案室的物理安全性、防火措施、保密措施、网络安全等方面。 2. 可访问性:数字档案室应该易于访问和使用。评价应考虑数字档案…

OCC教学:预备基础

预备基础:1.概览 什么是Open CASCADE Technology? Open CASCADE Technology (OCCT) 是一个功能强大的开源 C 库,由数千个类组 成,并提供以下领域的解决方案: 表面和实体建模:对任何对象进行建模。3D 和 …

制造业数据标准化的优势分析

之前我们介绍过>>数据驱动工作效率提升的5个层次——以PreMaint设备数字化平台为例,这次我们将深入分析数据标准化在制造业中的优势。 从持续的供应链中断和疯狂的通货膨胀,到日益昂贵和难以采购的原材料,制造企业正面对越来越多的挑战…

APM/PX4/betaflight/inav开源飞控之IMU方向

APM/PX4/betaflight/inav开源飞控之IMU方向 1. 源由2. 坐标系2.1 APM/PX4:机体坐标 右手系规则2.2 betaflight/inav:xEast-yNorth-zUp yaw反向 右手系规则 3. 转向定义3.1 APM/PX43.2 betaflight/inav 4. 实例4.1 I C M 42688 P ICM42688P ICM42688P…

把jar包打到本地仓库然后上传到私服

1.首先把需要打成maven的包放到本地 2.然后本地配置maven的环境变量 没有配置的话可以看看下面这个,教程很详细 Windows系统配置maven环境_windows配置maven环境变量-CSDN博客 3.WinR cmd 输入如下的指令: mvn install:install-file -Dfile.\device…

unity shaderGraph实例-扫描效果

文章目录 效果展示整体结构各区域内容区域1区域2区域3区域4区域5区域6GraphSetttings注意事项使用方法 效果展示 整体结构 各区域内容 区域1 用场景深度减去顶点的View空间的视野深度(Z值),这里Z值需要乘-1是因为从相机看到的物体顶点的视野…

Kontakt Factory Library 2(Kontakt原厂音色库2)

Kontakt Factory Library 2是一款由Native Instruments开发的音乐采样库。它是Kontakt采样器软件的官方库之一,提供了丰富的音色和音乐资源,可用于制作各种类型的音乐。 Kontakt Factory Library 2包含了数千个高质量的乐器采样,涵盖了各种乐…

不会英语能学编程吗?0基础学编程什么软件好?

不会英语能学编程吗?0基础学编程什么软件好? 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的软件,象如图这个…

【数据分享】1961—2022年全国范围的逐日降水栅格数据

降水数据是我们在各项研究中最常用的气象指标之一!之前我们给大家分享过来源于国家青藏高原科学数据中心发布的1901-2022年1km分辨率逐月降水栅格数据以及1901-2022年1km分辨率逐年降水栅格数据(均可戳我跳转)!很多小伙伴拿到数据…

OpenCV基础应用(4)— 如何改变图像的透明度

前言:Hello大家好,我是小哥谈。本节课就手把手教你如何改变图像的透明度,希望大家学习之后能够有所收获~!🌈 目录 🚀1.技术介绍 🚀2.实现代码 🚀1.技术介绍 改变图像透明度的实…