与redis相关的所有知识点整理

本文详细介绍了Redis的发展背景、特点,对比了内存与缓存的区别,强调其高性能、分布式扩展性和丰富的数据类型。讨论了Redis的持久化机制,包括RDB和AOF的优缺点。此外,还探讨了Redis的单线程模型如何支持高并发,以及Redis在实际应用中的场景,如存储用户信息、消息队列等。同时,文章提出了Redis面临的问题,如缓存穿透、雪崩,以及对应的解决方案,并简述了Redis集群和内存淘汰策略。

redis

1.redis发展的背景

web应用发展初期,关系统数据库的web站点在性能上出现瓶颈,瓶颈的源头在磁盘的I/O上。而在云计算、大数据盛行的时代,对性能有了更高的要求,主要表现在:
(1)低延迟读写速度;应用快速的反应提升用户满意度;
(2)能够支撑海量的数据和流量:比如搜索,需要利用PB(1024TB)级别的数据和能应对百千万级别的流量。
(3)大规模集群的管理:系统管理员希望分布式应用能更简单地部署和管理。
(4) 庞大运营成本的考量:IT部门希望在硬件成本、软件成本和人力成本能够有大幅度地降低;
为了克服以上的功能,NOSQL应用而生,他具备了高性能、可扩展性强、高性能的特点,受到开发者青睐。

2.什么是redis?

redis是NOSQL数据库之一,是使用ANSI C语言编写的key-value的存储系统.

3.内存与缓存的区别?

内存是内部存储器,是一个硬件设备;用于存放计算机的运行程序和处理的数据
缓存是与读取一些数据信息或者暂存一些不长久的信息.

内存缓存
存储内容存放所有的运行程序和处理的数据缓存是CPU的一部分,存在于CPU中,存储内存中少部分数据的复制品
数据存储原理1.运行计算机时,程序首先会被读入内存;1.内存中被CPU访问最频繁的数据和指令被放入CPU的缓存中;
2.程序在特定的内存中进行执行,将处理的结果也保存在该内存中(内存会和CPU频繁交换数据)2.CPU下次寻找数据直接去缓存中取(缓存中的数据按照算法更换,保证缓存中存储的数据是被访问最频繁的);
3.若缓存中没有,则从内存中读,将读取到的数据存入缓存。
分类1.一级缓存:cpu内部集合的缓存(分为数据缓存和指令缓存)通常是静态RAM(随机存储器,可随时读写,速度很快,断电后不能保存数据)
2.二级缓存:动态RAM(存储时间短,定时进行刷新处理)

4.redis的特点?

特性:
(1)基于内存运行,性能高效;(redis的数据存放在内存中,mysql的数据存放在磁盘中的)
(2)支持分布式,理论上可以无限扩展;
(3)以Key-Value形式存储数据;
(4)可持久化;
相比于其他数据库,redis具备的特点是:
(1)C/S通讯模型;(基于Socket来实现);
(2)单进程单线程;
(3)丰富的数据类型;(String、list、hash、set、Zset)
(4)操作具有原子性;
(5)持久化;
(6)高并发读写;
(7)支持lua脚本。

5.redis的可持久化理解

redis的所有数据都是保存在内存中的,如果reids崩掉的话,会丢失。redis持久化就是把数据保存在磁盘上(可保存永久的数据中,以便数据恢复)。
redis提供两种方式进行持久化:
(1)RDB(Redis dunp database)持久化:将reids内存中的数据集定时dump(转储)到磁盘中;
操作过程:fork(克隆)一个子进程,将数据及写入一个临时文件,写入成功后,再替换之前的文件,用二进制压缩存储;
RDB持久化操作
优势:<1>便于数据备份,若出现灾难性事故,能够很快恢复;
<2>使性能最大化,在操作时fork子进程进行持久化操作,避免服务进行IO操作;
劣势:<1>若想保证高可用,即最大限度的避免数据丢失,RDB持久化不适合,一旦在定时持久化之前出现宕机现象, 此前没有来得及写入磁盘的数据都将丢失;
<2>当数据量较大时,RDB是通过fork子进程进行持久化,可能会导致整个服务器停止几百毫秒,甚至一秒钟;(频繁处理子进程数据)
(2)AOF(append only file)持久化:将redis的操作日志以追加的方式写入文件;
操作过程:以日志的形式记录服务器处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可打开操作日志查看操作记录。
AOF持久化
优势:<1> 可带来更高的数据安全性,即数据持久性。redis提供了3种同步策略,即每秒同步(异步执行)、每修改同步和不同步。
<2>该机制对日志的写入是通过append模式,所以即使出现宕机现象,已存在的日志是不会丢失的。
<3>如果数据量过大,redis可以自动启用rewrite机制,redis会将数据通过append写入老磁盘文件,redis还会创建一个文件记录在此期间被修改的文件命令被执行。因此在进行数据rewrite切换时,可保证数据安全性;
<4>AOF包含清晰的日志文件用于记录所有的修改操作,通过该文件可进行数据的重建。
劣势:<1>对于相同数量的数据集,RDB回复数据记录要快于AOF恢复数据记录AOF(AOF文件大于RDB);
<5>根据同步策略的不同,AOF的运行效率会慢于RDB。

