【Redis篇】数据结构与指令

此篇仅为个人初期学习笔记,如有错误请xdm指正
在了解了Redis之后,必然会去探索如何使用它,每种语言都会有自己的语法规范,下面要我们一起学习Redis的数据结构与通用语法及其指令

目录

  • 一、Redis数据结构介绍
  • 二、Redis通用指令
  • 三、String类型
    • 简介
  • 四、Hash类型
    • 简介
    • 常用命令
  • 五、List类型
    • **简介**
    • **常用命令**
    • **应用**
  • 六、Set类型
    • **简介**
    • **常用命令**
    • **practise:**
  • 七、SortedSet类型
    • **简介**
    • **常用命令**
    • **练习:**


一、Redis数据结构介绍

Redis是key-value数据库,键一般是String类型,但是值可以是多种类型
【Redis篇】数据结构与指令_第1张图片

二、Redis通用指令

通用指令是全部数据类型都可以使用的指令,常见的有:

  • KEYS:查看符合模板的所有键(效率太低,不建议使用)
  • DEL:删除一个指定键的键值对
  • EXISTS:判断key是否存在
  • EXPIRE:给一个键值对设置有效期,有效期到期该键值对就会失效
  • TTL:查看一个键的剩余有效期

通过**help [command]**可以查看一个命令的具体用法,举例如下:
【Redis篇】数据结构与指令_第2张图片

三、String类型

简介

String类型,也即字符串类型,是Redis中最简单的存储类型。

其Value是字符串,有三类:

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

不管是哪种类型,底层使用的都是字符数组来存储,只是不同的类型使用不同的编码方式。字符串类型的最大空间不得超过512mb.

常见指令:

  • SET:添加或者修改(key存在就修改,不存在就添加)一个字符串类型的键值对。
  • GET:获取指定键所对应String类型的值
  • MSET批量添加多个String类型的键值对
  • MGET:根据多个key获取多个String类型的值
  • INCR:然整数自增1
  • INCRBY:让一个整型的key自增指定的长度,eg:incrby num 2:让num所对应的值自增2
  • INCRBYFLOAT:让一个浮点型的key自增指定的长度
  • SETNX:添加一个String类型的键值对,前提:如果不存在就添加,存在就不添加。
  • SETEX:添加一个String类型的键值对,并指定有效时间

特殊场景

Redis没有MySQL的Table概念,那如何存储同名不同意的key呢?

  • 例如:需要存储用户、商品信息到Redis中,有一个用户id是1,有一个商品id也是1

Redis是通过一种key的结构来解决这个问题的

key的结构(多个单词形成层级结构,不同层用冒号隔开):

项目名:业务名:类型:id

这个格式不是固定的,可以根据业务需求进行增删

例如,我们的项目名叫做xbxbc,有user和product俩种不同类型的数据,可以这样定义key:

  • xbxbc:user:1
  • xbxbc:product:1

如果value是对象类型,可以将它转成json字符串然后再存储

四、Hash类型

简介

Hash类型,也叫做散列,其值的存储是无序的,类似于Java中的HahMap结构

String类型,将对象转成JSON对象然后存储,需要修改某个字段时,非常麻烦

【Redis篇】数据结构与指令_第3张图片
Hash类型完美解决了这个问题,它将对象每个属性拆分存储,可以针对特定字段进行CRUD
【Redis篇】数据结构与指令_第4张图片

常用命令

  • HSET key field value:添加或修改hash类型key的filed值
  • HGET key field:获取hash类型key所对应的filed值
  • HMSET:批量添加多个hash类型key的filed值
  • HMGET:批量获取多个hash类型key的多个filed值
  • HGETALL:获取一个hash类型key的所有filed和value
  • HKEYS:获取一个hash类型的key中所有filed
  • HVALS:获取指定hash类型的key所对应的所有的value
  • HINCRBY:指定一个hash类型的key的字段自增指定长度
  • HSETNX:首先判断一个hash类型的key的filed是否存在,如果不存在就添加,存在就不添加

五、List类型

简介

类比Java中的LinkedList类型,Redis中的List类似可以看作一个双向链表。支持正向和反向索引。

特性:

  • 有序
  • 元素可重复
  • 插入和删除快(只需要修改节点的属性值)
  • 查询速度一般(无论正向还是方向,都需要从头到尾遍历)

常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。

常用命令

  • LPUSH key element…:往列表左侧添加一个或多个元素
  • LPOP key:从列表左侧获取一个元素,并从列表中删除,没有元素返回nil
  • RPUSH key element…:往列表右侧添加一个或多个元素
  • RPOP key:从列表右侧获取一个元素,并从列表中删除,没有元素返回nil
  • LRANGE key star end:从左侧起,返回指定索引范围的值(0基的)
  • BLPOP和BRPOP:与LPOP和RPOP类型,只不过是在没有元素的时候不会直接返回nil,而是等待指定时间

