当前位置: 首页 > news >正文

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

相关文章:

  • Python+Selenium WebUI自动化框架 -- 基础操作封装
  • YOLOv5 配置C2模块构造新模型
  • 飞天使-django之数据库简介
  • 网页开发如何实现简易页面跳动/跳转,html课堂练习/作业,页面ABC的相互跳转
  • CDN加速在目前网络安全里的重要性
  • C#的MessagePack(unity)--02
  • 【MySQL】数据类型
  • 阿里云CentOS主机开启ipv6
  • Spring Boot - devtools 热部署
  • 苍穹外卖项目笔记(2)
  • hive数据库delete删除部分数据/删除分区内的数据
  • PyCharm 远程连接服务器并使用服务器的 Jupyter 环境
  • C/C++疫情集中隔离 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
  • 基于SSM的设备配件管理和设备检修系统
  • Banana Pi BPI-W3之RK3588安装Qt+opencv+采集摄像头画面.
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 230. Kth Smallest Element in a BST
  • C++入门教程(10):for 语句
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • conda常用的命令
  • github从入门到放弃(1)
  • JavaScript设计模式系列一:工厂模式
  • Material Design
  • php中curl和soap方式请求服务超时问题
  • windows下mongoDB的环境配置
  • 成为一名优秀的Developer的书单
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端js -- this指向总结。
  • nb
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #vue3 实现前端下载excel文件模板功能
  • $.proxy和$.extend
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • .Net 8.0 新的变化
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • // an array of int
  • ?