什么是NoSQL?

Redis是什么?

定义

特征

Redis的数据结构

数据类型

通用命令

KEYS

DEL

EXISTS

EXPIRE 与 TTL

String类型

Key的结构

Hash类型

List类型

Set类型

SortedSet类型 


什么是NoSQL?

NoSQL就是Not only SQL

redisTemplate get key 模糊 redis key模糊匹配_内存

Redis是什么?

定义

Redis诞⽣于2009年全称是Remote Dictionary Server,远程词典服务器,是⼀个基于内存的键值型NoSQL数据库。

特征

  • 键值(key-value)型,value⽀持多种不同数据结构,功能丰富
  • 单线程,每个命令具备原⼦性
  • 低延迟,速度快(基于内存、IO多路复⽤、良好的编码)。
  • 支持数据持久化
  • 支持主从集群、分片集群
  • 支持多语言客户端

Redis的数据结构

Redis是⼀个key-value的数据库,key⼀般是String类型,不过value的类型多种多样

数据类型

大致是5大基本类型,3大特殊类型。

redisTemplate get key 模糊 redis key模糊匹配_java_02

Redis为了方便我们学习,将操作不同数据类型的命令也做了分组

Redis官网命令手册

例如:我们可以筛选只看关于String类型的命令

redisTemplate get key 模糊 redis key模糊匹配_数据库_03

我们也可以在命令窗口查看命令

help @String

redisTemplate get key 模糊 redis key模糊匹配_redis_04