应用

分析:以下问题只需要抓住一个关键点,那就是数据进去和出去的方向是否一致,因为只有俩个方向

  1. 如何利用list结构模拟一个栈?
    • 入口和出口相同
    • 有俩种实现方式:左添加左获取;有添加有获取
  2. 如何利用list结构模拟一个队列?
    • 入口和出口不同
    • 有俩种实现方式:左添加右获取;右添加左获取。
  3. 如何利用list结构模拟一个阻塞队列?
    • 在2的队列的基础上,添加一个有效时间

六、Set类型

简介

类比Java的HashSet,可以把Set看作是一个value为null的HashMap。因为也是hash表,也具备HashSet类似的特征:

  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集、并集、差集(属于集合A,但不属于集合B)等功能

常用命令

  • SADD key member…:向set中提添加一个或多个元素
  • SREM key member…:移除set中的指定元素
  • SCARD key:返回set集合中元素的个数
  • SISMEMBER key member:判断一个元素是否存在于set集合中
  • SMEMBERS:获取set中的所有元素
  • SDIFF key1 key2:去key1和key2的差集
  • SINTER key1 key2:去key1和key2的交集
  • SUNION key1 key2:去key1和key2的并集

practise:

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

•张三的好友有:李四、王五、赵六

•李四的好友有:王五、麻子、二狗

利用Set的命令实现下列功能:

  1. 计算张三的好友有几人

  2. 计算张三和李四有哪些共同好友

  3. 查询哪些人是张三的好友却不是李四的好友

  4. 查询张三和李四的好友总共有哪些人

  5. 判断李四是否是张三的好友

  6. 判断张三是否是李四的好友

  7. 将李四从张三的好友列表中移除

# 创建set集合存储数据
SADD zs lisi wanwu zhaoliu
SADD ls wanwu mazi ergou

#计算张三的好友有几人
SCARD  zs

#计算张三和李四有哪些共同好友
SINTER zs ls

#查询哪些人是张三的好友却不是李四的好友
SDIFF zs ls

#查询张三和李四的好友总共有哪些人
SUNION zs ls

#判断李四是否是张三的好友
SISMEMBER ls zs

#判断张三是否是李四的好友
SISMEMBER za ls

#将李四从张三的好友列表中移除
SREM zs ls

七、SortedSet类型

简介

Redis的SortedSet是一个可排序的set集合,于Java中的TreeSet有些类型,但底层数据结构却差别较大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素进行排序,底层的实现是一个跳表(SkipList)加hash表。

SortedSet具备的特性:

  • 可排序
  • 元素不可重复
  • 查询速度快

因为SortedSet的可排序功能,经常被用来实现排行榜这样的功能

常用命令

  • ZADD key score member:添加或者修改一个或多个元素到SortedSet中
  • ZREM key member:删除SortedSet中的一个指定元素
  • ZSCORE key member:获取SortedSet中指定元素的score值
  • ZRANK key member:获取SortedSet中指定元素的排名
  • ZCARD key:获取SortedSet中元素个数
  • ZCOUNT key min max:统计元素的score只区间[min,max]的值的个数
  • ZINCRBY key increment member:让SortedSet中指定元素自增指定长度
  • ZRANGE key min max:按照score排序后,获取指定排名范围的元素
  • ZRANGEBYSCORE key min max:按照score排序后,获取score在指定范围的元素
  • ZDIFF、ZINTER、ZUNION:求差集、交集、并集

**注意:**所有的排名默认都是升序,如果要降序就在命令的Z后面添加REX即可

练习:

将班级的下列学生得分存入Redis的SortedSet中:

Jack 85, Lucy 89, Rose 82, Tom 95, Jerry 78, Amy 92, Miles 76

•并实现下列功能:

•删除Tom同学

•获取Amy同学的分数

•获取Rose同学的排名

•查询80分以下有几个学生

•给Amy同学加2分

•查出成绩前3名的同学

•查出成绩80分以下的所有同学

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

 删除Tom同学
ZREM scores Tom

#获取Amy同学的分数
ZSCORE scores Amy

#获取Rose同学的排名
ZRANK scores Rose

#查询80分以下有几个学生
ZCOUNT scoures 0 80

#给Amy同学加2分
ZINCRBY scores 2 Amy

#查出成绩前3名的同学
ZRANGE scores 0 2

#查出成绩80分以下的所有同学
ZRANGEBYSCORE scores 0 80

你可能感兴趣的:(Redis,redis,数据结构,数据库)