什么是NOSQL
NOSQL(not only sql)泛指非关系型数据库。
随着互联网web2.0网站的兴起,传统的关系型数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多问题。
而非关系型数据库则由于其本身特点得到了非常迅速的发展。
NOSQL的产生就是为了解决大规模数据集合多重数据种类带来的跳转,尤其是大数据应用难题。
NOSQL和关系型数据库的比较
优点
成本
NOSQL数据库部署简单,开源,不像oracle那样花费大量成本购买,相比关系型数据库价格便宜。
查询速度
NOSQL数据库使用缓存机制,将数据存储在缓存中,而关系型数据库将数据存储在硬盘中,自然查询速度远超关系型数据库。
存储数据格式
NOSQL可以存储key,value的形式、文档形式、图片形式等,支持多种数据类型,而关系型数据库只支持基础数据类型。
扩展性
关系型数据库有类似join这样的多表查询机制导致扩展很艰难。
而NOSQL因为是基于键值对的,数据之间没有耦合性,所以容易扩展。
缺点
维护的工具和资料有限
因为NOSQL属于新技术,不能和关系型数据库十几年的技术相提并论。
不提供对sql的支持
因为不支持sql这样的工业标椎,将会产生一定的学习和使用成本。
不提供关系型数据库对事物的处理
事务支持对于安全性能很高的数据访问要求,关系型数据库提供事务支持。
SQL和NOSQL
NOSQL和关系型数据库并非对立而是互补的关系
一般会将数据存储在关系型数据库中,在NOSQL数据库中备份存储。
Redis
介绍
Redis是一款高性能的NOSQL系列的非关系型数据库。
官网:https://redis.io
中文网:http://www.redis.net.cn/
解压直接可以使用:
○ redis.windows.conf:配置文件
○ redis-cli.exe:redis的客户端
○ redis-server.exe:redis服务器端
Redis应用场景
● 缓存(数据查询、短连接、新闻内容、商品内容等等)
● 聊天室的在线好友列表
● 任务队列。(秒杀、抢购、12306等等)
● 应用排行榜
● 网站访问统计
● 数据过期处理(可以精确到毫秒
● 分布式集群架构中的session分离
使用redis缓存一些不经常发生变化的数据。
数据库的数据一旦发生改变,则需要更新缓存。
数据库的表执行 增删改的相关操作,需要将redis缓存数据情况,再次存入
在service对应的增删改方法中,将redis数据删除。
Redis数据结构
官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s ,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
● 字符串类型 string
● 哈希类型 hash : map格式
● 列表类型 list: linkedlist格式(LinkedList集合底层是双链表, 首位操作快),支持元素重复
● 集合类型 set: 不允许元素重复
● 有序集合类型 sortedset: 不允许重复元素,且元素有顺序
Redis命令操作
字符串类型 String
存储:set key value
获取:get key
删除:del key
哈希类型 hash
存储 : hset set filed value
获取: hget key field 获取指定的fiele对应的值
hgetall key 获取所有的filed和value
删除: hdel key filed
列表类型 list 元素可以重复
添加: lpush key value 将元素加入列表左表
rpush key value 将元素加入列表右边
获取: lrange key strat end 范围获取
lrange mylist 0 -1 其中0代表第一个,-1代表最后一个
删除: lpop key: 删除列表最左边的元素,并返回被删除元素
rpop key: 删除列表最右边的元素,并返回被删除元素
集合类型 set 元素不可重复,元素无序
存储: sadd key value
获取: sembers key 获取set集合中所有元素
删除:srem key value 删除set集合中某个元素
有序集合类型 sortedset 不允许重复,有顺序,每个元素关联一个double类型的分数
Redis正是通过分数为集合中的成员从小到大进行排序
存储 :zadd key score value
获取: zrange key start end [withscores]
删除: zrem key value
通用命令
keys * : 查询所有的键
type key :获取键对应的value的类型
del key : 删除指定的key value
数据过期时间设置
expire key time(秒) :最常用
setex key time(秒) value :字符串独有
ttl key # 查看数据还有多久过期
//可以使用setex()方法存储指定过期时间的key value
//应用:激活码,验证码
jedis.setex("username",5,"lala");//5秒
System.out.println(jedis.get("username"));
Thread.sleep(5000);
System.out.println(jedis.get("username"));// null
Redis持久化
由于Redis数据是存在内存中的,当重启Redis服务器或重启电脑,数据会丢失,因此需要将Redis内存中的数据持久化存储到硬盘文件中。
Redis有两种持久化机制:
RDB(默认机制)
在一定的间隔时间中,检测key是否变化,然后持久化数据。dump.rdb
redis.windwos.conf文件
#after 900 sec (15 min) if at least 1 key changed
save 900 1
#after 300 sec (5 min) if at least 10 keys changed
save 300 10
#after 60 sec if at least 10000 keys changed
save 60 10000
AOF
日志记录的方式,可以记录每一条命令的操作。
编辑redis.windwos.conf文件
appendonly no(关闭aof) --> appendonly yes (开启aof)
#appendfsync always : 每一次操作都进行持久化
appendfsync everysec : 每隔一秒进行一次持久化
#appendfsync no : 不进行持久化
如何让持久化生效
进行了如上的编辑后(使用默认的方法,可以不编辑),重启Redis服务器
和直接打开不一样,是在redis目录下运行cmd,输入redis-server.exe redis.windows.conf
然后打开客户端,数据就持久化保存了。
Java客户端(Jedis)
介绍
Jedis是一款java操作redis数据库的工具。
使用步骤
下载jar/pom
获取连接
Jedis jedis = new Jedis(“localhost”,6379);
操作
Jedis操作各种Redis中的数据结构和在服务端操作方法一致。
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.List;
import java.util.Map;
import java.util.Set;
publ