邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

关于redis pipeline
=====为什么需要 pipeline ?=====
Redis 的工作过程是基于 请求/响应 模式的。正常情况下,客户端发送一个命令,等待 Redis 应答;Redis 接收到命令,处理后应答。请求发出到响应的时间叫做往返时间,即 RTT(Round Time Trip)。在这种情况下,如果需要执行大量的命令,就需要等待上一条命令应答后再执行。这中间不仅仅多了许多次 RTT,而且还频繁的调用系统 IO,发送网络请求。为了提升效率,pipeline 出现了,它允许客户端可以一次发送多条命令,而不等待上一条命令执行的结果。

=====实现思路=====
客户端首先将执行的命令写入到缓冲区中,最后再一次性发送 Redis。但是有一种情况就是,缓冲区的大小是有限制的:如果命令数据太大,可能会有多次发送的过程,但是仍不会处理 Redis 的应答。

=====实现原理=====
要支持 pipeline,既要服务端的支持,也要客户端支持。对于服务端来说,所需要的是能够处理一个客户端通过同一个 TCP 连接发来的多个命令。可以理解为,这里将多个命令切分,和处理单个命令一样。对于客户端,则是要将多个命令缓存起来,缓冲区满了就发送,然后再写缓冲,最后才处理 Redis 的应答。

=====Redis pipeline 的参考资料=====
https://redis.io/topics/pipelining

=====在php中使用Redis pipeline=====
<?php
 //实例化redis
$redis = new Redis();
//连接
$redis->connect('127.0.0.1', 6379);
$redis->pipeline();//开启管道
if(!$redis){
    throw new Exception('redis连接失败!',1);
}
$key = "pipeline_test";
$len = 200000;
$succ = 0;
for($i=0;$i<$len;$i++){
    $res = $redis->hset($key,"test_".$i,1);
    if($res){
        $succ ++;
    }
}
$redis->exec();

=====总结:Redis pipeline 的特性以及使用时需要注意的地方=====
pipeline 减少了 RTT,也减少了IO调用次数(IO 调用涉及到用户态到内核态之间的切换)
如果某一次需要执行大量的命令,不能放到一个 pipeline 中执行。数据量过多,网络传输延迟会增加,且会消耗 Redis 大量的内存。应该将大量的命令切分为多个 pipeline 分别执行。

redis底层数据结构总结
redis有五种对象的类型

REDIS_STRING  字符串对象
REDIS_LIST 列表对象
REDIS_HASH 哈希对象
REDIS_SET 集合对象
REDIS_ZSET 有序集合对象


底层数据结构共有八种
编码常量 编码对应的底层数据结构
1、REDIS_ENCODING_INT long类型的整数
2、REDIS_ENCODING_EMBSTR embstr编码的简单动态字符串
3、REDIS_ENCODING_RAW 简单动态字符串
4、REDIS_ENCODING_HT 字典
5、REDIS_ENCODING_LINKEDLIST 双端链表
6、REDIS_ENCODING_ZIPLIST 压缩列表
7、REDIS_ENCODING_INTSET 整数集合
8、REDIS_ENCODING_SKIPLIST 跳跃表和字典


1.字符串对象
编码可以为 int、embstr或者raw。
如果一个字符串的内容可以转换为long,那么该字符串就会被转换成为long类型,对象的ptr就会指向该long,并且对象类型也用int类型表示。
普通的字符串有两种,embstr和raw。embstr应该是Redis3.0新增的数据结构,在2.8中是没有的。如果字符串对象的长度小于39字节,就用embstr对象。否则用传统的raw对象。

2.列表对象
编码可以是ziplist或者linkedlist。
ziplist是一种压缩链表,它的好处是更能节省内存空间,因为它所存储的内容都是在连续的内存区域当中的。当列表对象元素不大,每个元素也不大的时候,就采用ziplist存储。但当数据量过大时就ziplist就不是那么好用了。因为为了保证他存储内容在内存中的连续性,插入的复杂度是O(N),即每次插入都会重新进行realloc。
linkedlist是一种双向链表。它的结构比较简单,节点中存放pre和next两个指针,还有节点相关的信息。当每增加一个node的时候,就需要重新malloc一块内存。

