简介
什么是NoSQL
NoSQL(NOSQL=not only SQL),是一项全新的数据库理念,泛指非关系型数据库.
NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战.
NoSQL和关系型数据库比较
- 优点:
1.成本:NoSQL数据库简单易部署,基本都是开源软件,不需要像使用oracle一样花费大量成本购买使用.
2.查询速度:NoSQL数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,NoSQL查询速度快于关系型数据库.
3.存储格式:NoSQL的存储格式是key value形
,文档形式
,图片形式
等等,所以可以存储基础类型以及对象或者是集合等各种形式,而数据库则只支持基础类型.
4.扩展性:关系型数据库有类似join这样的的多表查询机制的限制导致扩展很困难. - 缺点:
1.维护的工具和资料有限
2.没有统一标准,学习和使用成本较高
3.不提供关系型数据库对事物的处理
关系型数据库与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库,让NoSQL数据库对关系型数据库的不足进行弥补.一般会将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据.
主流NoSQL产品
- 键值(Key-Value)存储数据库
相关产品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型应用: 内容缓存,主要用于处理大量数据的高访问负载。
数据模型: 一系列键值对
优势: 快速查询
劣势: 存储的数据缺少结构化 - 列存储数据库
相关产品:Cassandra, HBase, Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限 - 文档型数据库
相关产品:CouchDB、MongoDB
典型应用:Web应用(与Key-Value类似,Value是结构化的)
数据模型: 一系列键值对
优势:数据结构要求不严格
劣势: 查询性能不高,而且缺乏统一的查询语法 - 图形(Graph)数据库
相关数据库:Neo4J、InfoGrid、Infinite Graph
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法。
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
什么是Redis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s ,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
1) 字符串类型 string
2) 哈希类型 hash
3) 列表类型 list
4) 集合类型 set
5) 有序集合类型 sortedset
Redis应用场景
- 缓存(数据查询、短连接、新闻内容、商品内容等等
- 聊天室的在线好友列表)
- 任务队列(秒杀、抢购、12306等等)
- 应用排行榜
- 网站访问统计
- 数据过期处理(可以精确到毫秒)
- 分布式集群架构中的session分离
Redis操作
下载安装
1. 官网:[redis.io](https://redis.io)
2. 中文网:[redis.net.cn](http://www.redis.net.cn/)
3. 解压安装
现版本(Redis5.0)只支持Linux系统
安装步骤:\$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
\$ tar xzf redis-5.0.5.tar.gz
\$ cd redis-5.0.5
\$ make
启动Redis
\$ src/redis-server
启动Redis客户端
\$ src/redis-cli
命令操作
Redis的数据结构
redis存储的是:key,value格式的数据,其中key都是字符串,value有5种不同的数据结构, value的数据结构:
1) 字符串类型 string
2) 哈希类型 hash : map格式
3) 列表类型 list : linkedlist格式。支持重复元素
4) 集合类型 set : 不允许重复元素
5) 有序集合类型 sortedset:不允许重复元素,且元素有顺序
字符串类型string
存储
1 | set key value |
获取
1 | get key |
删除
1 | del key |
哈希类型hash
存储
1 | hset key field value |
获取
1 | hget key field |
删除
1 | hdel key field |
列表类型
可以添加一个元素到列表的头部(左边)或者尾部(右边)
添加
1 | lpush key value |
获取
1 | lrange key start end |
删除
1 | lpop key |
集合类型set
set不允许重复元素
存储
1 | sadd key value |
获取
1 | smembers key |
删除
1 | srem key value |
sortedset
不允许重复元素,且元素有顺序.每个元素都会关联一个double类型的分数.redis正是通过分数来为集合中的成员进行从小到大的排序.
存储
1 | zadd key score value |
获取
1 | zrange start end [withscores] |
删除
1 | zrem key value |
通用命令
1 | keys * : 查询所有的键 |
持久化
redis是一个内存数据库,当redis服务器重启或者电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中.
Redis持久化机制
- RDB:默认方式,不需要进行配置,默认就使用这种机制
- 在一定的间隔时间中,检测key的变化情况,然后持久化数据
1.编辑redis.windwos.conf文件
1 | # after 900 sec (15 min) if at least 1 key changed |
2.重新启动redis服务器,并指定配置文件名称
src/redis-server redis.conf
AOF:日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
1.编辑redis.windwos.conf文件
appendonly no(关闭aof) –> appendonly yes (开启aof)
appendfsync always 每一次操作都进行持久化
appendfsync everysec 每隔一秒进行一次持久化
appendfsync no 不进行持久化2.重新启动redis服务器,并指定配置文件名称
src/redis-server redis.conf
Java客户端 Jedis
下载jar包 jedis.jar(目前版本3.2.0)
调用方法
1 | import redis.clients.jedis.Jedis; |
java中redis的方法和客户端操作基本,就不过多举例,如有所需,自行查找.
jedis连接池
使用maven进行包管理
添加以下包:
1 | <dependency> |
代码:
1 | public class Demo3 { |
应用案例
- 提供index.html页面,页面中有一个省份 下拉列表
- 当 页面加载完成后 发送ajax请求,加载所有省份
应用方法:
将数据库省份读取出来,将其json化后添加至redis缓存,下次访问时直接从redis中读取.