百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis学习知识点(redis相关知识)

mhr18 2024-11-06 11:02 20 浏览 0 评论

1.Redis的应用场景?

	1.Token令牌的生成
	2.短信验证码的code
	3.可以实现缓存查询数据 a. 减轻我们的数据库的访问压力 Redis与mysql数据库不同步的问题
	4.Redis帮助实现计数器
	5.分布式锁
	6.延迟操作  分布式消息中间件

注意:Redis官方是没有windows版本的,只有linux,这是因为 在nio中epoll只有linux操作系统独有

2.Redis线程模型?

	Redis的采用NIO的IO多路复用原则,也就是一个线程维护多个不同的Redis客户端连接,从而提高处理
并发效率和保证线程安全问题.底层采用linux操作系统的epoll技术避免空轮询.

3.Redis数据结构?

String类型、Hsh类型、List类型、Set类型 、Sorted-Sets
String: 存储 set key value ; 获取 get key
Hsh: 存储 hmset key  zhang 28  li 27  liu 23;  获取  hget key zhang/li/liu
list: 存储 lpush key  xiaomi xiaojun xiaoqiang ;获取 lrange key 0(开始位置) 3(结束)
			移出第一个元素并获得: lpop key 
set: 存储 sadd key xiao1 xiao2 xiao3 xiao3(不能重复,无序) 存储3个元素
			获取 smembers key
sortset:存储 zadd key 1 zhang  zadd key 2 li  zadd key 3 zhang
			(序号 值 ;有序的,值不能重复,重复存入,序号会覆盖之前序号,取值按照序号排序)
			获取 zrange key 0 10 withscores(带上此参数,取值包含序号)

4.SpringBoot整合redis使用注意事项:

1.使用对象必须序列化 implements Serializable
2. private RedisTemplate<String ,Object> redisTemplate;使用@Resource注入,
		不能使用@Autowired,因为按照类型找的autoWired找不到这种泛型类

5.Mysql和Redis的数据不同步的问题如何解决?

方式一 直接清理Redis的缓存,重新查询数据库即可.
方式二 直接采用MQ订阅mysql binlog日志文件增量同步到redis中.
方式三 使用alibaba的canal框架

6.Redis的持久化机制?

大部分的缓存框架都会有基本功能淘汰策略,持久机制.
Redis的持久化的机制有两种: 
	AOF(增量):基于数据日志操作实现的持久化. 开启方式:redis.conf中 appendonly改为 yes
	AOF的三种同步方式:
		appendfsync always 每次有数据修改发生时都会写入AOF文件,能够数据不丢失,
		                   但是效率非常低.例1S1000个请求,就会显得低效
		appendfsync everysec 每秒钟同步一次,该策略为AOF的缺省(默认)策略(缺点:1秒内数据可能丢失)
		appendfsync no    从不同步,高效但是数据不会被持久化
	    建议最好使用everysec既能够保证数据的同步,效率还可以.
	RDB(默认,全量):采用定时持久化机制,但是服务器因为某种原因宕机可能会数据丢失.
	全量同步和增量同步区别:
	   全量:就是每天定时(避开高峰期)或者是采用一种周期的实现将数据拷贝另外一个地方.频率不是很大,但是可能会造     	
	       成数据的丢失.
	   增量:增量同步采用行为操作对数据的实现同步,频率非常高,对服务器同步的压力非常大,能保证数据不丢失.

7.RDB和AOF同步的区别?

1.RDB属于全量同步(定时同步)
  优点:同步效率非常高  缺点:数据可能会丢失
2.AOF属于增量同步 有点偏向实时
  优点:同步效率稍稍有些低,最多只会丢失1s中的数据
  平衡点:既要求效率高,数据不丢失,肯定使用AOFd everysec

8.Redis六种淘汰策略? 设置Redis 内存大小的限制,我们可以设置maxmemory 比如:maxmemory 300mb

noeviction:当内存使用达到阈值的时候,执行命令直接报错 
allkeys-lru:在所有的key中,优先移除最近未使用的key。(推荐)
volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。
allkeys-random:在所有的key中,随机移除某个key。
volatile-random:在设置了过期时间的键空间中,随机移除某个key。
volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。

9.Redis事务操作

1.Multi : 开启事务
2.EXEC  : 提交事务
3.Watch : 可以监听一个或者多个key,在提交事务之前是否有发生了变化,如果发生了变化就不会提交事务,
		  没有发生变化才可以提交事务.(版本号 ,乐观锁)
4.Discard : 取消提交事务 (注意:redis官方是没有提供回滚方法,只提供了取消事务)
在Redis中使用multi对key开启事务,其他的线程开始可以对该key执行set操作.
         (该key的value最终值为最后一个提交事务对此key赋的值)
Watch监听我们的key在提交事务之前是否有发生过变化,如果有发生过变化时无法提交数据的.