通用命令

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

  • keys:查看符合模板的所有key,不建议在生产环境设备中使用(模糊匹配速度慢,并且Redis是单线程,可以导致其长时间的阻塞
  • del:删除一个指定的key
  • exists:判断key是否存在
  • expire:给一个key设置有效期,有效期到时,该key会被自动删除
  • ttl:查看一个key剩余的有效期

在redis中我们可以先预存几个数据

redisTemplate get key 模糊 redis key模糊匹配_nosql_05

KEYS

使用keys,有模糊匹配的功能,“ * ”代表0个 or 多个字符;“ ? ”代表一个字符

keys name*

redisTemplate get key 模糊 redis key模糊匹配_nosql_06

keys name?

显然使用 “ ? ” 匹配,没有匹配到name33 

 

redisTemplate get key 模糊 redis key模糊匹配_nosql_07

查询所有键 

keys *

DEL

代表删除key值为name1的值

del name1

EXISTS

判断key是否存在

EXPIRE 与 TTL

redisTemplate get key 模糊 redis key模糊匹配_内存_08

设置name33的删除时间为10s,ttl表示查看name33的过期时间

注意:TTL值为-1表示永久有效,值为-2代表该键不存在,为其他正数代表过期的秒数。

String类型

简介

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

其value是字符串,根据格式不同大致分成3类:

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

不过不管是什么格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512MB。

redisTemplate get key 模糊 redis key模糊匹配_内存_09

常用命令

redisTemplate get key 模糊 redis key模糊匹配_redis_10

批量存取 

redisTemplate get key 模糊 redis key模糊匹配_数据库_11

自增(减) 、指定步长自增(减)

自减的话将数值改为负数即可! 

redisTemplate get key 模糊 redis key模糊匹配_nosql_12

使用incrby命令指定每次自增的步长为

redisTemplate get key 模糊 redis key模糊匹配_java_13

setnx:如果不存在这个key就新增,否则不做任何操作!!!

redisTemplate get key 模糊 redis key模糊匹配_数据库_14

setex:相当于 set 与 expire 组合命令。在赋值的时候,设置有效期。

redisTemplate get key 模糊 redis key模糊匹配_nosql_15

Key的结构

在Redis中没有MySQL中的表的概念,那么如果有一个用户ID和一个商品ID,它们都叫ID怎么区分、处理它们???

redisTemplate get key 模糊 redis key模糊匹配_nosql_16

我们可以打开图形界面客户端,显然,我们使用 “ : ” 隔开时redis自然而然就生成了层级结构

redisTemplate get key 模糊 redis key模糊匹配_数据库_17

Hash类型

简介

Hash类型,也叫散列,其value的是一个无序字典,类似于Java中的HashMap结构。

String结构是将对象序列化为JSON字符串存储,当我们要修改某一个对象的某个字段时就会很不方便。

需要整个删除,然后整个插入。

redisTemplate get key 模糊 redis key模糊匹配_redis_18

Hash结构可以将对象中的每个字段独立存储,可以针对 

redisTemplate get key 模糊 redis key模糊匹配_java_19

常用命令

redisTemplate get key 模糊 redis key模糊匹配_nosql_20

hset 与 hget 

redisTemplate get key 模糊 redis key模糊匹配_java_21

我们可以看看它的图形化界面:

redisTemplate get key 模糊 redis key模糊匹配_java_22

hmset 与 hmget

hmset Harmony:user:4 name lcx age 18 sex man

redisTemplate get key 模糊 redis key模糊匹配_java_23

redisTemplate get key 模糊 redis key模糊匹配_内存_24

hgetall

获取所有的key-value

redisTemplate get key 模糊 redis key模糊匹配_数据库_25

hkeys 与 hvals

获取所有key,获取所有value

redisTemplate get key 模糊 redis key模糊匹配_java_26

hincrby 与  hsetnx

hincrby:自增长,定义步长为5

redisTemplate get key 模糊 redis key模糊匹配_java_27

hsetnx:添加之前加判断,如果添加的key的值不存在就添加,否则添加失败

注:在Harmony:user:3中没有sex所以可以添加成功,Harmony:user:4中有sex所以添加失败

redisTemplate get key 模糊 redis key模糊匹配_redis_28

List类型

简介

Redis中的List与Java中的LinkedList类似。可以看作一个双向链表结构,既可以支持正向检索,也可以支持反向检索

特征与LinkedList类似:

  • 有序
  • 元素可以重复
  • 插入和删除快
  • 查询速度一般

常用命令

redisTemplate get key 模糊 redis key模糊匹配_java_29

lpush 与 rpush 

先从左边依次插入1 2 3,再重右边依次插入1 2 3

lpush users 1 2 3
rpush users 1 2 3

依照双向链表的特性,应该不难理解! 

redisTemplate get key 模糊 redis key模糊匹配_数据库_30

lpop 与 rpop 

redisTemplate get key 模糊 redis key模糊匹配_数据库_31

依照上面的图来看,从左数,还是从右数第一个都是3,故此操作将会删除最左、最右的第一个元素——‘3’。

redisTemplate get key 模糊 redis key模糊匹配_java_32

lrange

redisTemplate get key 模糊 redis key模糊匹配_内存_33

返回下标为 0 ~ 3 的所有元素

注:请不要想当然,没有 rrange

blpop 与 brpop

在这里b代表阻塞的意思,即如果没有要删除的数据不会直接返回nil,而是会在设定的时间内阻塞一下,如果在该时间段内有了待删除的元素,则就直接删除;反之当时间片到了,就返回nil。

例如:

 我们使用 blpop 命令删除users2,但是我们之前没有创建该List!由于使用了 "b" ,所以该命令将会阻塞100s。

redisTemplate get key 模糊 redis key模糊匹配_nosql_34

我们新开一个客户端,创建一个List名为user2.

redisTemplate get key 模糊 redis key模糊匹配_内存_35

此时我们再度查看之前的,显然blpop运行结束!并打印出了阻塞时间

redisTemplate get key 模糊 redis key模糊匹配_内存_36

Set类型

简介

Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征

  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集、并集、差集等功能

常用命令

redisTemplate get key 模糊 redis key模糊匹配_nosql_37

单个集合的基本操作如下所示:

 

redisTemplate get key 模糊 redis key模糊匹配_redis_38

使用sadd命令创建集合,并插入元素a b c ;使用smembers命令查看该集合中的所有元素 ;使用srem删除集合中的指定元素a ; 使用scard查看集合中元素的个数 ; 使用sismember查看集合是否存在该元素。

多个集合的基本操作如下所示:

首先我们格式化一下set01与set02集合

set01:a b c

set02:b c d

redisTemplate get key 模糊 redis key模糊匹配_nosql_39

使用inter查看交集;使用sdiff 查看差集(set01有,set02没有);使用sunion查看并集 

redisTemplate get key 模糊 redis key模糊匹配_java_40

SortedSet类型 

简介

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

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

由于SortedSet的特性,所以我们常常使用它来做排行版这样的需求。

常用命令

redisTemplate get key 模糊 redis key模糊匹配_nosql_41

zadd 

zadd students 85 Jack 90 Tom 100 allop 55 mzc 90 lcx 45 wsd

可以批量添加数据,SortedSet内部会根据我们提供的score的值大小进行排序,下图是我们图形界面的展示结果。

redisTemplate get key 模糊 redis key模糊匹配_内存_42

 

zrem

例如:删除 Tom

zrem students Tom

zscore

例如:获取Jack的score值

redisTemplate get key 模糊 redis key模糊匹配_java_43

zrank(正序) 与 zrevrank(倒序) 

例如:我们对wsd进行排名

redisTemplate get key 模糊 redis key模糊匹配_java_44

 

查询结果如下,显然该序号是从0开始计数的,查询结果如下所示:

redisTemplate get key 模糊 redis key模糊匹配_nosql_45

zcard 与 zcount

redisTemplate get key 模糊 redis key模糊匹配_redis_46

 

使用zcard统计students键的值的个数 

使用zcount统计students键的值在 80 ~ 100 之间的个数。

zincrby

例如:给Jack加10分

zincrby students 10 Jack

zrange

例如:查询sorce前三的同学

redisTemplate get key 模糊 redis key模糊匹配_redis_47

我们可以得到分数为前三的人 

redisTemplate get key 模糊 redis key模糊匹配_java_48

 

zrangebyscore 

例如:查询90分以上的同学

redisTemplate get key 模糊 redis key模糊匹配_redis_49