0%

业务场景中经常会有各种热key或大key的问题,如果未能及时处理,可能会导致服务性能下降、用户体验变差,甚至引发大面积故障。所以本文针对这两个问题进行讲解,提供发现/监控的方法以及处理的解决方案。

阅读全文 »

缓存穿透

缓存系统,一般流程都是按照key去查询缓存,如果不存在对应的value,就去后端系统(例如:持久层数据库)查找。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力,这就叫做缓存穿透。

阅读全文 »

Sentinel(哨岗、哨兵)是Redis的高可用性(high availability)解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

Redis的Sentinel系统可以用来管理多个Redis服务器,该系统可以执行以下四个任务:

监控:不断检查主服务器和从服务器是否正常运行。
通知:当被监控的某个redis服务器出现问题,Sentinel通过API脚本向管理员或者其他应用程序发出通知。
自动故障转移:当主节点不能正常工作时,Sentinel会开始一次自动的故障转移操作,它会将与失效主节点是主从关系的其中一个从节点升级为新的主节点,并且将其他的从节点指向新的主节点,这样人工干预就可以免了。
配置提供者:在Redis Sentinel模式下,客户端应用在初始化时连接的是Sentinel节点集合,从中获取主节点的信息。

阅读全文 »

Redis是内存数据库,它将自己的数据库状态储存在内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见。 为了解决这个问题,Redis提供了RDB持久化功能,这个功能可以将Redis在内存中的数据库状态保存到磁盘里面,避免数据意外丢失。

通过持久化可以减少服务器重启后数据的丢失,但是当服务器出现故障时,会导致缓存不可用,因此这时就需要多台服务器同时服务,从而避免单台服务器故障引起的服务不可用问题,同时带来的问题就是如何保持多台服务器数据一致,也就是本文要介绍的第二个主题,主从复制。

阅读全文 »

LockSupport用来创建锁和其他同步类的基本线程阻塞原语。简而言之,当调用LockSupport.park时,表示当前线程将会等待,直至获得许可,当调用LockSupport.unpark时,必须把等待获得许可的线程作为参数进行传递,好让此线程继续运行。

阅读全文 »

过期时间的基本操作

Redis有四个不同的命令可以用于设置键的生存时间(键可以存在 多久)或过期时间(键什么时候会被删除):

  • EXPIRE <key> <ttl>命令用于将键key的生存时间设置为ttl秒。
  • PEXPIRE <key> <ttl>命令用于将键key的生存时间设置为ttl毫秒。
  • EXPIREAT <key> <timestamp>命令用于将键key的过期时间设置为 timestamp所指定的秒数时间戳。
  • PEXPIREAT <key> <timestamp>命令用于将键key的过期时间设置为 timestamp所指定的毫秒数时间戳。

虽然有多种不同单位和不同形式的设置命令,但实际上EXPIRE、 PEXPIRE、EXPIREAT三个命令都是使用PEXPIREAT命令来实现的: 无论客户端执行的是以上四个命令中的哪一个,经过转换之后,最终的执行效果都和执行PEXPIREAT命令一样。

设置过期时间

阅读全文 »

本篇文章主要针对redis常见的对象以及其对应的存储结构进行整理,前面已经写了字符串和字典的存储结构。下面将先对其它存在的存储结构进行简介,然后对每一种对象使用到的存储结构进行整理并说明在什么情况下会发生变化。

阅读全文 »

字典,又称为符号表(symbol table)、关联数组(associative array)或映射(map),是一种用于保存键值对(key-value pair)的抽 象数据结构。 在字典中,一个键(key)可以和一个值(value)进行关联(或者 说将键映射为值),这些关联的键和值就称为键值对。 字典中的每个键都是独一无二的,程序可以在字典中根据键查找与 之关联的值,或者通过键来更新值,又或者根据键来删除整个键值对, 等等。

字典经常作为一种数据结构内置在很多高级编程语言里面,但 Redis所使用的C语言并没有内置这种数据结构,因此Redis构建了自己 的字典实现。 字典在Redis中的应用相当广泛,比如Redis的数据库就是使用字典 来作为底层实现的,对数据库的增、删、查、改操作也是构建在对字典 的操作之上的。

阅读全文 »

字符串在redis中是最为常用的类型,本篇文章主要是针对redis是如何存储字符串的底层结构进行说明,同时在最后说明使用这种结构的优点。

Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符 数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串 (simple dynamic string,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。

阅读全文 »