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

news2024/11/24 6:57:55

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

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

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

相关文章

低代码,让我效率提升了80%

目录 ​编辑 一、前言 二、优势 三、主要功能点 四、低代码归根结底差不多 五、小结 一、前言 低代码开发平台,一个号称能在几分钟的时间里开发出一套公司内部都可使用的应用系统开发工具。很多人或许都隐隐听说过低代码,因为低代码不仅远名国外&#xf…

003 OpenCV filter2D

目录 一、环境 二、图像卷积 三、代码演示 3.1、锐化 3.2、sobel边缘,x方向 3.3、sobel边缘,y方向 3.4、高斯模糊 3.5、完整代码 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、图像卷积 在OpenCV…

CentOS停服背景下“浪潮信息KeyarchOS(KOS)系统迁移(无缝切换)解决方案”

1 前言 1.1 背景介绍 CentOS停服事件源于2020年12月宣布的CentOS项目变更,其原计划是基于Red Hat Enterprise Linux(RHEL)的开源版本,提供长期支持。然而,在2020年12月8日,官方宣布终止CentOS Linux的项目…

【数学】正投影和仿射投影

正投影 (Orthographic projection) Weak perspective projection Affine projection 形式1 形式2

BGP引入实验,华为ensp模拟器

一个小作业题,中间三台路由器bgp 100 分支用rip和ospf,最后如有引入时通过前缀列表精确匹配和路由策略调用,都是一些基本配置,考研学生们的基本功扎不扎实,从最最基础的接口配ip,到igp的路由配置&#xff0…

独立站和跨境电商平台的一个优缺点对比,哪个更适合你?

不管哪个行业都是一样的,有优点也有缺点,就像人们常说的人无完人一样。然后,我们来说说最近比较受关注的跨境电商独立站和跨境电商平台的一个优缺点对比吧! 了解跨境电商独立站 建站,测试模板网站 跨境电商独立站 优点…

早上好图片漂亮祝福语,祝你事业芝麻节节高,好运连连天天妙!

1、清晨,我呼吸着新鲜空气,迎面的风捎来了你的气息,不知你现在在哪里?希望在这美丽的早晨时时见到开开心心的你,早安! 2、无论岁月如何变幻,不变的是心态,改变的是容颜,…

阿里云CentOS主机开启ipv6

目录 一、云主机开启和使用 ipv6 1、网络和交换机开启 ipv6 2、创建 / 编辑云主机,开启ipv6 3、安全组放行ipv6端口 二、使用 ipv6 地址进行 ssh 连接 三、ipv6 地址绑定域名 一、云主机开启和使用 ipv6 1、网络和交换机开启 ipv6 进入网络、交换机详情页面…

低代码是“银弹”,还是“毒弹”?

目录 1.Pro Code 真的更“香”吗? 门槛高 跨界难 代码编写只是第一步 2.Low Code 银弹论合理吗? Pro Code和Low Code的差异: 3.写在最后 “低代码”接力“中台”燃起了熊熊之火,引发了众多业内人士论战。有人认为低代码是毒瘤&…

使用FP8加速PyTorch训练

现代的人工智能硬件架构(例如,Nvidia Hopper, Nvidia Ada Lovelace和Habana Gaudi2)中,FP8张量内核能够显著提高每秒浮点运算(FLOPS),以及为人工智能训练和推理工作负载提供内存优化和节能的机会。 在这篇文章中,我们将介绍如何修…

DBeaver 23.2.4发布

导读DBeaver 23.2.4发布,修复和添加了一些新功能。 SQL 编辑器 为更新语句添加了代码自动补全功能修复了智能补全和替换带引号表达式的问题删除了日志中首次打开 SQL 编辑器时出现的多余错误 数据库导航器 添加了过滤对象可视化功能修复了脚本文件夹打开问题 数据传输 正确…

消除“数据烟囱”,瓴羊港如何打破壁垒将多数据融通成大数据?

作为数字经济时代的“新石油”,数据已成为重要的生产要素。阿里巴巴副总裁、瓴羊CEO朋新宇认为,目前正处在数据流通变革的时代,其中最核心的问题是如何破解数实融合发展的堵点。数据流通中最重要的原则是,不流通无价值&#xff0c…

echarts 实现同一组legend控制两个饼图示例

实现同一组legend控制两个饼图示例: 该示例有如下几个特点: ①饼图不同值实现分割 ②实现tooltip自定义样式(echarts 实现tooltip提示框样式自定义-CSDN博客) ③自定义label内容 ④不同值颜色渐变 代码如下: this.o…

html实现图片裁剪处理(附源码)

文章目录 1.设计来源1.1 主界面1.2 裁剪界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/134455169 html实现图片裁剪处理(附源码),支持图片放大缩小&#…

Linux下安装部署redis(离线模式)

一、准备工作 1.下载redis的安装包 下载地址:Index of /releases/ 大家可以自行选择redis的版本,笔者选择的是最新的 2.上传到服务器 前提是我先在服务器上创建了一个目录redis7.2.3,我直接上传到这个目录下 二、安装redis 1.解压redis t…

阿里云服务器ECS安装宝塔面板

前言 如今各种云服务器租借平台,例如腾讯云、阿里云之类的,很轻松的就能租借得到一台Linux的服务器。但是Linux的管理和使用存在一定的门槛。宝塔面板作为一款流行的服务器管理软件,提供了简单易用的图形化界面和丰富的管理功能,降…

Android SmartTable根据int状态格式化文字及颜色

private void initData() {List<UserInfo> list new ArrayList<>();list.add(new UserInfo("一年级", "李同学", 6, 1, 120, 1100, 450, 0));list.add(new UserInfo("一年级", "张同学", 6, 2, 120, 1100, 450, 1));list…

electron使用better-sqlite3打包失败(electron打包有进程没有界面)

remove *\chrome_100_percent.pak: Access is denied. 解决&#xff1a; 管理员权限执行&#xff1a;taskkill /IM 你的进程名.exe /F&#xff0c;再次执行build electron使用better-sqlite3打包后有进程没有界面 原因是代码及依赖包安装有误&#xff0c;模块丢失。主要分享的…

Flat Ads将在杭州举办社交出海沙龙,探寻海外巨大增量空间

深圳站落幕后&#xff0c;Flat Ads社交沙龙活动迎来杭州站&#xff01;11月29日&#xff0c;Flat Ads联动Alibaba Cloud、TopOn、融云&#xff0c;开展《泛娱乐社交APP出海新风口-杭州站》&#xff0c;分享如何捕捉出海新赛道的风向标&#xff0c;并迅速实现获客增长&#xff0…