概念
NoSql介绍
NoSql,指非关系型的数据库, NoSQL数据库主要包含四大分类 :
键值(Key-Value)存储数据库: 这一类数据库主要会使用到一个哈希表,这> 个表中有一个特定的键和一个指针指向特定的数据。如Redis, memcached。
列存储数据库: 这部分数据库通常是用来应对分布式存储的海量数据。键仍> 然存在,但是它们的特点是指向了多个列。如 HBase。
文档型数据库: 该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:Lotus Domino, MongoDb。
图形(Graph)数据库: 图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。如:Neo4J, InfoGrid, Infinite Graph。
NOSQL数据的特点:
- 数据模型比较简单;
- 需要灵活性更强的IT系统;
- 对数据库性能要求较高;
- 不需要高度的数据一致性;
- 对于给定key,比较容易映射复杂值的环境。
Redis介绍
Redis数据Nosql数据库的一种,是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求(非关系型的、分布式的、开源的。水平可扩展的)
优点:
- 对数据高并发读写
- 对海量数据的高效率存储和访问
- 对数据的可扩展性和高可用性
缺点:
- redis (ACID处理非常简单)
- 无法做到太复杂的关系数据库模型
安装使用
Server
官网地址:https://redis.io/download
下载后,解压缩,Linux下运行redis-server,windows直接运行redis-server.exe即可。
修改配置文件redis.windows.conf(linux为redis.conf)
绑定IP:bind [ip0] [ip1]
配置密码:requirepass ****
Client
命令行下客户端连接到服务器:redis-cli -h [xxx.xx.x.xx] -p 6379 -a [password]。
可视化工具:DesktopManager
数据类型
Redis数据类型包含:(string)字符串,(Hash)哈希,(list)链表,(set)集合,(zset)有序集合。这些数据集合都支持push/pop、add/remove及取交集和并集以及更丰富的操作,redis支持各种不同的方式排序,为了保证效率,数据都是缓存在内存中,它也可以周期性的把更新的数据写入磁盘或者把修改操作写入追加到文件记。
数据类型 | column2 |
---|---|
String | 包含很多种类型的特殊类型,并且是二进制安全的。比如序列化的对象进行存储,比如 一张图片进行二进制存储,比如一个简单的字符串,数值等等。 |
Hash | 它是String类型的field和value的映射表,或者说一个String集合。它的特别适合存储对象, 相比较而言,将一个对象类型存储在Hash类型里要比存储在String类型里占用更少的内存 空间,并方便存取整个对象。 |
List | list是一个链表结构的集合,其主要功能有push、pop、获取元素等。更详细的说,List类型 是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素, list的设计非常简单精巧,即可以做为栈,又可以作为队列。满足绝大多数需求。 |
Set | set集合是string类型的无序集合 ,set是通过hashtable实现的,对集合我们可以取交集、 并集、差集。 |
ZSet | zSet是string类型的有序集合结构,有序集合中元素的特点: |
有序、无重复、可进行集合间操作。
特性
事务
redis的事物非常简单,使用方法如下:
首先是使用multi方法打开事物 然后进行设置,这时设置的数据都会放入队列里进行保存 最后使用exec执行,由于name是字符类型,执行自增方法会导致失败,所以运行结果是失败的,但是age的值并没有回滚。
redis的事务不能保证同时成功或失败进行提交或回滚,所以redis的事务目前还是比较简单的,是非原子性的。这里我们可以使用Lua脚本完善redis的事务。
发布订阅
redis提供了简单的发布订阅功能:
1、订阅监听
subscribe [频道1][频道2][频道N]
2、发布消息广播
publish [频道][发布消息内容]
使用示例:
启动多个客户端连接A、B、C,加入设置客户端A为订阅模式,订阅通道可自定义;
假如是c1;
那么在客户端B、C连接中,发布c1通道的消息是,客户端A就可立即接受到消息。
⭐ Tip:Redis的发布订阅适合用在数据量较少的场景,数据量较大尽量使用专业的消息中间件。
数据持久化
Redis的数据持久化有两种方案:
方案 | 说明 |
---|---|
rdb方式 | 采用配置定时同步的方式,可以在redis.conf中配置 snapshotting设置: save 900 1 #900秒内如果超过1个key被修改,则发起快照保存 save 300 10 #300秒内如果超过10个key被修改,则发起快照保存 save60 10000 #60秒内如果超过10000个key被修改,则发起快照保存。 |
aof方式 | appendonly yes #启动aof持久化方式,3种: #appendfsync always #收到写命令就立即写入到磁盘,效率最慢,但是保证完整的持久化 #appendfsync everysec #每秒钟写入磁盘一次,在性能和持久化方面做了折中 #appendssync no #完全依赖os性能最好,持久化完整性没保证 |
⭐Tip:工作中可以采用aof方式的 第1、2种做选择。
Java API
Java客户端操作Redis,比较主流的包括Jedis和lettuce。更多客户端可见: https://redis.io/clients#java
SpringData
支持Jedis和lettuce两种,默认情况下,SpringBoot1.x使用的是Jedis连接,SpringBoot2.x使用的则是SpringBoot1来连接。
应用场景
以下例举一些常用使用场景,包括但不限于:
- 缓存服务,缓存热点数据,一般采用String来存储,K/V。
- 共享数据,例如集群部署情况,可以使用Redis来做Session值的公共存储。
- 计数器,Redis是基于单线程通信,可以保证计数的并发问题。也适用于分布式部署的程序。
- 分布式锁,利用setnx命令的特性(只有在Key不存在时,才能set成功)。
- 消息队列,使用List(链表)存储消息,实现简单的消息队列。
- 发布订阅,使用publish、subscribe。
- 排行榜、最新列表等业务场景,基于List、ZSet特性等等。
作者: Zealon
崇尚简单,一切简单自然的事物都是美好的。