此篇仅为个人初期学习笔记,如有错误请xdm指正
在了解了Redis之后,必然会去探索如何使用它,每种语言都会有自己的语法规范,下面要我们一起学习Redis的数据结构与通用语法及其指令
目录
一、Redis数据结构介绍
Redis是key-value数据库,键一般是String类型,但是值可以是多种类型
二、Redis通用指令
通用指令是全部数据类型都可以使用的指令,常见的有:
- KEYS:查看符合模板的所有键(效率太低,不建议使用)
- DEL:删除一个指定键的键值对
- EXISTS:判断key是否存在
- EXPIRE:给一个键值对设置有效期,有效期到期该键值对就会失效
- TTL:查看一个键的剩余有效期
通过**help [command]**可以查看一个命令的具体用法,举例如下:
三、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对象然后存储,需要修改某个字段时,非常麻烦
Hash类型完美解决了这个问题,它将对象每个属性拆分存储,可以针对特定字段进行CRUD
常用命令
- 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,而是等待指定时间
应用
分析:以下问题只需要抓住一个关键点,那就是数据进去和出去的方向是否一致,因为只有俩个方向
- 如何利用list结构模拟一个栈?
- 入口和出口相同
- 有俩种实现方式:左添加左获取;有添加有获取
- 如何利用list结构模拟一个队列?
- 入口和出口不同
- 有俩种实现方式:左添加右获取;右添加左获取。
- 如何利用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的命令实现下列功能:
计算张三的好友有几人
计算张三和李四有哪些共同好友
查询哪些人是张三的好友却不是李四的好友
查询张三和李四的好友总共有哪些人
判断李四是否是张三的好友
判断张三是否是李四的好友
将李四从张三的好友列表中移除
# 创建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