集群基本概念

hash和一致性哈希,思路和mysql的分库分表是一致的。

分区不同实现方式

  • 客户端分区:客户端直接选择正确节点读写指定键。很多Redis客户实现了这种分区方式。
  • 代理辅助分区:是指我们的客户端通过Redis协议把请求发送给代理,而不是直接发送给真正的Redis实例服务器。这个代理会确保我们的请求根据配置分区策略发送到正确的Redis实例上,并返回给客户端。Redis和Memcached的代理都是用Twemproxy (译者注:这是twitter开源的一个代理框架)来实现代理服务分区的。
  • 查询路由:是指你可以把一个请求发送给一个随机的实例,这时实例会把该查询转发给正确的节点。通过客户端重定向(客户端的请求不用直接从一个实例转发到另一个实例,而是被重定向到正确的节点),Redis集群实现了一种混合查询路由。

查看全部


集群基本概念

hash和一致性哈希,思路和mysql的分库分表是一致的。

分区不同实现方式

  • 客户端分区:客户端直接选择正确节点读写指定键。很多Redis客户实现了这种分区方式。
  • 代理辅助分区:是指我们的客户端通过Redis协议把请求发送给代理,而不是直接发送给真正的Redis实例服务器。这个代理会确保我们的请求根据配置分区策略发送到正确的Redis实例上,并返回给客户端。Redis和Memcached的代理都是用Twemproxy (译者注:这是twitter开源的一个代理框架)来实现代理服务分区的。
  • 查询路由:是指你可以把一个请求发送给一个随机的实例,这时实例会把该查询转发给正确的节点。通过客户端重定向(客户端的请求不用直接从一个实例转发到另一个实例,而是被重定向到正确的节点),Redis集群实现了一种混合查询路由。

查看全部


快速插入大量数据

1 原生的命令

