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 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存放具体的服务器位置,从而实现均摊存放数据.类似我们的数据库中具体的分表, 优点:动态实现扩容和缩容;		

你可能感兴趣的:(redis)