马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
redis是什么
nosql not only sql(不光仅是sql) 泛指非关系型数据库 一样平常把非关系型数据库称为nosql数据库.
redis mongodb
redis是一个nosql范例的数据库(非关系型数据库),数据在内存中以键值对情势存储.
读写速率快,也提供数据恒久化方式.
一样平常最常用的场景就是把redis用来做缓存.
redis使用场景
1.缓存
2.计数器 点赞
3.排行榜 数据布局, zset 按照分数排序
4.数据排重 去除重复数据
5.消息队列 redis中有一个list布局
6.分布式锁
redis线程模子
redis实验下令是单线程的为什么还这么快
1.数据都存储在内存中,读写速率都是内存级别的,以是快.
2.基于哈希布局存储, 通过key可以快速的在哈希表中找打对应的数据.
3.克制了上下文切换, 由于是单线程模式,以是不存在切换的开销.
redis恒久化
为什么redis要提供恒久化机制
我们如今除了缓存数据外,还将一些比方点赞等数据也是存储到redis的,如许服务万一断电,那么内存中的数据就丢失了.
以是redis提供了恒久化功能
redis提供了两种恒久化机制:
RDB:
是redis中默认的恒久化机制(默认开启)
当满意条件时,会对内存中的数据举行照相,以快照的方式把数据存储到.rdb文件中
快照(把key:value数据直接存储到rdb文件中)
触发恒久化规则: 在redis.conf文件中- save 900 1
- save 300 10
- save 60 10000
-
- 也可以执行save命令
复制代码 AOF:
也是redis中恒久化的一种方式, 默认是没有启动的
必要在redis.conf文件中设置
appendonly no-->yes
aof方式,以实验日记的方式记载的,将全部写使用的下令按次序追加记载到"appendonly.aof"文件中
还原数据时,逐行实验这些下令即可.
设置规则
appendfsync always 每次实验都会记载
appendfsync everysec 每秒实验一次
set k 1
set k 2
set c 2
set d 2
Redis 事件
redis中的事件相比于mysql事件,简朴很多
redis中的事件,包管同一个事件在实验时, 事件中的多条下令实验时,不会有其他事件插入到中心实验,由于redis是单线程.
redis事件实验时,不包管多条指令实验的原子性, 多条指令实验时,中心如果有错误的下令,不会影响其他下令的实验.
mutil 下令开启事件
set key value 参加事件
set key value 参加事件
exec 实验事件中的下令
Key 逾期计谋
- redisTemplate.opsForValue().set("k", "v",10,TimeUnit.SECONDS );
复制代码 redis中为key维护一个状态,表现是否逾期,
当定时时间到期后,将状态改为已逾期,并没有立刻删除key
在redis中有两种计谋删除逾期的key
1.惰性删除: 当key逾期后,在下次使用此key时,发现key已经逾期,然后再删除逾期的key, 不敷之处,浪费内存空间,长处,不必要有额外的线程定时定点的跟踪删除.
2.定期删除: 每隔指定的周期,对redis中逾期的key举行清算.
Redis 和 mysql 怎样包管数据同等
此题目讲的是怎样尽大概的包管,redis中和mysql中的数据保持同等(紧张是发生修改时)
采取延时双删计谋,
在更新mysql之前先删除redis中的数据, 在mysql没有完全更新数据完成时,其他线程可以先读取旧的数据,
在mysql数据更新完成后,再次删除redis中的数据, 厥后的线程确保读到就是最新的mysql中的数据.
缓存穿透
题目:
key对应的数据在数据库不存在,每次先查询缓存,缓存中没有,然后去查询数据库,数据库中也不存在,返回null,为null,没有往缓存中放,每次都还是直接查询的mysql.
办理方案
id10:值
id-1:null/-1
1.当mysql中查询不到时,可以向redis中存储一个key-value,value可以为null/-1,表名mysql中不存在
2.对参数举行校验不满意,就不查询.
3.使用布隆过滤器.
布隆过滤器
是一个二进制数组,用于判定元素是否存在.
使用k个哈希函数对某个值举行哈希盘算,盘算出来的哈希值存储到对应数组位置,把数组原来位置的0变为1.
查询是否存在时,同样用k个哈希函数盘算哈希值,如果每个位置上都是1,表名数据大概存在,
只要有一个位置是0,那么数据肯定不存在的.
会有肯定误判率
长处:
- 时间复杂度低,增长和查询元素的时间复杂为 O(N)
- 保密性强,布隆过滤器不存储元素本身
- 存储空间小,布隆过滤器好坏常节流空间的
缺点:
缓存击穿
题目:
数据在数据库是存在的, 只是redis中的热门key逾期了,这时有大量的哀求到来,同时哀求到mysql,导致mysql压力过大.
一样平常在秒杀这类场景中会发生的.
模仿秒杀: 1.写背景管理 管理秒杀商品 100
2.前端界面 卖商品
办理办法
1.热门数据设置较长逾期时间,
2.跑定时使命,在缓存失效前刷进新的缓存
3.加锁,可以给查询mysql的代码举行加锁,一个线程查询完后,把数据放到redis中,对访问mysql举行控制.
缓存雪崩
题目:
大量的热门key逾期,大概redis服务出现了题目,大量哀求访问到mysql
办理办法
1.可以给热门key设置随机逾期时间,克制同时逾期
2.可以使用集群摆设, 如果有一台redis服务出现题目,其他redis服务仍旧可以使用,
还可以将热门的key,存储到差别的redis库中
3.跑定时使命,在缓存失效前刷进新的缓存
|