6.C/S与B/S通讯模型

C/S客户端与服务器器之间的通讯模型,基于socket建立连接;
通信过程如下:
(1)服务器端启动监听端口,对指定端口进行监听,等待接收客户端的连接请求;
(2)客户端服务启动,请求连接服务器端的指定端口;
(3)服务器端接收到客户端的连接请求后与客户端建立Socket连接;
(4)连接成功后,客户端和服务端分别打开对应的两个流(输入流、输出流)建立流的连接,连接成功后可进行双向通信了;
(5)连接完毕,客户端与服务端两边双向断开。
套接字( socket):计算机之间通信的双向端口,具体包括主机的IP地址、服务类型、TCP/IP协议的端口。
B/S 浏览器与服务器,基于http实现。

7.redis的单线程模型

多线程的本质是CPU模拟出来多个线程的情况。对于一个呢存的系统来说,没有上下问的切换就是效率最高的。redis用单个CPU绑定一块内存的数据,针对这快内存的数据的多次读写的时候都是在一个CPU上完成的,所以是单线程处理这种情况。(如果数据全在内存里,单线程操作效率就是最高的。)
总结:基于纯内存操作;
核心是基于非阻塞的IO多路复用机制;
单线程避免了多线程频繁的上下文切换问题。

8.线程、进程

每个程序执行都会产生一个进程,每个进程至少要有一个主线程。
多线程就是在一个进程内有多个线程。

9.数据库事务的原子性

原子性是数据库事物的特性,在数据库事务的情景下,一个事物的操作,要么全部完成,要么全部不完成。
redis的操作时原子性的,因为redis是单线程的。

10.redis是单线程的,是如何支持高并发读写的?

多路复用技术(多路:多路网络连接;复用:复用同一个线程) 。多路复用技术有select、poll、epoll(目前使用最多的)。
redis使用多路复用技术可以处理并发的连接,非阻塞IO内部实现采用epoll,epoll中的读、写、关闭、连接都转化了事件,利用epoll的多路复用特性,不在io上浪费时间。

11.脚本语言与非脚本语言的区别

脚本语言(解释性语言)是不需要编译可以直接运行,即运行时不需要打包、编译、省去很多时间。
非脚本(编译性语言)语言:把所写程序需要编译一下,然后才能执行。

12.lua脚本

lua是用C开发的脚本语言。

13.redis的应用场景:

缓存系统:高频度、低频写。
计数器,延时任务、范围查找、    消息队列系统;
排行榜、社交网络和实时系统。

14 redis的数据结构?

String类型
String类型是基本的key-value结构,key是数据在redis中的唯一标识,value是具体的数据
应用场景:
(1)存储mysql中某个字段的值
eg: user🆔1 12123232132@qq.com
(2)存储对象
String 类型能够存储任何格式的字符串,如json或其他对象格式化的字符串(这种建议用hash存储)
eg:user🆔1 '[{“id”:1,“name”:“zj”,“email”:“156577812@qq.com”}
(3)生成自增id
当String类型的值是整数形式时,可以将它看作整数一样进行自增或自减操作。
Hash数据类型
key是唯一值,value是hashmap的结构
hash适合存储对象类数据
eg:user:1 name zj email 156577812@qq.com
应用场景:单点登录存储用户信息
List数据类型
list是按照插入顺序排序的字符串列表,
可以在头部和尾部插入新的元素,如果key不存在,则redis会为key创建一个新的链表;如果中链表中所有元素都被移除,则该key也会从redis中移除。
数据模型:在用lpush在list头部插入元素,rpop在list尾部取出元素
使用场景:
(1)消息队列
(2)“获取最新内容”
(2)利用lrang命令做基于redis的分页功能。
Set数据类型
set没有排序,不允许数据重复的集合
set提供了多个set之间的聚合操作,如求交集、并集、补集,这些在redis内部完成,提高效率。
场景:如社交系统的共同好友列表,可以用set求出交集。
Zset数据类型
在set的基础上给集合中的每个元素关联了一个分数,让有序集合插入元素时会自动根据这个分数排序。
应用场景:根据亲密度显示好友
排行榜功能获取topN
eg:// 用元素的分数(score)表示与好友的亲密度
zadd user:kobe 80 james 90 wade 85 melo 90 paul
// 根据“亲密度”给好友排序
zrevrange user:kobe 0 -1
/**

  • 输出:
  •  1) "wade"
    
  •  2) "paul"
    
  •  3) "melo"
    
  •  4) "james"
    

*/

