1.首先Redis是什么?
redis是一个基于内存的键值对的一种NoSQl数据库,是远程词典服务器,他的存储方式是通过key 来获取对应的value值,通常如果你要从一个地方去拿取数据,是不会写一大堆的键值对,是通过把这一类的数据类型写成对应的json数据格式存储到value里面。
Redis的特征
首先是键值型,value支持多种不同的数据结构,约束性不强
redis 的一些命令都是由单线程执行,在网络传输的情况下是多线程
速度非常快,因为基于内存 ,所以他的性能非常高
内存持久化,因为电脑内存在重启后就会消失,所以会定期的去存入磁盘当中
支持主从集群, 如果主数据出现问题,那么从数据就可以提供
多语言都支持
Redis的数据类型
String
Hash
List
Set
SortedSet
以上几种是基本数据类型
GEO
BitMap
HyperLog
这几种属于特殊类型
Redis为了方便我们学习,把操作不同的数据类型的命令做了分组,在官方网站( Commands | Docs ) 可以查看不同的命令
Redis通用命令
KEYS: 查看符合模版的所有key (不适合在生产设备上使用)
DEL:一个指定的key
EXISTS:判断key是否存在
EXPIRE:给一个key设置有效期,有效期到期时该key会被自动删除
TTL:查看一个KEY的剩余有效期
tips: 通过help[command] 可以查看一个命令的具体用法
String类型
字符串类型,是最简单的存储类型
虽然value也是字符串,但是可以根据格式不同,分为string(普通字符串),int(整数),float(浮点类型),他们的底层原理都是字符数组的形式存储
String类型的常见命令
image
image
1071×555 87.9 KB
Hash类型
Hash类型的value就是一个无序字典,类似java 中的HashMap
相比于String类型的机构,如果说你想对把java对象序列化的数据进行修改是非常麻烦的,只能重新更新一下,但是Hash结构可以将每个字段单独存储,可以对每一个字段进行修改。
Hash类型的常见命令
HSET key field value : 添加或者修改hash类型key的field的值
HGET key field : 获取一个hash类型key的field的值
HMSET : 批量添加多个hash类型key 的field的值
HMGET: 批量获取多个hash类型key的field的值
HGETALL:获取一个hash类型的key中的所有field和vlaue
HKEYS: 获取一个hash类型的key中的所有field
HVALS:获取一个hash类型的key中的所有value
HINCRBY:让一个hash类型key的字段值自增并指定步长
HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
List类型
这里的List类型和java的LInkedList类似,也算是一个双向链表的结构,支持正反向检索,他的特性也跟Java的LinkedList类似
通常存储的是有序的数据。
常见命令
LPUSH key element…:向列表左侧插入一个或多个元素
LPOP key : 移除并返回列表左侧的第一个元素,没有则返回nil
RPUSH key element … : 向列表右侧插入一个或多个元素 RPOP key :移除并返回列表右侧的第一个元素
LRANGE key star end : 返回一段角标范围内的所有元素
BLPOP和BRPOP : 与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
Set类型
他的结构也是跟Java的HashSet类似,可以看做是一个value为空的HashMap,因为他的底层也是一个哈希表,所以是具备类似的特征
特征: 无序 元素不可重复 查找速度快 支持交集并集差集
常见命令:
SADD key member …:向set中添加一个或多个元素
SREM key member … : 移除set中的指定元素
SCARD key : 返回set中元素的个数
SISMEMBER key member: 判断一个元素是否存在与set中
SEMEBERS: 获取set中的所有元素
SINTER key1 key2 …: 求key1 与key2的交集
SDIFF key1 key2 …: 求key1与key2的差集
SUNION key1 key2 …: 求key1 和 key2 的 并集
Key的层级格式
redis是没有表的概念的,如果说有2个相同的id,那怎么区分?
Redis的key是允许多个单词形成一个层级结构,用:隔开
如果value存储的是一个java对象(实体类),那么我们可以用json序列化java对象,进行存储
2.NoSQL是什么?
NoSQL 就是非关系的数据库, 和平常了解的SQL(关系型数据库) 是有天壤之别
(1)NoSQL和SQL的区别
在结构上面
NoSQL 是非结构化的,也就是说他不像SQL一样有一定的要求,SQL可以对字段进行约束,如果擅自对一个字段修改,可能会跟很多的表有关联,会带来非常严重的后果。
NoSQL也不是说一点约束没有,他也有几种数据存储的类型,比如说到的键值对的类型(key value),还有文档类型,把数据都封装成一条条的json类型,类似SQL中的一行数据(包含多个字段)但是没有SQL的约束那么强,还有Graph的节点类型,这种类型相对于不常用
在关联性方面
NoSQL是非关联性的,跟SQL相比,SQL是可以通过外键和其他的约束来把表与表之前的关系联系起来,NoSQL就并没有这种关联性,一般都是json的嵌套方式进行(因为并没有表)
SQL查询
他们之前也是很大的差别,比如SQL在查询数据的时候通常是有一套固定的语法这样都能使用相同的语句进行查询,相当于语法统一,但是NoSQL的语法相当于不固定,每个都有自己的一套语法,
事务方面
在SQL中,为了保持数据的一致性,通常会存在事务,他们必须满足(ACID),但是在NoSQL中,通常是没有事务的特性,就算有,那也很难做到数据的一致性
存储方式
SQL使用的是磁盘的存储方式,为了数据的安全性, 但是NoSQL使用的是内存的存储方式,也就是说电脑重启就数据就不会再有,但是他的查询性能非常的高,不同环境下即可使用不同的方式
Redis的Java客户端
jedis: 用redis的命令作为方法的名称,上手快,实用,但是线程是不安全的,在多线程并发的情况下要给每个线程搭配线程池使用
lettuce: 底层是基于Netty实现,支持同步异步,线程的是非常安全的,也支持Redis的哨兵模式
Redisson: 是基于Redis实现的一个数据集合,包含了很多强大的功能,在需要使用这些功能的需求下适用