10.取消事务和回滚有什么区别呢?

1.mysql中开启事务,对该行数据上行锁  commit提交事务
      回滚:对事物取消和行锁都会撤销
  redis没有回滚,单纯取消事务(不提交事务) 不上锁

11.什么是分布式锁?

1.本地锁:在多个线程中,保证只有一个线程执行(线程安全的问题)
2.分布式锁:在分布式中,保证只有一个jvm执行(多个jvm线程安全问题)
如果我们服务器是集群的时候,定时任务可能会重复执行,可以采用分布式锁解决.

12.分布式锁实现方案:

1.基于数据库方式实现(low不用)
2.基于ZK方式实现,采用临时节点+事件通知
3.基于Redis方式实现, setNX方式

13.解决分布式锁的核心思路?

1.获取锁: 多个不同的jvm同时创建一个相同的标记(全局唯一的(Setnx命令,redis的key必须保证是唯一的))
		  ,只要谁能够创建成功,谁就能获取锁.
2.释放锁: (对我们的redis的key设置一个有效期,或者主动删除key),可以灵活自动释放该全局唯一的标记,
		  其他jvm重新进入到获取锁资源.
3.超时锁, 等待获取锁的超时时间  ,已经获取到锁,设置锁的有效期

14.redis主从复制原理过程?

1.需要在从redis服务器上配置slaveof 指向主redis服务器ip地址和端口号和密码.
2.从redis服务器和主redis服务器建立Socket长连接
3.采用全量和增量形式将数据同步给从Redis服务器
    全量:从Redis首次启动的时候(二进制执行dump文件) rdb
	增量:主Redis每次有新的set请求时候aof日志文件

15.redis主从复制有哪些缺陷?

如果主的节点宕机之后,可能会导致整个redis服务不能够实现写操作,需要我们人为重新修改新的主的操作.

16.什么是哨兵机制?

就是解决我们在主从复制中,选举问题.

17.Redis哨兵底层原理?

1.哨兵机制每隔10秒时间,只需要配置监听我们的主(Master)的Redis服务器,就可以采用递归的形式获取到
	  整个redis集群服务列表,原理就是info replication 
2.哨兵不建议单台,哨兵的集群数量建议和Redis服务数量一致.	
3.Redis哨兵机制底层是如何实现一个群体呢?多个哨兵都会同时执行监听到同一个master节点,订阅相同
	  通道(主题),有新的哨兵加入的时候都会将自己服务器的信息发送到主题中,随后相互实现建立长连接.
4.master节点如果宕机时候 ,如何实现选举策略?
	单个哨兵会向主master节点发送ping的命令,如果这时候master节点没有及时的响应的话,这时候单个哨兵
	会认为该master主观不可用状态;这时候单个哨兵会通知其他的哨兵去确认该master节点是否是宕机状态,
	如果有超过>=配置文件配置  认为宕机状态,就开始实现重新选举新的领导.

18.Redis安全相关内容

缓存穿透:缓存穿透是指使用指定key(不存在的key),频繁的高并发查询,导致缓存无法命中;
        每次的查询都会一直查询数据库 ,那么这时候对我们的数据库压力是非常大的.
	(例:根据id查信息,使用一个无效的id不停的高并发查询.就会绕过缓存,且数据库查不到数据也无法保存到redis)
	解决方案:1.接口实现api的限流 , 防御ddos攻击.接口频率限制 (网关实现黑名单)
		    2.从数据库和redis如果都查询不到数据情况下,将数据库的空值写入到缓存中,
			     加上短时间的有效期(只适合单个key)
			3.布隆过滤器

缓存击穿:
	热点key:经常使用到key
	在高并发的情况下.当一个热点key过期时,因为访问该key请求过多,多个请求同时发现改缓存key过期,
	这时候同时查询数据库,同时将数据库内容放入到我们的redis缓存中,对我们数据库压力非常大.
	解决方案: 1.使用分布式锁技术:多个请求同时只要谁能够获取到锁,谁就能够去查询数据库查询,
	              将数据查询的结果放入redis中,没有获取到锁的请求先等待;获取到锁的请求将数据写入
	              成功到redis中,通知没有获取锁的请求直接从redis获取数据即可.(适合服务器集群)
			  2.本地锁与分布式锁一样的;
			  3.软过期 ,对热点key设置无限有效期或者异步延长时间

缓存雪崩:
	缓存雪崩指的就是我们的redis服务器重启(没有持久化)或者是大量的key集中失效,
	   突然对我们的数据库压力非常大
	解决思路:过期时间随机或者是设置不一样的过期时间;	

19.传统的哨兵集群方式存在哪些缺陷?

1.redis的哨兵集群方式,每个节点都保存相同的同步数据,可能会存在冗余的数据;
  其次只能允许有一个主的节点;属于中心化集群;

