Redis的简介与数据结构
什么是NoSQL?
NoSQL就是Not only SQL
Redis是什么?
定义
Redis诞⽣于2009年全称是Remote Dictionary Server,远程词典服务器,是⼀个基于内存的键值型NoSQL数据库。
特征
- 键值(key-value)型,value⽀持多种不同数据结构,功能丰富
- 单线程,每个命令具备原⼦性
- 低延迟,速度快(基于内存、IO多路复⽤、良好的编码)。
- 支持数据持久化
- 支持主从集群、分片集群
- 支持多语言客户端
Redis的数据结构
Redis是⼀个key-value的数据库,key⼀般是String类型,不过value的类型多种多样
数据类型
大致是5大基本类型,3大特殊类型。
Redis为了方便我们学习,将操作不同数据类型的命令也做了分组
例如:我们可以筛选只看关于String类型的命令
我们也可以在命令窗口查看命令
help @String
通用命令
指的是是部分数据类型的,都可以使用的指令,常见的有 :
- keys:查看符合模板的所有key,不建议在生产环境设备中使用(模糊匹配速度慢,并且Redis是单线程,可以导致其长时间的阻塞)
- del:删除一个指定的key
- exists:判断key是否存在
- expire:给一个key设置有效期,有效期到时,该key会被自动删除
- ttl:查看一个key剩余的有效期
在redis中我们可以先预存几个数据
KEYS
使用keys,有模糊匹配的功能,“ * ”代表0个 or 多个字符;“ ? ”代表一个字符
keys name*
keys name?
显然使用 “ ? ” 匹配,没有匹配到name33
查询所有键
keys *
DEL
代表删除key值为name1的值
del name1
EXISTS
判断key是否存在
EXPIRE 与 TTL
设置name33的删除时间为10s,ttl表示查看name33的过期时间
注意:TTL值为-1表示永久有效,值为-2代表该键不存在,为其他正数代表过期的秒数。
String类型
简介
String类型,也就是字符串类型,是Redis中最简单的存储类型。
其value是字符串,根据格式不同大致分成3类:
- string:普通字符串
- int:整数类型,可以自增、自减
- float:浮点类型,可以自增、自减
不过不管是什么格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512MB。
常用命令
批量存取
自增(减) 、指定步长自增(减)
自减的话将数值改为负数即可!
使用incrby命令指定每次自增的步长为 5
setnx:如果不存在这个key就新增,否则不做任何操作!!!
setex:相当于 set 与 expire 组合命令。在赋值的时候,设置有效期。
Key的结构
问:在Redis中没有MySQL中的表的概念,那么如果有一个用户ID和一个商品ID,它们都叫ID怎么区分、处理它们???
我们可以打开图形界面客户端,显然,我们使用 “ : ” 隔开时redis自然而然就生成了层级结构
Hash类型
简介
Hash类型,也叫散列,其value的是一个无序字典,类似于Java中的HashMap结构。
String结构是将对象序列化为JSON字符串存储,当我们要修改某一个对象的某个字段时就会很不方便。
需要整个删除,然后整个插入。
Hash结构可以将对象中的每个字段独立存储,可以针对
常用命令
hset 与 hget
我们可以看看它的图形化界面:
hmset 与 hmget
hmset Harmony:user:4 name lcx age 18 sex man
hgetall
获取所有的key-value
hkeys 与 hvals
获取所有key,获取所有value
hincrby 与 hsetnx
hincrby:自增长,定义步长为5
hsetnx:添加之前加判断,如果添加的key的值不存在就添加,否则添加失败
注:在Harmony:user:3中没有sex所以可以添加成功,Harmony:user:4中有sex所以添加失败
List类型
简介
Redis中的List与Java中的LinkedList类似。可以看作一个双向链表结构,既可以支持正向检索,也可以支持反向检索。
特征与LinkedList类似:
- 有序
- 元素可以重复
- 插入和删除快
- 查询速度一般
常用命令
lpush 与 rpush
先从左边依次插入1 2 3,再重右边依次插入1 2 3
lpush users 1 2 3
rpush users 1 2 3
依照双向链表的特性,应该不难理解!
lpop 与 rpop
依照上面的图来看,从左数,还是从右数第一个都是3,故此操作将会删除最左、最右的第一个元素——‘3’。
lrange
返回下标为 0 ~ 3 的所有元素
注:请不要想当然,没有 rrange
blpop 与 brpop
在这里b代表阻塞的意思,即如果没有要删除的数据不会直接返回nil,而是会在设定的时间内阻塞一下,如果在该时间段内有了待删除的元素,则就直接删除;反之当时间片到了,就返回nil。
例如:
我们使用 blpop 命令删除users2,但是我们之前没有创建该List!由于使用了 "b" ,所以该命令将会阻塞100s。
我们新开一个客户端,创建一个List名为user2.
此时我们再度查看之前的,显然blpop运行结束!并打印出了阻塞时间!
Set类型
简介
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能
常用命令
单个集合的基本操作如下所示:
使用sadd命令创建集合,并插入元素a b c ;使用smembers命令查看该集合中的所有元素 ;使用srem删除集合中的指定元素a ; 使用scard查看集合中元素的个数 ; 使用sismember查看集合是否存在该元素。
多个集合的基本操作如下所示:
首先我们格式化一下set01与set02集合
set01:a b c
set02:b c d
使用inter查看交集;使用sdiff 查看差集(set01有,set02没有);使用sunion查看并集
SortedSet类型
简介
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。
- 可排序
- 元素不重复
- 查询快
由于SortedSet的特性,所以我们常常使用它来做排行版这样的需求。
常用命令
zadd
zadd students 85 Jack 90 Tom 100 allop 55 mzc 90 lcx 45 wsd
可以批量添加数据,SortedSet内部会根据我们提供的score的值大小进行排序,下图是我们图形界面的展示结果。
zrem
例如:删除 Tom
zrem students Tom
zscore
例如:获取Jack的score值
zrank(正序) 与 zrevrank(倒序)
例如:我们对wsd进行排名
查询结果如下,显然该序号是从0开始计数的,查询结果如下所示:
zcard 与 zcount
使用zcard统计students键的值的个数
使用zcount统计students键的值在 80 ~ 100 之间的个数。
zincrby
例如:给Jack加10分
zincrby students 10 Jack
zrange
例如:查询sorce前三的同学
我们可以得到分数为前三的人
zrangebyscore
例如:查询90分以上的同学