目录
一、概念
1.非关系型数据库(NoSQL)的介绍
答:随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站的高并发和纯动态网站已经显得力不从心。NoSQL数据库(非关系型数据库)的产生就是为了解决大规模集合多重数据种类带来的挑战,尤其是大数据应用难题
2.什么是redis
答: Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value的非关系型数据库。Redis的数据都基于缓存的,所以很快,每秒可以处理超过10万次读写,是已知性能最快的Key -Value DB。也可以实现写入磁盘中,保证了数据的不丢失,而且Redis的操作是原子性的。
3.redis的作者
答: redis的作者,他叫Salvatore Sanfilippo,来自意大利的西西里岛,现在居住在卡塔尼亚。目前供职于Pivotal公司。
4.Redis的特点
(1)性能极高--(redis读取速度是110000次/s,写入的速度是81000次/s)
(2)丰富的数据类型(String、List、Hash、Set、Ordered Set).
(3)原子--Redis的所有操作都是原子性的,就是要么成功执行要么失败完全不执行
5.redis的应用场景
缓存、排行、计数器应用、分布式锁、社交网络、消息队列、共享Session、位操作
6.高度概括知识
(1)基于内存实现的。因为内存要比用磁盘读写的MySQL速度要快很多。
(2)高效的数据结构。Redis 支持多种数据数据类型,每种基本类型,可能对多种数据结构。
(3)字符串长度处理。
(4)空间预分配。SDS修改和空间扩充,会额外分配未使用的空间,减少性能损耗。
(5)惰性空间释放。SDS 缩短时,不是回收多余的内存空间,而是free记录下多余的空间,后续有变更,直接使用free中记录的空间,减少分配。
(6) 二进制安全。Redis可以存储一些二进制数据,在C语言中字符串遇到'\0'会结束,而 SDS中标志字符串结束的是len属性。
(7)I/O 多路复用。多路I/O复用技术可以让单个线程高效的处理多个连接请求,而Redis使用用epoll作为I/O多路复用技术的实现。并且,Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间。
(8)单线程模型。Redis是单线程模型的,而单线程避免了CPU不必要的上下文切换和竞争锁的消耗。
(9)虚拟机内存机制。Redis自己构建了VM机制 ,不会像一般的系统会调用系统函数处理,会浪费一定的时间去移动和请求。
(10)redis持久化。Redis是基于内存的非关系型K-V数据库,既然它是基于内存的,如果Redis服务器挂了,数据就会丢失。为了避免数据丢失了,Redis提供了持久化,即把数据保存到磁盘。
7.redis的目录文件介绍
redis-server:
这是 Redis 服务器的可执行文件,用于启动 Redis 服务器。redis-cli:
这是 Redis 命令行客户端的可执行文件,用于与 Redis 服务器交互,执行各种 Redis 命令。redis-benchmark:
这是 Redis 自带的性能测试工具,用于对 Redis 服务器进行基准测试。redis-check-aof:
这是用于检查和修复 AOF(Append-Only File)日志文件的工具。redis-check-rdb:
这是用于检查和修复 RDB(Redis Database)快照文件的工具。redis-sentinel:
这是 Redis 哨兵模式的可执行文件,用于监控和管理 Redis 主从复制的状态。redis.conf:
这是 Redis 的主要配置文件,包含了各种 Redis 服务器的配置选项。你可以通过修改这个文件来自定义 Redis 的行为。redis.windows.conf:
这是在 Windows 环境下的 Redis 配置文件,包含了和 redis.conf 类似的配置选项。utils 目录:
这个目录包含了一些实用工具,如 sentinel.conf、install_server.sh(用于在 Linux 上设置 Redis 服务器)、create-cluster(用于创建 Redis 集群)等。src 目录:
这个目录包含了 Redis 服务器的源代码文件,一般情况下用户不需要直接操作这个目录。deps 目录:
这个目录包含了 Redis 所依赖的一些库和工具的源代码文件,用户也不需要直接操作这个目录。redis-version 文件:
这个文件记录了 Redis 的版本信息。这些是 Redis 安装目录下一些常见的文件和目录。具体的文件和目录结构可能因 Redis 版本和安装方式的不同而有所变化。在配置和使用 Redis 时,主要关注 redis.conf 或 redis.windows.conf 这些配置文件,以及 redis-server 和 redis-cli 这些执行文件即可。
二、缓存穿透、缓存击穿、缓存雪崩的概念
正常的缓存请求方式:读取请求过来了,然后去缓存区域查询有没有,缓存有对应的值就直接命中返回。
如果去缓存区域查询没有,就去查询数据库,然后再把数据库的值更新到缓存,再返回
(一)缓存穿透
读请求访问时候,缓存和数据库都没有这个值,但是每次还是会到数据库中先查询一下。(没有该key)
产生的原因:
(1)业务设计的不合理:大多数用户没有开守护,但是每个请求都去查询缓存,查询某个用户有没有守护。
(2)业务/运维/开发失误的操作:比如缓存和数据库的数据都被删了
(3)黑客的非法请求攻击:黑客故意捏造大量非法请求,去读取不存在的业务
解决办法:
(1)使用布隆过滤器快速判断数据是否存在。即一个查询请求过来时,先通过布隆过滤器判断值是否存在,存在才继续往下查。
(2)如果查询数据库为空,可以给缓存设置个空值,或者默认值。但是如果有写请求进来的话,需要更新缓存,以保证缓存一致性。同时,最后给缓存设置适当的过期时间。(常用)
(3)如果是非法请求,我们在API入口,对参数进行校验,过滤非法值。
(二)缓存击穿
指热点的key在某个时间点过期,而恰好这个时候大量的并发请求来访问这个热点key,然后大量请求到了数据库。(单一key个过期)
解决办法:
(1)使用互斥锁。缓存失效时候,不是立即去加载数据库的数据。而是先使用某些成功带成功返回的原子操作命令去操作,再去加载数据库和设置缓存。否则就重试去获取缓存。
(2)永不过期。没有设置过期时间,但是热点数据快要过期时,异步线程去更新和设置过期时间。
(三)缓存雪崩
指缓存中数据大批量到过期时间,而查询数据量巨大,请求都直接访问数据库,引起数据库压力过大甚至down机。(大量key过期)
解决办法:
(1)通过均匀设置过期时间解决,即让过期时间相对离散一点。如采用一个较大固定值+一个较小的随机值,5小时+0到1800秒
(2)Redis 故障宕机也可能引起缓存雪奔。这就需要用Redis高可用集群
三、下载安装Redis操作步骤
如果你觉得本篇文章对你有所帮助的,多多支持吧!!!
点赞收藏评论,抱拳了!