当列表对象可以同时满足以下两个条件时, 列表对象使用 ziplist 编码:
列表对象保存的所有字符串元素的长度都小于 64 字节;
列表对象保存的元素数量小于 512 个;
不能满足这两个条件的列表对象需要使用 linkedlist 编码。
ps:
因为压缩列表比双端链表更节约内存, 并且在元素数量较少时, 在内存中以连续块方式保存的压缩列表比起双端链表可以更快被载入到缓存中;
随着列表对象包含的元素越来越多, 使用压缩列表来保存元素的优势逐渐消失时, 对象就会将底层实现从压缩列表转向功能更强、也更适合保存大量元素的双端链表上面


3.哈希对象
编码可以是ziplist或者hashtable。
ziplist中的哈希对象是按照key1,value1,key2,value2这样的顺序存放来存储的。当对象数目不多且内容不大时,这种方式效率是很高的。
hashtable的是由dict这个结构来实现的,dict是一个字典,其中的指针dicht ht[2] 指向了两个哈希表。dicht[0]是用于真正存放数据,dicht[1]一般在哈希表元素过多进行rehash的时候用于中转数据。
dictht中的table用语真正存放元素了,每个key/value对用一个dictEntry表示,放在dictEntry数组中


4.集合对象
编码可以是intset或者hashtable。
intset是一个整数集合,里面存的为某种同一类型的整数,支持如下三种长度的整数:
#define INTSET_ENC_INT16 (sizeof(int16_t))  
#define INTSET_ENC_INT32 (sizeof(int32_t))  
#define INTSET_ENC_INT64 (sizeof(int64_t))  
intset是一个有序集合,查找元素的复杂度为O(logN),但插入时不一定为O(logN),因为有可能涉及到升级操作。比如当集合里全是int16_t型的整数,这时要插入一个int32_t,那么为了维持集合中数据类型的一致,那么所有的数据都会被转换成int32_t类型,涉及到内存的重新分配,这时插入的复杂度就为O(N)了。是intset不支持降级操作。

当集合对象可以同时满足以下两个条件时, 对象使用 intset 编码:
集合对象保存的所有元素都是整数值;
集合对象保存的元素数量不超过 512 个;
不能满足这两个条件的集合对象需要使用 hashtable 编码。
ps:
第二个条件的上限值是可以修改的, 具体请看配置文件中关于 set-max-intset-entries 选项的说明。


5.有序集合对象
有序集合的编码可能两种,一种是ziplist,另一种是skiplist与dict的结合。
ziplist作为集合和作为哈希对象是一样的,member和score顺序存放。按照score从小到大顺序排列。
skiplist是一种跳跃表,它实现了有序集合中的快速查找,在大多数情况下它的速度都可以和平衡树差不多。但它的实现比较简单,可以作为平衡树的替代品。
当有序集合对象可以同时满足以下两个条件时, 对象使用 ziplist 编码:
有序集合保存的元素数量小于 128 个;
有序集合保存的所有元素成员的长度都小于 64 字节;
不能满足以上两个条件的有序集合对象将使用 skiplist 编码。
ps:
以上两个条件的上限值是可以修改的, 具体请看配置文件中关于 zset-max-ziplist-entries 选项和 zset-max-ziplist-value 选项的说明。
php使用redis替换文件存储session(session_set_save_handler)
<?php
class MySessionHandler implements SessionHandlerInterface
{
    private $redis;
    private $sessionsavepath;
    private $sessionname;
    public function __construct()
    {
        $this->redis = new Redis();
        $this->redis->connect('127.0.0.1',6379);
    }
    public function close()
    {
        return true;
    }
    public function destroy($session_id)
    {
        if($this->redis->delete($session_id)){
            return true;
        }
        return false;
    }
    public function gc($maxlifetime)
    {
        return true;
    }
    public function open($sessionsavepath, $name)
    {
        return true;
    }
    public function read($session_id)
    {
        if($value = $this->redis->get($session_id)){
            return $value;
        }else{
            return false;
        }
    }
    public function write($session_id, $session_data)
    {
        if($this->redis->set($session_id,$session_data,60)){
            return true;
        }else{
            return false;
        }
    }

}

$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();

//$_SESSION['sess_name'] = 'xd';
var_dump($_SESSION);
redis查看当前redis-server启动使用的配置文件

