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被移除了)
shell 复制代码
# 查看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 [nx ex]`
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字符串后存储)

KEY VALUE(存储的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集合来存储

BASH 复制代码
# 张三的好友有:李四、王五、赵六
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

shell 复制代码
# 将班级的下列学生得分存入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
相关推荐
tatasix39 分钟前
MySQL UPDATE语句执行链路解析
数据库·mysql
秋意钟44 分钟前
缓存雪崩、缓存穿透【Redis】
redis
南城花随雪。1 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了1 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度1 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
简 洁 冬冬1 小时前
046 购物车
redis·购物车
天海华兮1 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
雯0609~1 小时前
网页F12:缓存的使用(设值、取值、删除)
前端·缓存
soulteary1 小时前
突破内存限制:Mac Mini M2 服务器化实践指南
运维·服务器·redis·macos·arm·pika
gma9992 小时前
Etcd 框架
数据库·etcd