15.redis中的常见问题

(1)缓存穿透
概念:在缓存获取某一key时,该key不存在,缓存回去访问数据库,存在大量这种恶意请求的时候会造成缓存穿透。
引发穿透的原因:

  • 第一次访问;
  • 恶意请求不存在的key;
  • key已过期;
    解决方案:
  • 利用互斥锁,缓存失效的时候,先去获得锁,得到锁了再去访问数据库。没得到锁,再去休眠一段时间重试。
  • 采用异步更新。缓存过期时,异步更新缓存。缓存预热(项目启动前,先加载项目缓存)
  • 提供一个请求是否有效的拦截机制,比如利用Bloom过滤器(原理类似hashset),内部维护一系列合法有效的key,请求过来时,判断key是否有效,无效,则直接返回。
    (2)缓存雪崩
    概念:原有缓存失效,新缓存加载成功,导致请求全部涌入数据库,对数据库CPU和内存造成巨大压力,严重的话会导致数据库宕机,从而形成一系列连锁反应,造成系统奔溃。
    解决方案:
    设置热点数据永不过期;
    给缓存加上随机失效时间,避免集体失效;
    使用互斥锁:
    双缓存;(A、B级缓存,B级缓存没有的时候,启用异步先线程更新缓存)

16.redis集群

https://www.cnblogs.com/51life/p/10233340.html

17.redis内存淘汰机制

配置:
** maxmemory-policy volatile-lru**
(1)navocation:当内存不足时,新写入数据时会报错;(勿用)
(2)allkeys-lru:当内存年不足时,新写入时,在键空间中,移除最近最少使用的key;(推荐使用)
(3)allkeys-random:当内存年不足时,新写入时,在键空间中,随机移除某个key;(不推荐)
(4)volatile-lru:当内存不足时,在设置了过期时间的key中移除最近最少使用的key;
(5)volatile-random;
(6)volatile-ttl::当内存不足时,在设置了过期时间的key中,有更早过期时间的key优先移除;

18.如何解决redis并发竞争key的问题

问题是:多个子系统去set一个key,要注意些什么?(不推荐是用redis的事务机制)在生产环境中,基本都是redis集群操作,做了数据分片操作,在事务中涉及多个key曹组ode时候,这些key不一定都在一个redis-server上,因此redis的事务机制不适合。
解决方案:
(1)在不要求key顺序的时候,准备分布式锁,抢到锁就进行set操作;
(2)要求顺序的时候,在数据保存数据的时候,保存时间戳,利用时间戳比较。
(3)利用队列,将set操作变成串行访问

19.redis数据类型最大存储量

String类型:一个String 类型的value最大可以存储512M;
List、hash、set、zset类型:元素最多为2^32-1个,4294967295个(42亿);

20.什么是Redis大key,为什么会造成大key,仅从Redis层面可以怎么改善?

大key:即key本身的存储空间过大,或者存储的value值非常大.
大key会造成什么问题:
(1)如果是string类型的大key,因为redis是单线程运行,所以在读写数据时会导致redis性能下降,甚至阻塞服务;
(2)如果是hash、set、list、zset类型的key,删除key也会严重阻塞redis进程;
解决方法:
(1)单个可以value很大的时候,产分成多个key,用multiget去获取值,这道个key还可以分散到不同节点,还可以把流量分散到不同节点。
(2)把大value拆到一个hash中去,利用hget获取。
(3)hash、list、set、zset中存储元素过多时,按照存储规则进行分类,将气氛分散到多个Redis实例中。
多缓存操作的改善可以利用pipeline管道(一次发送多条命令,并在执行完后一次性返回),拆分之后用pipeline去取。(redis是单线程的,一次只能执行一个命令)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值