redis查看当前redis-server启动使用的配置文件


redis-cli info | grep config 

windows下把redis加入服务

加入服务,开机自启动
redis-server.exe --service-install redis.windows.conf

启动
redis-server.exe --service-start
停止
redis-server.exe --service-stop
卸载
redis-server.exe --service-uninstall

安装多个实例
redis-server.exe --service-install –service-name redisService1 –port 10001
redis-server.exe --service-start –service-name redisService1
redis-server.exe --service-install –service-name redisService2 –port 10002
redis-server.exe --service-start –service-name redisService2
redis-server.exe --service-install –service-name redisService3 –port 10003
redis-server.exe --service-start –service-name redisService3

关于redis 的排序
redis的sort命令可以对列表键、集合键或者有序集合键的值进行排序。

SORT命令的实现
SORT <key>
SORT 命令的排序操作由快速排序算法实现。
例子
rpush numbers 5 3 4 1 2
lrange numbers 0 -1 //无排序
sort numbers  //排序 正序

ALPHA选择的实现
SORT <key> ALPHA
例子
sadd alphabet a b c d e f g
smembers alphabet //无排序
sort alphabet ALPHA//排序

ASC选项和DESC选项的实现
SORT <key> [ASC|DESC]

BY选项的实现
BY选项默认假设权重键保存的值为数字值,如果权重键保存的是字符串的话,那么就需要在使用BY选项的同时,配合使用ALPHA选项。
zadd test-result 3.0 jack 3.5 peter 4.0 tom
zrange test-result 0 -1
mset peter_number 1 tom_number 2 jack_number 3
sort test-result BY *_number

LIMIT选项的实现
通过limit选项,可以让sort命令只返回一部分以及排序的元素。
limit选项的格式为 LIMIT <offset> <count>
<offset> 参数表示要跳过的已经排序的元素数量
<count> 参数表示跳过给定数量的已排序元素之后,要返回的已排序元素数量。

GET选项的实现
通过使用get选项,我们可以让sort命令在对键进行排序之后,根据被排序的元素,以及get选项所指定的模式,查找并返回某些键的值
例子
sadd students "peter" "jack" "tom" //
set peter-name "peter white"
set jack-name "jack snow"
set tom-name "tom smith"
sort students ALPHA GET *_name //
返回结果
1)"jack snow"
2)"peter white"
3)"tom smith"

SORTE 选项的实现
通过sorte选项,我们可以将排序结果保存在指定的键里面,并在需要时重用这个排序结果。
例子
sort students ALPHA sorte sorted_students
注意:如果sorted_students这个键存在,则会被删除,然后重新设置sorted_students的空白键


多个选项的执行顺序
1.排序(命令会使用ALPHA、[ASC|DESC]、BY选项)
2.限制(limit)
3.获取外部键(get选项)
4.保存排序结果集(sorte选项 )
5.向客户端返回排序结果集

选择的摆放顺序
除了 GET 选项之外, 调整选项的摆放位置不会影响 SORT 命令的排序结果。

内容来自:<redis设计与实现>这本书


关于redis的事务
redis的事务

实现
redis> MULTI
OK
redis> SET name "xingdong"
QUEUED
redis> GET name
QUEUED
redis> SET author 'Action'
QUEUED
redis> GET author
QUEUED
redis> EXEC
1) OK
2) "xingdong"
3) OK
4) "Action"

ps:事务队列以先进先出的方法保存入队的命令。

watch命令监视数据库键
实现
redis> watch name author
OK
带有 WATCH 命令的事务会将客户端和被监视的键在数据库的 watched_keys 字典中进行关联, 当键被修改时, 程序会将所有监视被修改键的客户端的 REDIS_DIRTY_CAS 标志打开。
只有在客户端的 REDIS_DIRTY_CAS 标志未被打开时, 服务器才会执行客户端提交的事务, 否则的话, 服务器将拒绝执行客户端提交的事务。

判断事务是否安全
判断事务是否安全,服务器会会根据这个客户端是否打开了REDIS_DIRTY_CAS标识来决定是否执行事务


