Redis学习知识点

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.confappendonly改为 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中使用multikey开启事务,其他的线程开始可以对该key执行set操作.          (该keyvalue最终值为最后一个提交事务对此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存放具体的服务器位置,从而实现均摊存放数据.类似我们的数据库中具体的分表, 优点:动态实现扩容和缩容;		

您可能还会对下面的文章感兴趣: