Redis学习笔记

1、 数据类型

  基本数据类型:

    String:一个 key 对应一个 value,redis的 string是二进制安全的(输入任何字节都能正确处理,不想C字符串不能包含空字符),可以包含任何数据,比如jpg图片或者序列化的对象。string 类型的值最大能存储 512MB。

    Hash:一个 key 对应一个 键值对,特别适合用于存储对象

    List:一个 key 对应一个 列表,列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。列表适合用来做粉丝列表,评论列表以及消息队列

    set:一个key对应一个set集合,set可以用来分布式系统去重,共同好友(set交集),并集,差集

    Sortedset:在set基础上加了一个score,按照score排序,又叫Zset,是有序的集合。适用于排行榜

  进阶数据类型:

    geo:地理位置系列,存储经纬度,可以计算两地之前的距离,以及返回指定半径内元素的个数,适用于附近的人

    HyperLogLog:HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的;缺点是有一定的误差

    pub/sub:Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道

二、使用问题

  缓存击穿:

    高并发情况下,大量请求查询同一个key值,当这个key值时效时,所有请求直接打在数据库上

    解决方案:可以设置热点key永不过期(定时任务)

  缓存穿透:

    有意或无意情况下,一直请求redis和数据库都不存在的key值,由于没有缓存,导致每次都会去访问数据库

    解决方案:1、根据业务实际情况设置参数校验,不在范围内的不处理2、缓存不存在的key值,设置较短的过期时间3、BloomFilter

  缓存雪崩:

    同一时间大规模的缓存失效,一般是缓存服务器宕机了。前者可以采取过期时间加一个随机值,后者需要考虑集群

三、主从

  Redis主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器又可以是其他从服务器的主服务器。

  SLAVEOF host port 命令,可以将当前服务器转变为指定服务器的从属服务器(slave server)——该命令可以实现从服务器,从服务器的主服务器切换,以及主从切换

  SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃

  主从全量同步步骤:

    1、从服务器连接主服务器,发送SYNC命令

    2、主服务器接收到SYNC命令后,开始执行BGSAVE命令生成RDB文件。并使用缓冲区记录此后执行的所有写命令;

    3、主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;

    4、从服务器收到快照文件后丢弃所有旧数据,载入收到的快照; 

    5、主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令; 

    6、从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;

  主从增量同步:
    Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。 增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

  主从部分同步:

    主服务器端为复制流维护一个内存缓冲区(in-memory backlog)。主从服务器都维护一个复制偏移量(replication offset)和master run id ,当连接断开时,从服务器会重  新连接上主服务器,然后请求继续复制,假如主从服务器的两个master run id相同,并且指定的偏移量在内存缓冲区中还有效,复制就会从上次中断的点开始继续。如果其中一个  条件不满足,就会进行完全重新同步(在2.8版本之前就是直接进行完全重新同步)。因为主运行id不保存在磁盘中,如果从服务器重启了的话就只能进行完全同步了。

四、哨兵

  Sentinel模式:主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此sentinel应运而生,sentinel中文含义为哨兵,顾名思义,它的作用就是监控redis集群的运行状况。主服务器宕掉之后切换,Raft的Leader选举。

  当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master

  当master重新启动后,它将不再是master而是做为slave接收新的master的同步数据

  sentinel因为也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群

  多sentinel配置的时候,sentinel之间也会自动监控

  当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中,不需要担心

  一个sentinel或sentinel集群可以管理多个主从Redis,多个sentinel也可以监控同一个redis

  sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也挂了

五、分布式集群

  当缓存数据量不断增加时,单机内存不够使用,需要把数据切分不同部分,分布到多台服务器上,可在客户端对数据进行分片。 

  Redis Cluster是分布式架构:即Redis Cluster中有多个节点,把16384个槽平均分配给节点进行管理,每个节点只能对自己负责的槽进行读写操作。

  由于每个节点之间都彼此通信,每个节点都知道另外节点负责管理的槽范围

  客户端访问任意节点时,对数据key按照CRC16规则进行hash运算,然后对运算结果对16383进行取作,如果余数在当前访问的节点管理的槽范围内,则直接返回对应的数据
如果不在当前节点负责管理的槽范围内,则会告诉客户端去哪个节点获取数据,由客户端去正确的节点获取数据

  虚拟槽分布方式中,由于每个节点管理一部分数据槽,数据保存到数据槽中。当节点扩容或者缩容时,对数据槽进行重新分配迁移即可,数据不会丢失。

六、持久化

  redis的持久化分为两种:

  RDB:全量。指定的时间间隔内生成数据集的时间点快照,出问题时可能丢失间隔时间内的部分数据。非常适用于灾难恢复。

    原理:fork一个进程,遍历hash table,利用copy on write,把整个db dump保存下来。save, shutdown, slave 命令会触发这个操作

  AOF:增量。把写操作指令,持续的写到一个类似日志文件里,AOF 的默认策略为每秒钟 fsync 一次。后台会对 AOF 文件进行重写(rewrite),避免文件过大

  Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。你甚至可以关闭持久化功能,让数据只在服务器运行时存在

七、过期策略

  1、定期删除:默认100ms就抽取设置了过期时间的kye,检查是否过期,过期了就删除

  2、惰性删除:查询的时候检查是否过期,过期了就删除,不返回

八、内存淘汰机制

  redis中当内存超过限制时,按照配置的策略,淘汰掉相应的key-value,使得内存可以继续留有足够的空间保存新的数据

  1、no-enviction:不淘汰,删除报错。默认。

  2、allkeys-lru:淘汰所有key中使用最少的key

  3、volatile-lru:淘汰设置了过期时间的key中使用最少的key

  4、volatile-ttl:淘汰设置里过期时间的key中的存活时间最短的(马上就要过期的)key

  5、volatile-random:随机淘汰设置了过期时间的key

  6、allkeys-random:随机淘汰

九、分布式锁

  setnx();//加锁

  expire();设置释放时间

  del();//解锁

  为了防止加锁之后系统宕掉:

  set(key,value,px,seconds,nx);//加锁,设置过期时间,原子操作

  可能在业务操作完成之前锁过期了,设置定时刷新锁的时间

  要想实现验证和删除过程的原子性,使用Lua脚本

  并发情况下,给获得锁的线程开一个守护线程

原文地址:https://www.cnblogs.com/yanghanwen/p/12055848.html