事务的ACID性质
1.原子性
对于redis的事务功能来说,事务队列中的命令要么就是全部执行,要么就是一个都不执行。
redis的事务和传统的关系型数据库事务的最大区别在于,Redis不支持事务回滚机制。即使事务队列中的某个命令在执行期间出现了错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止。
2.一致性
事务具有一致性指的是,如果数据库在执行事务之前是一致的,那么在事务执行之后,无论事务是否执行成功,数据库也应该仍然是一致的。
a.入队错误
如果一个事务在入队命令的过程中,出现了命令不存在,或者命令的格式不正确等情况,那么redis将拒绝执行这个事务。
ps:redis2.6.5以前的入队错误处理,这种情况是被忽略的。
例子:
MUTI
set msg 'hello'
xingdong// ****
get msg
EXEC
此时服务器会拒绝执行入队过程中出现的事务。

b.执行错误
执行过程中发生的错误都是一些不能再入队时被服务器发现的错误,这些错误只会在命令实现执行时被触发。
即使在事务的过程中发生了错误,服务器也不会中断事务的执行,它会继续执行事务中余下的命令,并且已经执行的命令不会被出错的命令影响。
例子
set msg 'hello'
MULTI
sadd fruit 'apple' 'banana' 'cherry'
rpush msg 'see you' 'bye' //********
sadd language 'php' 'python'
EXEC
这里的出错命令不会对数据库做任何修改,但不会对事务的一致性产生认识影响。


c.隔离性
事务的隔离性指的是,即使数据库中有多个事务并发执行,各个事务之前也不会互相影响,并且在并发状态下执行的事务和串行执行的事务产生的结果完全相同。
因为redis是使用单线程的方式来执行事务(以及事务队列中的命令),并且服务器保证,在执行事务期间不会对事务进行中断,因此,redis 的事务总是以串行的方式运行的,并且事务也总是具有隔离性的。

d.耐久性
redis的耐久性
当服务器运行在AOF持久化模式下,并且appendfsync选项的值为always时,程序总会在执行命令之后调用同步sync函数,将命令数据真正的保存到硬盘里面,只有这种配置下的事务具有耐久性的。(并且no-appendfsync-on-rewrite配置是关闭的)

下面这种做法可以保证事务的耐久性,不过效果太低,不具有实用性。
redis> MULTI
OK
redis> SET name "xingdong"
QUEUED
redis> SAVE
QUEUED
redis> EXEC
1) OK
2) OK


内容来自:<redis设计与实现>这本书


redis3.0.6配置文件redis.conf参数详解
#是否以后台进程运行
daemonize yes

#指定后台进程的pid文件写入位置
pidfile /var/run/redis.pid

#监听端口,默认为6379
port 6379

#在高并发的环境中,为避免慢客户端的连接问题,需要设置一个高速后台日志
tcp-backlog 511

#只接受以下绑定的IP请求
# bind 192.168.1.100 10.0.0.1
bind 127.0.0.1

#设置unix套接字,默认为空,及不通过unix套接字来监听
# unixsocket /tmp/redis.sock
# unixsocketperm 700

#客户端空闲多长时间,关闭链接。0表示不关闭
timeout 0

# TCP keepalive.
# 如果是非零值,当失去链接时,会使用SO_KEEPALIVE发送TCP ACKs 到客户端。
# 这个参数有两个作用:
# 1.检测断点。
# 2.从网络中间设备来看,就是保持链接
# 在Linux上,设定的时间就是发送ACKs的周期。
# 注意:达到双倍的设定时间才会关闭链接。在其他内核上,周期依赖于内核设置。
# 一个比较合理的值为60s
tcp-keepalive 0

# 指定日志级别,以下记录信息依次递减
# debug用于开发/测试
# verbose没debug那么详细
# notice适用于生产线# warning只记录非常重要的信息
loglevel notice

#日志文件名称,如果为stdout则输出到标准输出端,如果是以后台进程运行则不产生日志
logfile ""

# 要想启用系统日志记录器,设置一下选项为yes
# syslog-enabled no

# 指明syslog身份
# syslog-ident redis

# 指明syslog设备。必须是一个用户或者是local0 ~ local7之一
# syslog-facility local0

#设置数据库数目,第一个数据库编号为:0
databases 16

##############快照#################

#在什么条件下保存数据库到磁盘,条件可以有很多个,满足任何一个条件都会精心快照
#在900秒之内有一次key的变化
save 900 1
#在300秒之内,有10个key的变化
save 300 10
#在60秒之内有10000个key变化
save 60 10000

#当持久化失败的时候,是否继续提供服务
stop-writes-on-bgsave-error yes

#当写入磁盘时,是否使用LZF算法压缩数据,默认为yes
rdbcompression yes

#是否添加CRC64校验到每个文件末尾--花费时间保证安全
rdbchecksum yes

#磁盘上数据库的保存名称
dbfilename dump.rdb

# Redis工作目录,以上数据库保存文件和AOF日志都会写入此目录
dir ./

##############同步#################

#主从复制,当本机是slave时配置
# slaveof <masterip> <masterport>

#当主机需要密码验证时候配置
# masterauth <master-password>

# 当slave和master丢失链接,或正处于同步过程中。是否响应客户端请求
# 设置为yes表示响应
# 设置为no,直接返回"SYNC with master in progress"(正在和主服务器同步中)
slave-serve-stale-data yes

# 设置slave是否为只读。
# 注意:即使slave设置为只读,也不能令其暴露在不受信任的网络环境中
slave-read-only yes

#无硬盘复制功能
repl-diskless-sync no

#等待多个slave一起来请求之间的间隔时间
repl-diskless-sync-delay 5

# 设置slave给master发送ping的时间间隔
# repl-ping-slave-period 10

# 设置数据传输I/O,主机数据、ping响应超时时间,默认60s
# 这个时间一定要比repl-ping-slave-period大,否则会不断检测到超时
# repl-timeout 60

# 是否在SYNC后slave socket上禁用TCP_NODELAY?
# 如果你设置为yes,Redis会使用少量TCP报文和少量带宽发送数据给slave。
# 但是这样会在slave端出现延迟。如果使用Linux内核的默认设置,大概40毫秒。
# 如果你设置为no,那么在slave端研究就会减少但是同步带宽要增加。
# 默认我们是为低延迟优化的。
# 但是如果流量特别大或者主从服务器相距比较远,设置为yes比较合理。
repl-disable-tcp-nodelay no

# 设置复制的后台日志大小。
# 复制的后台日志越大, slave 断开连接及后来可能执行部分复制花的时间就越长。
# 后台日志在至少有一个 slave 连接时,仅仅分配一次。
# repl-backlog-size 1mb

# 在 master 不再连接 slave 后,后台日志将被释放。下面的配置定义从最后一个 slave 断开连接后需要释放的时间(秒)。
# 0 意味着从不释放后台日志
# repl-backlog-ttl 3600

# 设置slave优先级,默认为100
# 当主服务器不能正确工作的时候,数字低的首先被提升为主服务器,但是0是禁用选择
slave-priority 100

# 如果少于 N 个 slave 连接,且延迟时间 <=M 秒,则 master 可配置停止接受写操作。
# 例如需要至少 3 个 slave 连接,且延迟 <=10 秒的配置:
# min-slaves-to-write 3
# min-slaves-max-lag 10
# 设置 0 为禁用
# 默认 min-slaves-to-write 为 0 (禁用), min-slaves-max-lag 为 10

##############安全#################

# 设置客户端连接密码,因为Redis响应速度可以达到每秒100w次,所以密码要特别复杂
requirepass 1413

# 命令重新命名,或者禁用。
# 重命名命令为空字符串可以禁用一些危险命令比如:FLUSHALL删除所有数据
# 需要注意的是,写入AOF文件或传送给slave的命令别名也许会引起一些问题
# rename-command CONFIG ""

##############限制#################

# 设置最多链接客户端数量,默认为10000。
# 实际可以接受的请求数目为设置值减去32,这32是Redis为内部文件描述符保留的
# maxclients 10000

# 设置最多链接客户端数量,默认为10000。
# 实际可以接受的请求数目为设置值减去32,这32是Redis为内部文件描述符保留的
# maxclients 10000
# 设置最大使用内存数量,在把Redis当作LRU缓存时特别有用。
# 设置的值要比系统能使用的值要小
# 因为当启用删除算法时,slave输出缓存也要占用内存
# maxmemory <bytes>

