**非关系型数据库_Redis [web基础day22] *

版权声明:文章为作者自己原创文章,转载请注明出处。 https://blog.csdn.net/qq_37128049/article/details/85273133

昨日回顾:

* ajax:
	1.概念:异步网络请求,在不刷新整个页面的情况下做局部刷新。
	2.使用(jq)
		* $.ajax({
		* "url":"请求路径",
		* "type":"get",
		* "data":{"key",value},
		* "success":function(data){//业务逻辑,页面展示}
		* "dataType":"json/text/jsonp(跨域)"
		* });
		
		* $.get("请求路径",{"key":value},function(data){},"json");
		* $.post("请求路径",{"key":value},function(data){},"json");
* json
	1.概念:本身就是js中的对象表示方法,还是网络数据通讯的一种传输协议、
	2.json结构:
		json对象 {}
		json数组 []
		json的格式:  [{},{}]/{key:value,key2:value2}
	* 获取json对象中的值
		对象.属性
		数组[索引].属性
		ps: 真实情况下,如果是json数组,通常要遍历,直接取值。
	* json和java对象的转换:
		* 支持的三方库:
			* jsonlib
			* gson
			* fastjson
			* jackson(*)
		* api
			ObjectMapper om=new ObjectMapper();
			String json= om.writeValueAsString(对象/数组/集合[list/map)
		
		* response.setContentType("text/html;charset=utf-8")
		* response.getWriter().println("json字符串"):前台页面接收默认以text接收。		* response.setContentType("application/json;charset=utf-8")如果改成这个,在请求中删除json:$.get("请求路径",{"key":value},function(data){},"json");

今日内容 --> redis

1.redis: 非关系型数据库(内存中操作)
	1.概念:redis是一款高性能的NOSQL系列的非关系型数据库
		* 关系型数据库:mysql 、 Oracle...
			特点:
			1.数据之间有关系
			2.数据储存在硬盘的文件上
		* 非关系型数据库(NOSQL):redis 、 hbase...			(减轻关系型数据库压力,数据储存在内存中,效率高。)
			&: 储存key:value(键值对形式,每个数据之间没有牵连关系)
			特点:
			1.数据之间没有关联关系。
			2.数据储存在内存中。
		* 问题:经常查询一些不太经常发生变化的数据?(虽然map可以解决这个问题,但是跨域,分布式问题等,需要用redis来解决。所以使用redis菲关系型数据库来做缓存是很流行的。)
			1.从缓存中获取数据
				* 有数据:
					1.直接返回
				* 没有数据:
					1.从数据库查询
					2.将数据放入缓存
					3.返回数据
		* 什么是NOSQL:
			NOSQL(=not only SQL),意为“不仅仅是sql”,是一项全新的数据库理念,泛指非关系型的数据库。
			随着互联网web2.0网站的兴起,传统的关系型数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于本身的特点得到了非常迅速的发展,NOSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
			1.1.1:NOSQL和关系型数据库比较   (redis一般是用于做缓存)
				优点:
					* 成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。
					* 查询速度:nosql数据库将数据储存于缓存之中,关系型数据库将数据储存在硬盘中,自然查询速度远不及nosql数据库。
					* 储存数据的格式:nosql的储存格式是key,value形式、文档模式、图片形式等等,所以可以储存基础类型以及对象或者是集合等各种形式,而数据库则只支持基础类型。
					* 扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
				缺点:
					* 维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。
					* 不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本
					* 不提供关系型数据库对事务的处理
			1.1.2:非关系型数据库的优势:
				* 复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询
				* 事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的优势就是自己的弱势,反之亦然。
			1.1.3.关系型数据库的优势:
				* 复杂查询可以用在sql语句方便的在一个表以及多个表之间做非常复杂的数据查询
				* 事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的数据就是自己。
			1.1.4  总结:
				* 关系型数据库与NOSQL数据库并非对立而是互补关系,即通常情况下使用关系型数据库,在合适使用NOSQL的时候使用NOSQL数据库
				* 让NOSQL数据库对关系型数据库的不足进行弥补。
				* 一般会将数据储存在关系型数据库中,在nosql数据库中备份储存关系型数据库的的数据。
		1.2 主流的NOSQL产品
			* 键值(key-value)储存数据库
				* 相关产品:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
				* 典型应用:内容缓存,主要用于处理大量数据的高访问负载
				* 数据模型:一系列键值对
				* 优势:快速查询
				* 劣势:储存的数据缺少结构化
			* 列储存数据库
				* 相关产品: Cassandra,HBase,Riak
				* 典型应用:分布式的文件系统
				* 数据模型:以列簇式储存,将同一列数据存在一起
				* 优势:查找速度快,可扩展性强,更容易进行分布式扩展
				* 劣势:功能相对局限
			* 文档型数据库
				* 相关产品:CouchDB、MongoDB
				* 典型应用:Web应用(与Key-Value类似,Value是结构化的)
				* 数据模型:一系列键值对
				* 优势:数据结构要求不严谨
				* 劣势:查询是性能不高,而且缺乏统一的查询语法
			* 图形(Graph)数据库
				* 相关数据库:Neo4J,InfoGrid,Infinite Graph
				* 典型应用:社交网络
				* 数据模型:图结构
				* 优势:利用图结构相关算法
				* 劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
		1.3 什么是Redis
			Redis是用C语言开发的一个开源的高性能键值对(Key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s,且Redis通过提供多种键值数据类型来适应不同场景下的储存需求,目前为止Redis支持的键值数据类型如下:
		-- redis支持的类型:
			* string:字符串。
			* hash:就像java中的map,使用键值对,key:value
			* list:可以排序有索引的集合。
			* set:不能排序,不能储存相同的数据
			* sortedset:可以有一定的顺序,顺序由我们自己决定。
	2.下载安装		
		1. 官网:https://redis.io
		2. 中文网:http://www.redis.net.cn/
		3. 解压直接可以使用:
			* redis.windows.conf:配置文件
			* redis-cli.exe:redis的客户端
			* redis-server.exe:redis服务器端
		3. 命令操作
		1. redis的数据结构:
			* redis存储的是:key,value格式的数据,其中key都
	3.命令操作
		1.数据结构:
			* redis储存的是:key,value格式的数据,其中key都是字符串。value有5中不同的数据结构。
				* value的数据结构:
					* 字符串类型string
					* 哈希类型 hash  :map格式
					* 列表类型 list:linkedlist格式。支持重复元素
					* 集合类型 set: 不允许重复元素
					* 有序集合类型 sortedset:不循序重复元素,且元素有顺序。
		2.类型  这里面的key可以是一个任意的代表名字。
			* 字符串string:
				1.储存:set key value
				2.获取:get key
				3.删除:del name
			* 哈希hash: 
				* hset person name zs
				* hget person name
				* hgetall key: 获取所有
				* hdel person name  :删除map集合person中keyname的value的值。
			* 列表list:
				1. 添加:
				* lpush key value:lpush mylist a  -- 将元素加入列表左边(添加)
				* rpush key value:将元素加入列表右边(追加)
				2. 获取:
				* lrange key start end:范围获取 :lrange myList 0 -1  -- 获取所有列表数据。(这里的start和end代表索引,使用-1代表所有。)
				3.删除:
				* lpop key :删除列表最左边的元素,并将元素返回。
				* rpop key: 删除列表最右边的元素,并将元素返回。
			* 集合set:(不允许重复元素)
				* 储存:sadd key value: 
				* 获取:smembers key:获取set集合中所有元素
				* 删除:srem key value: 删除set集合中的某个元素
			* 有序集合sortedset:不允许重复元素,且元素有顺序  score是一个double类型的数字。
				* 储存:zadd key score value 
				* 获取:zrange key start end
				* 删除: zrem key value   (删除的zrem是zremove的缩写)
				* 获取: zrange books 0 -1 (withscore)
		-- 通用命令:
			* keys * :查询所有的键  查询所有相关的key的名字
			* type key: 查询该键的类型
			* del key:删除指定的key value;
	4.持久化
		1.redis是一个内存数据库,当redis服务器重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。
		2.redis持久化机制:
			1.RDB:默认方式,不需要进行配置,默认就使用这种机制
				* 在一定的间隔时间中,检测key的变化情况,然后持久化数据
					1.编辑redis.windows.conf文件
						* save 900 1		(在十五分钟之后如果最少有一个key被改变就会持久化一次。)
						* save 300 10		(在5分钟后只要有一个key发生改变就会持久化一次)
						* save 60 10000		(在60秒之后只要有10000个key发生改变就会持久化一次)
					2.重新启动redis服务器,并指定配置文件名称
						
			2.AOF:(不太推荐使用,影响运行效率)日志记录的方式,可以记录每一条命令的操作。
				* 可以每一次命令后,持久化数据。
					1.编辑redis.windows.conf文件
						1. appendonly no (关闭aof,默认情况) --> appendonly yes (开启aof)
					
						2. appendfsync everysec:每隔一秒进行一次持久化	-->默认情况
							* appendfsync always: 每次操作都进行持久化  ,将everysec替换。
							* appendfsync no :不进行持久化
					2.生成持久化文件:appendyns.aof文件。
			* 使用非关系型数据库能保证大部分的文件不会丢失,但也有可能会小部分数据丢失。如果需要安全性,还是需要考虑支持事务的关系型数据库。
			* 
	5.使用JAVA客户端操作redis
		* Jedis:一款java操作redis数据库的工具
		* 使用步骤:
			1.下载jedis的jar包
			2.使用
				* 快速入门:
					* //获取连接:
					* Jedis jedis =new Jedis("localhost",6379);
					* //操作
					* jedis.set("username","zhangsan");
					* //关闭资源
					* jedis.close;


			* Jedis操作各种redis中的数据结构(value值好像是只能储存字符串):
				* 字符串类型string: 
					*  get
					*  set 
					*  del
				* 哈希类型hash: 
					* hset 
					* hget
					* hgetall 
					* hdel
				* 列表类型list: 
					* lpush/rpush
					* lpop/rpop
					* lrange
				* 集合类型set:
					* sadd
					* smembers
					* srem
				* 有序集合sortedset:
					* zadd
					* zrange
					* zrem
			3.jedis.setex(key,seconds,value);储存过期时间的key value,就是value值在seconds时间过了之后会自动删除。可以储存一些验证码激活码什么的。seconds是int类型,其他是string类型。

	* jedis连接池:JedisPool
		* 使用:
			1.创建JedisPool连接池对象
			2.调用方法 getResource()方法获取Jedis连接
		pool = new JedisPool(配置对象,"ip",6379)
				pool.getResource()
		* 这里的一些配置信息是直接赋值的,可以创建一个utils工具类,然后加载配置文件,提供datasource。
			* 创建一个static private 的datasource对象,并且提供一个get方法。
			* 让类在加载时候初始化。
			* static{
			* 	//初始化dataSource
			* 	//配置信息
			* 		--> properties
			* 			-- 配置文件放在/src目录下
			* 		--> 类加载器
			* }   
			* 这个是在类加载的时候加载({}这个不加static的构造代码块是在类加载后才会加载,所以不常用,这里也用不到。)
	6.
	








		* mysql等关系型数据库是存储在硬盘中,而redis数据库如果不做持久化,那么就会一直储存在内存中。
		* html中没有绑定事件的函数方法,且在入口函数内的,只加载一次。
		* 注意:使用redis缓存一些不经常发生变化的数据。
			* 数据库的数据一旦发生改变,则需要更新缓存。
			* 数据库的表执行增删改操作,需要将redis缓存数据删除,再次存入。
			* 在service对应的增删改方法中,将redis数据清除。

猜你喜欢

转载自blog.csdn.net/qq_37128049/article/details/85273133