一。什么是redis?
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。简单而言,Redis是一款内存高速缓存数据库。
二。redis与mysql的区别:
1.mysql数据库是一个关系型数据库,而redis数据库是一个非关系型数据库
2.mysql数据库是利用sql语句进行操作的一个数据库,
而redis数据库不需要sql语句进行操作,给予k-v键值对的一个数据库,所以redis也称之为缓存机制
【扩展】 nosql数据库:redis、solr、mongdb、memcache、hbase
三。redis存储的数据结构
一.字符串类型
1.获取: get key
2.设置: set key value
3.删除: del key
【注意:一个key对应一个value】
二.哈希类型
1.获取:
*.hget key field
*.hgetall key
2.设置: hset key field value
3.删除: hdel key field
【注意:一个key对应一个value】
三.list列表类型
1. 存储:
*. lpush key value: 将元素加入列表左表
*. rpush key value:将元素加入列表右边
【可以添加一个元素到列表的头部(左边)或者尾部(右边)】
2. 获取:
* lrange key start end :范围获取
start表示从0开始,索引
end表示查询的结束数字,索引,全部,-1
3. 删除:
* lpop key: 删除列表最左边的元素,并将元素返回
* rpop key: 删除列表最右边的元素,并将元素返回
四.set无序集合类型
1. 存储:sadd key value
2. 获取:smembers key:获取set集合中所有元素
3. 删除:srem key value:删除set集合中的某个元素
五.sortedset有序集合类型
1. 存储:zadd key score value
2. 获取:zrange key start end [withscores]
3. 删除:zrem key value
四。SpringDataRedis:
spring家族的一个框架,这个框架是基于jedis的基础之上封装的一组框架,能够更加简化开发
RedisTemplate接口类
封装的五种数据类型的方法
ValueOperations:简单 K-V 操作 --> 相当于字符串类型
SetOperations:set 类型数据操作 --> set类型
ZSetOperations:zset 类型数据操作 --> zset类型
HashOperations:针对 map 类型的数据操作 --> hash类型
ListOperations:针对 list 类型的数据操作 --> list类型
五。为什么使用缓存机制?
缓存技术一般应用在访问量比较大的项目中,比如门户系统,对外开发的系统,
采用缓存技术可以减轻数据库的压力
六。redis缓存同步:
其实就是数据库中的数据要和redis缓存的数据保持一致称之为同步.
在新增,修改,和删除中,都先清空redis缓存
七。redis中的数据库:
redis数据库总共有16个数据库,从db0-db15,默认是先存储到db0中,db0满了之后再存db1,依次类推
九。redis缓存穿透
概念:按照KEY去查询VALUE,当KEY对应的VALUE一定不存在的时候并对KEY并发请求量很大的时候,就会对后端造成很大的压力
【 客户端 ------>redis缓存------->mysql : 如果说redis缓存中有值,那么直接返回,如果没有值,就直接穿过redis去查询mysql,当高并发阶段的时候redis缓存中还是没有值,直接再去查询mysql,相当于redis缓存没有起到作用】
。
解决方案:
1、缓存层缓存空值。
–缓存太多空值,占用更多空间。(优化:给个空值过期时间)
–存储层更新代码了,缓存层还是空值。(优化:后台设置时主动删除空值,并缓存把值进去)
2、将数据库中所有的查询条件,放到布隆过滤器中。当一个查询请求来临的时候,
先经过布隆过滤器进行检查,如果请求存在这个条件中,那么继续执行,如果不在,直接丢弃。
十。redis缓存雪崩(缓存失效)
概念:如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。
解决方法:
1.在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。
比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2.可以通过缓存reload机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存
不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀
3.做二级缓存,或者双缓存策略。A1为原始缓存,A2为拷贝缓存,A1失效时,
可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。
4.搭建集群,使用集群中的哨兵机制
集群:由多台服务器组成的一个服务器群,每台服务器做的都是同样的工作
集群在实际开发中最小的配置是需要三台服务器,由于一主一备的原则,每台主机都要配置一个备份机
所以最好的配置是六台服务器(一主两从)
哨兵的作用
1.通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
2.当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
十一。redis击穿
概念:key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存
过期一般都会从数据库加载数据并会会设到缓存,这个时候大并发的请求可能瞬间把数据库压垮
解决方案:利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试。
【小编个人整理,如有错误之处,还望各位大神留言一同研究,谢谢】