#达到最大内存限制时,使用何种删除算法
# volatile-lru  使用LRU算法移除带有过期标致的key
# allkeys-lru -> 使用LRU算法移除任何key
# volatile-random -> 随机移除一个带有过期标致的key
# allkeys-random ->  随机移除一个key
# volatile-ttl -> 移除最近要过期的key
# noeviction -> 不删除key,当有写请求时,返回错误
#默认设置为volatile-lru
# maxmemory-policy noeviction

# LRU和最小TTL算法没有精确的实现
# 为了节省内存只在一个样本范围内选择一个最近最少使用的key,可以设置这个样本大小
# maxmemory-samples 5

##############AO模式#################

# AOF和RDB持久化可以同时启用
# Redis启动时候会读取AOF文件,AOF文件有更好的持久化保证
appendonly no

# AOF的保存名称,默认为appendonly.aof
appendfilename "appendonly.aof"

# 设置何时写入追加日志,又三种模式
# no:表示由操作系统决定何时写入。性能最好,但可靠性最低
# everysec:表示每秒执行一次写入。折中方案,推荐
# always:表示每次都写入磁盘。性能最差,比上面的安全一些
# appendfsync always
appendfsync everysec
# appendfsync no

# 当AOF同步策略设定为alway或everysec
# 当后台存储进程(后台存储或者AOF日志后台写入)会产生很多磁盘开销
# 某些Linux配置会使Redis因为fsync()调用产生阻塞很久
# 现在还没有修复补丁,甚至使用不同线程进行fsync都会阻塞我们的同步write(2)调用。
# 为了缓解这个问题,使用以下选项在一个BGSAVE或BGREWRITEAOF运行的时候
# 可以阻止fsync()在主程序中被调用,
no-appendfsync-on-rewrite no

# AOF自动重写(合并命令,减少日志大小)
# 当AOF日志大小增加到一个特定比率,Redis调用BGREWRITEAOF自动重写日志文件
# 原理:Redis 会记录上次重写后AOF文件的文件大小。
# 如果刚启动,则记录启动时AOF大小
# 这个基本大小会用来和当前大小比较。如果当前大小比特定比率大,就会触发重写。
# 你也需要指定一个AOF需要被重写的最小值,这样会避免达到了比率。
# 但是AOF文件还很小的情况下重写AOF文件。
# 设置为0禁用自动重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

#redis在启动时可以加载被截断的AOF文件,而不需要先执行 redis-check-aof 工具
aof-load-truncated yes

##############LUA脚本#################

# Lua脚本的最大执行时间,单位毫秒
# 超时后会报错,并且计入日志
# 当一个脚本运行时间超过了最大执行时间
# 只有SCRIPT KILL和 SHUTDOWN NOSAVE两个命令可以使用。
# SCRIPT KILL用于停止没有调用写命令的脚本。
# SHUTDOWN NOSAVE是唯一的一个,在脚本的写命令正在执行
# 用户又不想等待脚本的正常结束的情况下,关闭服务器的方法。
# 以下选项设置为0或负数就会取消脚本执行时间限制
lua-time-limit 5000

################################ redis集群  ###############################

# 是否启用集群
# cluster-enabled yes

# 集群配置文件
# 集群配置变更后会自动写入改文件
# cluster-config-file nodes-6379.conf

# 节点互连超时的阀值 
# 节点超时时间,超过该时间无法连接主要Master节点后,会停止接受查询服务 
# cluster-node-timeout 15000

# 控制从节点FailOver相关的设置,设为0,从节点会一直尝试启动FailOver.
# 设为正数,失联大于一定时间(factor*节点TimeOut),不再进行FailOver
# cluster-slave-validity-factor 10

# 最小从节点连接数
# cluster-migration-barrier 1

# 默认为Yes,丢失一定比例Key后(可能Node无法连接或者挂掉),集群停止接受写操作
# 设置为No,集群丢失Key的情况下仍提供查询服务
# cluster-require-full-coverage yes



##############慢查询#################

# Redis慢查询日志记录超过设定时间的查询,且只记录执行命令的时间
# 不记录I/O操作,比如:和客户端交互,发送回复等。
# 时间单位为微妙,1000000微妙 = 1 秒
# 设置为负数会禁用慢查询日志,设置为0会记录所有查询命令
slowlog-log-slower-than 10000

# 日志长度没有限制,但是会消耗内存。超过日志长度后,最旧的记录会被移除
# 使用SLOWLOG RESET命令可以回收内存
slowlog-max-len 128

################################ 延迟监测 ##############################

# 系统只记录超过设定值的操作,单位是毫秒,0表示禁用该功能  
# 可以通过命令“CONFIG SET latency-monitor-threshold <milliseconds>” 直接设置而不需要重启redis  
latency-monitor-threshold 0

############################# 事件通知 ##############################
#  当事件发生时, Redis 可以通知 Pub/Sub 客户端。
#  可以在下表中选择 Redis 要通知的事件类型。事件类型由单个字符来标识:
# K     Keyspace 事件,以 _keyspace@<db>_ 的前缀方式发布
# E     Keyevent 事件,以 _keysevent@<db>_ 的前缀方式发布
# g     通用事件(不指定类型),像 DEL, EXPIRE, RENAME, …
# $     String 命令
# s     Set 命令
# h     Hash 命令
# z     有序集合命令
# x     过期事件(每次 key 过期时生成)
# e     清除事件(当 key 在内存被清除时生成)
# A     g$lshzxe 的别称,因此 ”AKE” 意味着所有的事件
# notify-keyspace-events 带一个由 0 到多个字符组成的字符串参数。空字符串意思是通知被禁用。
#  例子:启用 list 和通用事件:
# notify-keyspace-events Elg
#  默认所用的通知被禁用,因为用户通常不需要改特性,并且该特性会有性能损耗。
#  注意如果你不指定至少 K 或 E 之一,不会发送任何事件。
notify-keyspace-events ""
#notify-keyspace-events AKE

##############高级设置###############

# 当有少量条目的时候,哈希使用高效内存数据结构。最大的条目也不能超过设定的阈值。# “少量”定义如下:
hash-max-ziplist-entries 512
hash-max-ziplist-value 64

# 和哈希编码一样,少量列表也以特殊方式编码节省内存。“少量”设定如下:
list-max-ziplist-entries 512
list-max-ziplist-value 64

# 集合只在以下情况下使用特殊编码来节省内存
# -->集合全部由64位带符号10进制整数构成的字符串组成
# 下面的选项设置这个特殊集合的大小。
set-max-intset-entries 512

# 当有序集合的长度和元素设定为以下数字时,又特殊编码节省内存
zset-max-ziplist-entries 128
zset-max-ziplist-value 64


# HyperLogLog 稀疏表示字节限制
# 这个限制包含了16个字节的头部,当一个HyperLogLog使用sparse representation
# 超过了这个显示,它就会转换到dense representation上
hll-sparse-max-bytes 3000

# 哈希刷新使用每100个CPU毫秒中的1毫秒来帮助刷新主哈希表(顶级键值映射表)。
#  Redis哈希表使用延迟刷新机制,越多操作,越多刷新。
# 如果服务器空闲,刷新操作就不会进行,更多内存会被哈希表占用
# 默认每秒进行10次主字典刷新,释放内存。
# 如果你有硬性延迟需求,偶尔2毫秒的延迟无法忍受的话。设置为no
# 否则设置为yes
activerehashing yes

# 客户端输出缓存限制强迫断开读取速度比较慢的客户端
# 有三种类型的限制
# normal -> 正常
# slave  -> slave和 MONITOR
# pubsub -> 客户端至少订阅了一个频道或者模式
# 客户端输出缓存限制语法如下(时间单位:秒)
# client-output-buffer-limit <类别> <强制限制> <软性限制> <软性时间>
# 达到强制限制缓存大小,立刻断开链接。
# 达到软性限制,仍然会有软性时间大小的链接时间
# 默认正常客户端无限制,只有请求后,异步客户端数据请求速度快于它能读取数据的速度
# 订阅模式和主从客户端又默认限制,因为它们都接受推送。
# 强制限制和软性限制都可以设置为0来禁用这个特性
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

# 设置Redis后台任务执行频率,比如清除过期键任务。
# 设置范围为1到500,默认为10.越大CPU消耗越大,延迟越小。
# 建议不要超过100
hz 10

# 当子进程重写AOF文件,以下选项开启时,AOF文件会每产生32M数据同步一次。
# 这有助于更快写入文件到磁盘避免延迟
aof-rewrite-incremental-fsync yes



优惠券
广告位-淘宝
最新微语