20.Redis Cluster 从3.0开始是Redis官方推出一种去中心化的集群方式.采用hash槽分片的将数据存放到多个

不同的Redis中,从而可以去减少冗余的数据.	
核心原理:
   采用hash槽,预先分配16384个卡槽,并且将卡槽分配到具体Redis的节点,通过key进行crc16(key)%16384=卡槽
	可以根据卡槽存到具体Redis节点,注意一个卡槽可以存放多个不同的key.只有主的节点才会分配卡槽,
	从节点没有卡槽.
卡槽作用:
决定key存放具体的服务器位置,从而实现均摊存放数据.类似我们的数据库中具体的分表, 优点:动态实现扩容和缩容;		

相关推荐

B站收藏视频失效?mybili 收藏夹备份神器完整部署指南

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:羊刀仙很多B站用户都有过类似经历:自己精心收藏的视频突然“消失”,点开一看不是“已被删除”,就是“因UP主设置不可见”。而B站并不会主动通知...

中间件推荐初始化配置

Redis推荐初始化配置bind0.0.0.0protected-modeyesport6379tcp-backlog511timeout300tcp-keepalive300...

Redis中缓存穿透问题与解决方法

缓存穿透问题概述在Redis作为缓存使用时,缓存穿透是常见问题。正常查询流程是先从Redis缓存获取数据,若有则直接使用;若没有则去数据库查询,查到后存入缓存。但当请求的数据在缓存和数据库中都...

后端开发必看!Redis 哨兵机制如何保障系统高可用?

你是否曾在项目中遇到过Redis主服务器突然宕机,导致整个业务系统出现数据读取异常、响应延迟甚至服务中断的情况?面对这样的突发状况,作为互联网大厂的后端开发人员,如何快速恢复服务、保障系统的高可用...

Redis合集-大Key处理建议

以下是Redis大Key问题的全流程解决方案,涵盖检测、处理、优化及预防策略,结合代码示例和最佳实践:一、大Key的定义与风险1.大Key判定标准数据类型大Key阈值风险场景S...

深入解析跳跃表:Redis里的&quot;老六&quot;数据结构,专治各种不服

大家好,我是你们的码农段子手,今天要给大家讲一个Redis世界里最会"跳科目三"的数据结构——跳跃表(SkipList)。这货表面上是个青铜,实际上是个王者,连红黑树见了都要喊声大哥。...

Redis 中 AOF 持久化技术原理全解析,看完你就懂了!

你在使用Redis的过程中,有没有担心过数据丢失的问题?尤其是在服务器突然宕机、意外断电等情况发生时,那些还没来得及持久化的数据,是不是让你夜不能寐?别担心,Redis的AOF持久化技术就是...

Redis合集-必备的几款运维工具

Redis在应用Redis时,经常会面临的运维工作,包括Redis的运行状态监控,数据迁移,主从集群、切片集群的部署和运维。接下来,从这三个方面,介绍一些工具。先来学习下监控Redis实时...

别再纠结线程池大小 + 线程数量了,没有固定公式的!

我们在百度上能很轻易地搜索到以下线程池设置大小的理论:在一台服务器上我们按照以下设置CPU密集型的程序-核心数+1I/O密集型的程序-核心数*2你不会真的按照这个理论来设置线程池的...

网络编程—IO多路复用详解

假如你想了解IO多路复用,那本文或许可以帮助你本文的最大目的就是想要把select、epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别。基础知识IO多路复用涉及...

5分钟学会C/C++多线程编程进程和线程

前言对线程有基本的理解简单的C++面向过程编程能力创造单个简单的线程。创造单个带参数的线程。如何等待线程结束。创造多个线程,并使用互斥量来防止资源抢占。会使用之后,直接跳到“汇总”,复制模板来用就行...

尽情阅读,技术进阶,详解mmap的原理

1.一句话概括mmapmmap的作用,在应用这一层,是让你把文件的某一段,当作内存一样来访问。将文件映射到物理内存,将进程虚拟空间映射到那块内存。这样,进程不仅能像访问内存一样读写文件,多个进程...

C++11多线程知识点总结

一、多线程的基本概念1、进程与线程的区别和联系进程:进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程;线程:是运行中的实际的任务执行者。可以说,进程中包含了多...

微服务高可用的2个关键技巧,你一定用得上

概述上一篇文章讲了一个朋友公司使用SpringCloud架构遇到问题的一个真实案例,虽然不是什么大的技术问题,但如果对一些东西理解的不深刻,还真会犯一些错误。这篇文章我们来聊聊在微服务架构中,到底如...

Java线程间如何共享与传递数据

1、背景在日常SpringBoot应用或者Java应用开发中,使用多线程编程有很多好处,比如可以同时处理多个任务,提高程序的并发性;可以充分利用计算机的多核处理器,使得程序能够更好地利用计算机的资源,...

取消回复欢迎 发表评论: