redis总结
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了redis总结,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8183字,纯文字阅读大概需要12分钟。
内容图文
![redis总结](/upload/InfoBanner/zyjiaocheng/867/857f0cfbab124c3fbc0a88b4ee5de98e.jpg)
redis笔记总结
1.什么是redis?
它是一个非关系型数据库,不同于传统的数据库,是存在内存当中的。基于键值对的NoSQL数据库。
redis还可以实现分布式锁。
1.1如何实现分布式锁?
setnx?有点看不太懂,因为给的都是应用场景,光看代码,有点不懂。
1.2为什么能实现分布式锁?
?
2.为什么要用redis?
高性能:假如你每次访问数据都需要去查询数据库,而数据库是存在磁盘当中的,你去查数据库,又要去遍历磁盘,这样耗费的时间就会比较多,如果,你把数据缓存到redis里边,你每次访问数据直接从redis里边取就好了,redis又是直接在内存里边的,这样又会更加快。
高并发:直接操作缓存能够承受的请求远远大于操作磁盘,所以可以把数据库里的部分数据放到缓存当中去。这样的话,用户的一部分请求可以直接从缓存中获取,而不用经过数据库。
3.redis基本数据类型有哪些,能举例一下他们的应用场景吗?
String 简单的key-value,value不仅仅可以是String也可以是数字。应用场景:缓存状态,利用其他数据库做存储,redis实现缓存;
共享用户session,用户重新刷新一次界面,可能需要重新登录一下,每次都要去数据库里边查,是很耗费时间和资源的,把他放到缓存里是很适合的。利用redis统一集中管理用户session。但是redis得高可用才能保证用户session能够快速获取和更新数据。
什么是高可用?
一个服务挂了,可以自动切换到另一个服务上。
如何保证高可用?
redis主从复制
上图
主节点负责读写,从节点负责读
1.当master和slave正常连接的时候:master会发送一连串的命令来保证对slave的更新,便于将自身的改变(客户端的写入,过期时间等等)赋值给slave;
2.当两者断开连接:主从意识到连接超时,slave会尝试重连,slave会进行部分同步,会尝试获取在断开连接的这段时间丢失的命令流。
3.当无法进行部分同步时,slave会请求进行全量重同步,master要创建所有数据的快照,将其发送给slave,之后在数据集更新时持续发送命令流给slave。
全量和增量?
数据同步一般分为全量和增量。
全量:每天定时或周期性地把数据从一个地方拷贝到另一个地方。
增量:抓取某个时刻以后的数据来进行更新。
redis集群
提到了session,谈谈对session的了解吧。
什么是session?
session对象存储特定用户所需的属性和配置信息。
整个用户会话中一直存活下去。
浏览器和服务器会话过程中,服务器分配的一块存储空间。
服务器通过session_id来表示不同的用户和浏览器。
举例说一下session的使用?
我们在登录某些网站的时候,输入了用户名密码,登录以后再打开新的页面时,自动显示的是已登录的状态,不需要再次重新登录。这里就是session功能的一个小小的体现。
通过sessionid去查session表。
session工作原理
举个具体的例子来说吧
添加商品到购物车
首先通过浏览器向服务器发送添加商品到购物车请求,查询cookie携带过来的Sessionid,去查询本地的session表,如果没有的话则生成新的,保存购物车商品到此sessionid对应的内存集合中。将sessionid放在cookie中返回给浏览器。
session生命周期
当session超过一定时间没有被进行访问时,服务端就认为客户端已经停止活动。然后将这个session删除。
当用户关闭浏览器时,sessionid的信息丢失,虽然session服务器还在,但是已经访问不到数据了。
Zset 有序
语法:ZINCRBY key increment member
使用场景:实现排行榜 例如微博热搜排序,key就可以是小时榜/天榜/月榜,member是某一条热搜词条,incrementScore就是这个词条热度增量/权重增量
List 双向列表
使用场景:list类型的lrange命令可以分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中,如学校每次月考学生的成绩排名。只有定时计算的排行榜才适合使用list类型存储。对于频繁更新的列表,list类型的分页可能导致列表元素重复或漏掉。
Set 自动去重
在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。
4.关于redis的缓存穿透和缓存雪崩?
什么是缓存穿透?
大量请求的key不存在DB和redis中,请求直接打在了数据库上,造成压力过大。
场景解释:比如id是从1-10,这个时候去查询id=1000,肯定是查不到的。(id根本就没包括id=1000的,即使你让缓存区缓存这条记录,他也是不存在的呀?)
如何解决?
1.缓存不存在的key
2.布隆过滤器
布隆过滤器实现原理
什么是布隆过滤器?
一个很长的二进制向量(位数组)
一系列随机函数(哈希)
空间和时间查询效率高
有一定的误判率(哈希表是精确匹配)
为什么用它?
当你从一个特别多的数据集里边去判断某一元素是否存在在当前集合中,使用一些常见的操作都是比较耗资源和低效的。
此时布隆过滤器就应运而生。
当一个元素加入到布隆过滤器中进行如下操作:
1.使用布隆过滤器中的哈希函数对元素值进行计算,得到哈希值(有几个哈希函数得到几个哈希值)
2.根据得到的哈希值,在位数组中把对应下标的值置为 1。
判断一个元素是否存在布隆过滤器
1.对给定元素再次进行相同的哈希计算;
2.得到值之后判断位数组中的每个元素是否都为 1,如果值都为 1,那么说明这个值可能在布隆过滤器中,如果存在一个值不为 1,说明该元素一定不在布隆过滤器中。
3.设置过期时间(比如短信验证码还有一些其他数据是有时间限制的)
过期时间到了要怎么删除呢?
定期删除和惰性删除。
分别说说什么是定期和惰性?
如果通过以上两种方式还有一些过期key没被删除怎么办?
数据淘汰机制:
为什么要用?
保证mysql里数据量很大的时候,redis里边存的都是热点数据
是什么?
volatile-Iru:从已设置过期时间的数据集(serverdb[il.expires)中挑选最近最少使用的数据液汰
volatile-ttl:从已设置过期时间的数据集(serverdb[il.expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(serverdb[ilexpires)中任意选择数据淘汰
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)
allkeys-random:从数据集(serverdb[ildict)中任意选择数据淘汰
no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。
4.0版本后增加以下两种:volatile-lfu:从已设置过期时间的数据集(serverdb[ilexpires)中挑选最不经常使用的数据淘汰
allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的key
什么是缓存雪崩?
同一时间内,redis出现大面积的数据失效,大量的请求直接打在DB上,造成DB服务器压力过大,崩溃。
实际场景:抢购(00:00-00:30),放很多缓存让用户去查,到时间清除。
雪崩:直接影响(因为redis是共享的):redis,间接:系统,mysql
如何解决?
1.热点数据失效时间分散
2.增加Redis服务器的数量
3.数据库降级处理,不要然过多请求一次性打在DB上,可以返回一些默认值,比如“系统繁忙,请稍后重试”。
5.redis属于什么线程模型?
单线程模型。因为他内部使用文件事件处理器,而这个文件事件处理器就是单线程的。
文件事件处理器构成
文件事件是对套接字操作的抽象,每当一个套接字准备好执行连接应答(accept)、写入(write)、读取(read)、关闭(close)等操作时,就会相应产生一个文件事件。
I/O多路复用器负责通过loop循环监听多个套接字,同时将一系列套接字按循序存储到一个队列中,由队列向文件事件分派器传送队列中套接字,套接字是有序的。
文件事件分配器接受队列中的套接字并根据套接字产生的事件类型,相应调用不同的事件处理器。
6.redis为什么要使用单线程模型?
因为不需要来回进行线程的切换,节省资源。
7.redis支持事务吗?
redis是支持事务的。
那聊聊redis的事务吧。
redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。
Redis 是单进程程序,并且它保证在执行事务时,不会对事务进行中断,事务可以运行直到执行完所有事务队列中的命令为止。因此,Redis 的事务是总是带有隔离性的。
不保证原子性,单条命令保证原子性,但是事务不保证原子性。
8.谈谈你对redis中的RDB和AOF认识。
redis如何实现持久化?
为什么要进行持久化,因为redis数据是放在内存当中的,如果没有进行持久化,计算机一重启,数据就全部消失了。
RDB
在指定的时间间隔,将内存中的数据集快照写到磁盘上。其实是fork一个子进程,先把数据集写入临时文件,写入成功后,再替换掉原来的文件,然后用二进制压缩存储。
AOF
以日志的形式记录服务器所处理的每一个读,删除操作。以文本的方式记录。
比较一下二者吧
采用RDB的话,整个数据库只包含一个文件,适用于灾难性恢复。每隔一个时间间隔,会进行复制,会生成多个文件。适合做冷备。把这种完整的数据文件发送到远程服务做好安全存储。
当数据遇到丢失时, 你可以很方便的从不同的备份粒度(版本)来恢复数据集。
性能最大化。
数据集很大,RDB启动效率更高。
想保证数据高可用,它不是很好的选择,因为一旦宕机的话,他还没来得及写入磁盘的数据就丢失了。
如果数据集比较大,会导致整个服务器停止服务几百毫秒甚至1秒。
存放的是指令日志,做数据恢复的时候,是要进行回放和执行所有的日志指令。
而RDB就是数据文件,所以他比较快。
AOF
更好的保存文件,每隔一秒就进行fsync(同步内存中所有已修改的文件数据到储存设备。);
日志文件即使过大,也不会对客户端造成影响。
redis默认的是RDB。
9.redis有哪些优缺点?
读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s;
支持事务,单个Redis执行的命令是原子性的,redis的事务不是原子性的,单线程;
支持主从复制;
数据结构丰富;
缺点:
数据库容量受到物理内存限制;
不具备自动容错和恢复功能;
较难支持在线扩容。
10.为什么要用redis?
在多实例情况下,各实例共用一份缓存数据,缓存具有一致性。
Java自带的 map 或者 guava 实现的是本地缓存,而且不具有一致性。
11.redis的过期时间和永久有效如何设置
EXPIRE和PERSIST命令。
12redis内存用完会发生什么
如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)
13.redis如何做内存优化
使用散列表。
14.redis事务开始的三个阶段
事务开始MULTI
命令入队
事务执行EXEC
内容总结
以上是互联网集市为您收集整理的redis总结全部内容,希望文章能够帮你解决redis总结所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。