Redis相关

Posted 买糖买板栗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis相关相关的知识,希望对你有一定的参考价值。

1分布式锁的几种实现

(1)zookeeper分布式锁,基于自增节点
(2)redis分布式锁,基于setnx命令;

2 分布式锁的基本功能

(1)同一时刻只能存在一个锁
(2)需要解决意外死锁问题,也就是锁能超时自动释放;
(3)支持主动释放锁
(3)分布式锁解决什么问题:多进程并发执行任务时,需要保证任务的有序性或者唯一性

3 缓存被“击穿”问题

(1)概念:缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一 般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
(2)如何解决:业界比较常用的做法,是使用mutex(互斥)。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。类似下面的代码:

public String get(key) {
     String value = redis.get(key);      
     if (value == null) { //代表缓存值过期
         //设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load db
         if (redis.setnx(key_mutex, 1, 3 * 60) == 1) {  //代表设置成功
              value = db.get(key);
              redis.set(key, value, expire_secs);
              redis.del(key_mutex);
         } else {//代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可
              sleep(50);
              get(key);  //重试
         }
     } else {              
        return value;      
     }
 }

4 Redis内存淘汰策略

redis 内存数据集大小上升到一定大小的时候,就会进行数据淘汰策略。
通过配置redis.conf中的maxmemory(config set maxmemory 100000:设置最大内存)这个值来开启内存淘汰功能(maxmemory为0的时候表示我们对Redis的内存使用没有限制)。
通过配置redis.conf中的maxmemory-policy设置淘汰策略设置:策略类型:
 1、最近最少使用(设置、不设置了过期时间的key数据集)
 2、将要过期的数据(设置、不设置设置了过期时间的key数据集)
 3、任意选择数据(设置、不设置了过期时间的key数据集)
 4、不可写入任何数据集(也不删除)

5 Redis数据持久化方案

RDB:是Redis默认的持久化方式。按照一定的时间周期策略把内存的数据以快照的形式保存到硬盘的二进制文件。即Snapshot快照存储,对应产生的数据文件为dump.rdb,通过配置文件中的save()参数来定义快照的周期。

AOF:Redis会将每一个收到的写命令都通过Write函数追加到文件最后。当Redis重启是会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。

6 Redis高可用设计:主服务器可能存在单点故障,加入Sentinel(哨兵)

7 Redis为什么使用单进程单线程方式也这么快:

Redis快的主要原因是:
   1、完全基于内存;
   2、数据结构简单,对数据操作也简单;
   3、使用多路 I/O 复用模型;(nio的Selector也是基于select/poll模型实现,是基于IO复用技术的非阻塞IO)

8 redis的setnx锁到了超时时间失效,并发死锁问题

redis的setnx锁到了超时时间失效,并发的问题

9 Redis如何做数据分片

Redis集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现:一个Redis集群包含16384个哈希槽(hash slot),数据库中的每个键都属于这16384个哈希槽的其中一个,集群使用公式CRC16(key)%16384来计算键key属于哪个槽,其中CRC16(key)语句用于计算键key的CRC16校验和。

节点A负责处理0号至5500号哈希槽。
节点B负责处理5501号至11000号哈希槽。
节点C负责处理11001号至16384号哈希槽。
而对于mysql来说,一般情况下,如果某个表的数据有明显的时间特征,比如订单、交易记录等,则他们通常比较合适用时间范围分片,因为具有时效性的数据,我们往往关注其近期的数据,查询条件中往往带有时间字段进行过滤,比较好的方案是,当前活跃的数据,采用跨度比较短的时间段进行分片,而历史性的数据,则采用比较长的跨度存储。

10 epoll为啥比select/poll好

Redis IO多路复用技术以及epoll实现原理

11 sentinel实现redis切换的原理那就是

sentinel心跳检测到主节点出现异常后,通过修改redis.conf配置文件的形式实现redis主从节点之间的故障切换

12 主从复制原理

Redis主从复制原理总结

全量同步
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下: 
-  从服务器连接主服务器,发送SYNC命令; 
-  主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令; 
-  主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令; 
-  从服务器收到快照文件后丢弃所有旧数据,载入收到的快照; 
-  主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令; 
-  从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;

增量同步
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。 
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
Redis主从同步策略
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。

当主服务器不进行持久化时复制的安全性

在进行主从复制设置时,强烈建议在主服务器上开启持久化,当不能这么做时,比如考虑到延迟的问题,应该将实例配置为避免自动重启。为什么不持久化的主服务器自动重启非常危险呢?为了更好的理解这个问题,看下面这个失败的例子,其中主服务器和从服务器中数据库都被删除了。设置节点A为主服务器,关闭持久化,节点B和C从节点A复制数据。这时出现了一个崩溃,但Redis具有自动重启系统,重启了进程,因为关闭了持久化,节点重启后只有一个空的数据集。节点B和C从节点A进行复制,现在节点A是空的,所以节点B和C上的复制数据也会被删除。当在高可用系统中使用Redis Sentinel,关闭了主服务器的持久化,并且允许自动重启,这种情况是很危险的。比如主服务器可能在很短的时间就完成了重启,以至于Sentinel都无法检测到这次失败,那么上面说的这种失败的情况就发生了。如果数据比较重要,并且在使用主从复制时关闭了主服务器持久化功能的场景中,都应该禁止实例自动重启。

以上是关于Redis相关的主要内容,如果未能解决你的问题,请参考以下文章

Redis学习之列表类型详解

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段

从零开始配置vim(27)——代码片段

如何利用redis来进行分布式集群系统的限流设计

jedis连接redis