redis简介

redis
Nosql、Redis、Redis安装和使用、Jedis、Redis的数据类型、Keys的通用操作、Redis的特性、Redis持久化

第一   NoSQL == Not Only SQL非关系型数据库
		解决问题:高并发读写、海量数据的高效率存储和访问
		例如:MongDB、redis
		2、概述
			键值对存储、列存储、文档数据库(MongDB)、图形数据库(infogread)不容易做分布式的
			特点:易扩展(数据库之间没有关系)、灵活的数据模型(无需对存储的数据建立字段)
				、大数据量高,高性能、高可用
		3、何为关系型数据库?
			基于关系型数据模型的数据库,由多张能相互关联连接的二维行列的二维表格组成的数据库;例如Oracle、MySQL
第二	Redis
				用c语言开发的
				支持的键值数据类型:字符串、列表类型、有序集合类型、散列类型、集合类型
				应用场景:缓存、任务队列、网站访问统计、应用排行榜、数据过期处理、分布式集群架构中的session分离
				安装:在linux上搭建
第三	Jedis :Redis连接的一个基本操作(java是支持的,Rdsi官方首选的)与jdbc差不多
			连接池方式连接
				//获得连接池的配置对象
				JedisPoolConfig config = new JedisPoolConfig();
				//设置最大连接数
				config.setMaxTotal(30);
				//设置最大空闲连接书
				config.setMaxIdle(10);
				//获得连接池
				JedisPool jedisPool = new JedisPool(config,"ip",端口);
				//获得核心对象
				Jedis jedis = null;
				
				jedis = jedisPool.getResource();
				jedis.set("name", "张三");
				if(jedis != null){
				jedis.close();
				}
				if(jedisPool != null){
				jedisPool.close();
				}
第四	数据类型:字符串、哈希、字符串列表(list)、字符串集合(set)、有序字符串集合(sorted set)
		String :二进制,最大为512M
			操作:赋值、取值、删除、数值增减、扩展命令
				set key value
				get key
				getset key value #先取值再赋值
				del key #删除 返回nil的意思是该key不存在
				incr key #加  给key的至加一若不存在,则新建且值0,字符串不能累加会抛异常
				decr num #减  给key的至减一若不存在
				incrby key value #增加制定value的至
				decrby key value
				append num 
		Hash:String Key和String Value的map容器
			hset map key value
			hmset map key value key value。。。
			hget map key
			hmget map key key...
			hdel map key key ...#不存在的字段也可删除
			del map 			#删除整个map
			hincrby map mun
			hexists map key     #有为1没有为0
			hlen map 			#长度
			hkeys map 			#所有key
			hvals map			#所有value

问题总结:
1、为什么要使用redis?
一般是从俩个方面:性能和并发,这俩个特点比较突出
性能:执行耗时久、且结果不频繁变动的SQL,将运行结果放到缓存,后续的请求从缓存中读取,使得请求能
快速响应;
并发:所有的请求直接访问数据库,数据库会出现连接异常。就用redis做一个缓冲的作用,让请求先访问到redis
,而不是直接访问数据库。
2、redis的缺点
缓存与数据库双写一致性的问题
缓存雪崩的问题
缓存击穿的问题
缓存的并发竞争问题
3、redis的内部机制,以及为何这么快
内部机制:redis是单线程工作模型
速度快:
纯内存操作:
单线程操作避免了上下文的切换:
采用了非阻塞I/O多路复用机制:在使用redis-client操作的时候,会产生具有不同事件类型的socket,在服务端,有一段I/O
多路复用程序,将其置入队列。然后文件事件分派器依次在队列中取,转发到不同的事件处理器;
4、redis的五种数据类型
一、String:常规的set、get操作,value可以是String也可以是数字,做一些复杂的计数功能的缓存;
二、hash: value存放的是结构化的对象,可以操作其中的某个字段:ps:单点登录
三、list: 1、List数据结构,简单的消息队列;
2、利用Irange命令,做基于redis的分页功能;
3、生产和消费者的场景:先进先出的队列原则;
四、set: 1、可以做一个全局去重的功能
pS:为什么不用JVM自带的set,假如是集群部署系统,使用JVM自带set,需要做一个全局去重,并且启一个公共服务;
五、sorted set:多了一个权重参数score,集合中的元素能够按照score进行排列;
应用:排行榜应用;
5、redis的过期策略以及内存淘汰机制
redis采用的his定期删除+惰性删除策略
为什么不用定时删除策略:定时删除,用一个定时器来监视key,过期自动删除,十分消耗cpu资源;
定期删除:redis默认每隔100ms检查一次,是否有过期的key,如果有则删除(并不是检查全部的key,而是随机抽取查询);
惰性删除:在获取某个key时(请求某个key),redis会检查,此key是否设置了过期时间,若设置则过期没有,若过期删除;
定期删除+惰性删除 缺点:定期删除key没删除,也没有即时的请求key(惰性删除没生效)。会导致redis内存越来越高;
改进:内存淘汰机制;
内存淘汰机制:maxmemory-policy
参数:noeviction:当内存不足以容纳新写入数据时,新写入操作会报错;
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最少使用的key;
akkkeys-random:**,随机删除某个key;
volatile-lru:
,在设置了过期时间的键空间中,移除最少是用的key;
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,
有更早过期时间的key优先移除;
6、redis和数据库双写一致性问题:
分布式常见问题:可以分为最终一致性和强一致性;
产生原因:数据库和缓存双写,必然存在;
思路:
如果对数据有强一致性则不能放缓存;
解决办法(只能降低可能,不能完全避免):
1、有强制一致性则不能放在缓存;
2、先更新数据库,在删除缓存,且可能存在删除缓存失败的问题,提供一个补偿措施,例如消息队列;
7、如何应对缓存穿透和雪崩问题
条件:大并发项目,流量超过几百万;
缓存穿透:黑客故意去请求缓存中不存在的数据,导致所有的请求都怼在数据库上,从而数据库连接异常;
解决:一、利用互斥锁,缓存失效的时候,先去获得所,得到所再去请求数据库,没得到所,则休眠一段时间;
二、采用异步更新策略:无论key是否取到值,都直接返回;
三、提供一个能迅速判断请求是否有效的拦截机制;布隆过滤器
缓存雪崩:缓存同一时间大面积失效,这个时候又来了一堆请求,请求全都怼到数据库上,导致数据库连接异常;
解决:一、给缓存的失效时间加一个随机值,避免集体失效;
二、是用户斥锁,缺点:吞吐量下降;
三、双缓存;
8、redis的并发竞争key
产生原因:多个子系统去set一个key
解决:1、redis的事务机制,缺点,生产环境一般都是redis集群环境,做了数据分片操作,十五中有涉及到多个key操作的时候,
多个key不一定存储在同一个redis-server上;
2、如果对key的操作不要求顺序:
准备一个分布式的锁;
3、如果要求顺序:
设置一个时间戳,若先执行的发现更新时间晚于自己的时间戳则不做set操作;
或者利用队列,将set方法变成串行访问;http://javaxxz.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值