例如,如果我们需要生成一个10亿的`keyN -> ValueN’的大数据集,我们会创建一个如下的redis命令集的文件:

1
2
3
4
SET Key0 Value0
SET Key1 Value1
...
SET KeyN ValueN

一旦创建了这个文件,其余的就是让Redis尽可能快的执行。在以前我们会用如下的netcat命令执行:

1
(cat data.txt; sleep 10) | nc localhost 6379 > /dev/null

查看全部


Redis的内存回收策略

1、惰性删除

2、定时任务删除

3、内存不够一般就是报错、LRU、随机删除、过期LRU、过期随机删、早过期被删

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Redis删除过期的KEY的方式
//默认是慢模式
int totalTime = 0;
boolean expired = false;
do {
随机检查20个KEY
} while (超过25%的KEY过期 && 执行总时间 < 25ms)
if 执行总时间 > 25ms {
expired = true;
}

//如果慢模式判断超时了,启动快模式
do {
随机检查20个KEY
} while (超过25%的KEY过期 && 执行总时间 < 1ms && 2秒内只运行1次)

查看全部


总结:

1、修改一些参数阈值设置。

2、32位的redis可以节省指针,而且不影响RDB/AOF文件的恢复

3、字符串可以当作位使用。

4、hash会预留100个field,尽情用吧

5、减小key的长度 能用u表示,不用username

这个页面仍然在维护中。当你在使用redis的过程中遇到一些与内存相关的问题时,你需要关注下面的事情。

小的聚合类型数据的特殊编码处理

Redis2.2版本及以后,存储集合数据的时候会采用内存压缩技术,以使用更少的内存存储更多的数据。如Hashes,Lists,Sets和Sorted Sets,当这些集合中的所有数都小于一个给定的元素,并且集合中元素数量小于某个值时,存储的数据会被以一种非常节省内存的方式进行编码,使用这种编码理论上至少会节省10倍以上内存(平均节省5倍以上内存)。并且这种编码技术对用户和redis api透明。因为使用这种编码是用CPU换内存,所以我们提供了更改阈值的方法,只需在redis.conf里面进行修改即可.

1
2
3
4
5
6
7
hash-max-zipmap-entries 64 (2.6以上使用hash-max-ziplist-entries)
hash-max-zipmap-value 512 (2.6以上使用hash-max-ziplist-value)
list-max-ziplist-entries 512
list-max-ziplist-value 64
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
set-max-intset-entries 512

查看全部


1 Redis通信协议规范

Redis客户端和服务器端通信使用名为 RESP (REdis Serialization Protocol) 的协议。虽然这个协议是专门为Redis设计的,它也可以用在其它 client-server 通信模式的软件上。

RESP 是下面条件的折中:

  • 实现起来简单。
  • 解析速度快。
  • 有可读性。

RESP 能序列化不同的数据类型,例如整型(integers)、字符串(strings)、数组(arrays)。额外还有特殊的错误类型。请求从客户端以字符串数组的形式发送到redis服务器,这些字符串表示要执行的命令的参数。Redis用特定于命令的数据类型回复。

RESP 是二进制安全的,并且不需要处理从一个进程发到另外一个进程的批量数据,因为它使用前缀长度来传输批量数据。

注意:这里概述的协议仅用于客户机-服务器通信。Redis集群使用不同的二进制协议在节点之间交换消息。

查看全部


本文档提供的信息是有关Redis是如何应对不同POSIX系统下产生的信号异常,比如SIGTERM{.highlighter-rouge},SIGSEGV{.highlighter-rouge}等等。

本文档中的信息只适用于Redis2.6或更高版本

SIGTERM信号的处理

SIGTERM信号会让Redis安全的关闭。Redis收到信号时并不立即退出,而是开启一个定时任务,这个任务就类似执行一次SHUTDOWN命令的。 这个定时关闭任务会在当前执行命令终止后立即施行,因此通常有有0.1秒或更少时间延迟。

万一Server被一个耗时的LUA脚本阻塞,如果这个脚本可以被SCRIPT KILL命令终止,那么定时执行任务就会在脚本被终止后立即执行,否则直接执行。

这种情况下的Shutdown过程也会同时包含以下的操作:

  • 如果存在正在执行RDB文件保存或者AOF重写的子进程,子进程被终止。
  • 如果AOF功能是开启的,Redis会通过系统调用fsync将AOF缓冲区数据强制输出到硬盘。
  • 如果Redis配置了使用RDB文件进行持久化,那么此时就会进行同步保存。由于保存时同步的,那也就不需要额外的内存。
  • 如果Server是守护进程,PID文件会被移除。
  • 如果Unix域的Socket是可用的,它也会被移除。
  • Server退出,退出码为0.

万一RDB文件保存失败,Shutdown失败,Server则会继续运行以保证没有数据丢失。自从Redis2.6.11之后,Redis不会再次主动Shutdown,除非它接收到了另一个SIGTERM信号或者另外一个SHUTDOWN命令

查看全部


多大叫大key?

key-value value最大可以有512M

假设一个value是1M,单机每秒1000个请求,就是1G的流量

个人理解1500B算大?

string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。

反例:一个包含200万个元素的list。

非字符串的bigkey,不要使用del删除,使用hscan、sscan、zscan方式渐进式删除,同时要注意防止bigkey过期时间自动删除问题(例如一个200万的zset设置1小时过期,会触发del操作,造成阻塞,而且该操作不会不出现在慢查询中

大KEY:

单次网络请求延时增加

对集群不友好,造成了数据倾斜

删除大key或者自动过期的时候,由于单线程,停顿长

查看全部


通常来看,Redis开发和运维人员更加关注的是Redis本身的一些配置优化,例如AOF和RDB的配置优化、数据结构的配置优化等,但是对于操作系统是否需要针对Redis做一些配置优化不甚了解或者不太关心,然而事实证明一个良好的系统操作配置能够为Redis服务良好运行保驾护航。

众所周知Redis的作者对于Windows操作系统并不感冒,目前大部分公司都会将Web服务器、数据库服务器等部署在Linux操作系统上,Redis也不例外。所以接下来介绍Linux操作系统如何优化Redis,包含如下七个方面。

一. [内存分配控制]
二. [swappiness]
三. [Transparent Huge Pages]
四. [OOM killer]
五. [使用NTP]
六. [ulimit]
七. [TCP backlog]

一. 内存分配控制

1. vm.overcommit_memory

Redis在启动时可能会出现这样的日志:

1
2
# WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the 
command 'sysctl vm.overcommit_memory=1' for this to take effect.

在分析这个问题之前,首先要弄清楚什么是overcommit?Linux操作系统对大部分申请内存的请求都回复yes,以便能运行更多的程序。因为申请内存后,并不会马上使用内存,这种技术叫做overcommit。如果Redis在启动时有上面的日志,说明vm.overcommit_memory=0,Redis提示把它设置为1。

vm.overcommit_memory用来设置内存分配策略,它有三个可选值,如下表所示。

vm.overcommit_memory 含义
0 表示内核将检查是否有足够的可用内存。如果有足够的可用内存,内存申请通过,否则内存申请失败,并把错误返回给应用进程
1 表示内核允许超量使用内存直到用完为止
2 表示内核决不过量的(“never overcommit”)使用内存,即系统整个内存地址空间不能超过swap+50%的RAM值,50%是overcommit_ratio默认值,此参数同样支持修改

查看全部


1. 消息轨迹数据关键属性

Producer端 Consumer端 Broker端
生产实例信息 消费实例信息 消息的Topic
发送消息时间 投递时间,投递轮次 消息存储位置
消息是否发送成功 消息是否消费成功 消息的Key值
发送耗时 消费耗时 消息的Tag值

2. 支持消息轨迹集群部署

2.1 Broker端配置文件

这里贴出Broker端开启消息轨迹特性的properties配置文件内容:

查看全部