邢栋博客

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

在PHP中设置分布式memcache存取
1. 创建对象
$mem = new Memcache();
2. 添加服务
$mem->addServer("192.168.150.250",11211);
$mem->addServer("192.168.150.138",11211);
$mem->addServer("192.168.112.128",11211);
3. 放置信息
$mem->add("mystr","hello memcache!",MEMCACHE_COMPRESSED,0);
$mem->add("myarray",array(10,20,30,40),MEMCACHE_COMPRESSED,0);
$mem->add("myob",new Stu(),MEMCACHE_COMPRESSED,0);
4. 获取信息
echo $mem->get("mystr")."<br/>";
var_dump($mem->get('myarray'));
echo "<br/>";
$mem->get("myob")->getinfo();


memcached服务器的安全防护
• 1. 内网访问
– memcached -d -m 1024 -u root –l 192.168.0.10 –p 11211 –c 1024 start
• 2. 设置防火墙
– iptables –F
– iptables –P INPUT DROP
– iptables –A INPUT –p tcp –s 192.168.0.10 –-dport 11211 –j ACCEPT
– iptables –A INPUT –p udp –s 192.168.0.10 –-dport 11211 –j ACCEPT
关于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设计与实现>这本书


mysql数据类型及其大小限制
mysql数据类型及其大小限制

数字类型
INT 正常大小的整数,可以有符号,也可以没有符号。如果是有符号整数,其允许的取值范围是-2147483648~2147483647;无符号整数的取值范围是从0至4294967295。最高可指定11位数字。
TINYINT非常小的整数,分为有无符号两种。前有符号时,其允许取值范围是-128~127;无符号时的取值范围为0~255。所以,最高可指定4位数字。
SMALLINT较小的整数,分为有无符号两种。前有符号时,其允许取值范围是-32768~32767;无符号时的取值范围为0~65535。所以最高可指定5位数字。
MEDIUMINT 中型大小的整数,分为有无符号两种。前有符号时,其允许取值范围是-8388608~8388607;无符号时的取值范围为0~16777215。所以,最高可指定9位数字。
BIGINT 较大型的整数,分为有无符号两种。前有符号时,其允许取值范围为-9223372036854775808~9223372036854775807;无符号时的取值范围为0~18446744073709551615。最高可指定20位数字。
FLOAT(M,D) 不带符号的浮点数。M 代表显示长度,D 代表小数位数。这两个参数都不是必需参数,它们默认为10, 2,表示小数点后有2位数字,而整个数字的位数为10(包含小数位数)。FLOAT 类型的小数精度可以达到24位。
DOUBLE(M,D) 不带符号的双精度浮点数。M 代表显示长度,D 代表小数位数。这两个参数都不是必需参数,它们默认为16, 4,表示小数点后有4位数字,而整个数字的位数为 16(包含小数位数)。DOUBLE 类型的小数精度可以达到53位。DOUBLE 与 REAL 同义。

DECIMAL(M,D) 非压缩的无符号浮点数。 在未压缩十进制中,每一位十进制数都对应一个字节。需要定义显示长度(M)和小数位数(D)。DECIMAL 与 NUMERIC 同义。

日期与时间类型
MySQL 包含以下几种日期与时间类型:
DATE YYYY-MM-DD (年-月-日)格式显示的日期,取值范围从1000-01-01 到 9999-12-31。比如1973年的12月30日就存为 1973-12-30。
DATETIME 按照 YYYY-MM-DD HH:MM:SS 格式组合显示的日期与时间,取值范围从1000-01-01 00:00:00 到 9999-12-31 23:59:59。比如说1973年的12月30日下午3 : 30就存为1973-12-30 15 : 30 : 00。
TIMESTAMP 介于1970年1月1日凌晨与2037年某个时间点之间的一种时间戳。这种格式与之前的 DATETIME 格式相仿,只不过少了数字间的连字符。1973年12月30日下午3 : 30被存为19731230153000(YYYYMMDDHHMMSS)。
TIME 按照 HH:MM:SS 格式存储的时间。
YEAR(M) 用2位或4位格式存储的时间。如果把长度定为2,比如说YEAR(2),那么可以表示从1970年到2069年的这些年份(70-69)。如果把长度定为4,YEAR(4),则可以表示从1901年到2155年。默认长度为4。

字符串类型
虽然数字与日期类型都很有趣,但通常我们存储最多的就是字符串了。下面列出了 MySQL 中常见的字符串类型。

CHAR(M) 长度固定的字符串,长度范围从1~255个字符,比如CHAR(5)。在存储时,会向右用空格补齐指定长度。长度并非必须参数,默认长度为1。
VARCHAR(M) 长度不定的字符串,长度范围从1~255个字符。比如:CHAR(25)。在创建VARCHAR字段时,必须定义长度。
BLOB or TEXT 最大长度为65535个字符的字段。BLOB是Binary Large Objects(二进制大型对象)的缩写,专用于保存大量的二进制数据,比如图片或其他类型的文件。TEXT 类型的文件也能保存大型数据。这两者的区别在于存储数据的排序和对比方面,BLOB类型数据是大小写敏感的,而TEXT类型数据则不是。另外,不能指定它们的长度。
TINYBLOB or TINYTEXT 最大长度为255个字符的 BLOB 或 TEXT 字段。同样也不能指定它们的长度。
MEDIUMBLOB or MEDIUMTEXT 最大长度为16777215个字符的 BLOB 或 TEXT 字段。同样也不能指定它们的长度。
LONGBLOB or LONGTEXT 最大长度为4294967295个字符的 BLOB 或 TEXT 字段。同样也不能指定它们的长度。
ENUM 枚举类型,是一种很独特的列表类型。ENUM 类型的数据实际是一个包含多个固定值的列表,只能选择这些值(包括 NULL 值)。例如,如果希望某个字段包含 "A"、"B" 和 "C",必须这样定义:ENUM ('A', 'B', 'C'),只有这些值(或 NULL 值)能够填充到该字段中。
关于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


关于redis的复制
完整重同步用于处理初次复制情况:完整重同步的执行步骤和sync命令的执行步骤一样,他们是通过让主服务器创建并发送rdb文件,以及向从服务器发送保存在缓冲区里面的写命令来进行同步。

Redis 2.8 以前的复制功能不能高效地处理断线后重复制情况, 但 Redis 2.8 新添加的部分重同步功能可以解决这个问题。

部分重同步通过复制偏移量、复制积压缓冲区、服务器运行 ID 三个部分来实现。
复制偏移量
执行复制的双方-主服务器和从服务器会分别维护一个复制偏移量。
复制积压缓冲区
复制积压缓冲区是由服务器维护的一个固定长度(fixed-size)先进先出(FIFO)队列,默认大小为1MB。当主服务器进行命令传播时,它不仅会将命令发送给所有从服务器,还会将命令写入复制积压缓冲区里面。

在复制操作刚开始的时候, 从服务器会成为主服务器的客户端, 并通过向主服务器发送命令请求来执行复制步骤, 而在复制操作的后期, 主从服务器会互相成为对方的客户端。

主服务器通过向从服务器传播命令来更新从服务器的状态, 保持主从服务器一致, 而从服务器则通过向主服务器发送命令来进行心跳检测, 以及命令丢失检测。

复制的实现
1.设置主服务器的地址和端口
127.0.0.1:12345> slaveof 127.0.0.1:6379  
2.建立套接字连接
3.发送ping命令
4.身份验证
5.发送端口信息
6.同步
7.命令传播

心跳检测
1.检测主从服务器的网络连接状态
127.0.0.1:6379> info repliaction
2.辅助实现min-slaves配置选项
min-slaves-to-write 3
min-slaves-max-lag 10
ps:在从服务器的数量小于3个,或者三个服务器的延迟(lag)值都大于或等于10秒时,主服务器将拒绝执行写命令
3.检测命令丢失

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

关于redis的RDB持久化和AOF持久化
redis的RDB持久化和AOF持久化

关于RDB持久化
RDB 文件用于保存和还原 Redis 服务器所有数据库中的所有键值对数据。
SAVE 命令由服务器进程直接执行保存操作,所以该命令会阻塞服务器。
BGSAVE 命令由子进程执行保存操作,所以该命令不会阻塞服务器。
服务器状态中会保存所有用 save 选项设置的保存条件(redis.conf,save参数),当任意一个保存条件被满足时,服务器会自动执行 BGSAVE 命令。
RDB 文件是一个经过压缩的二进制文件,由多个部分组成。
对于不同类型的键值对, RDB 文件会使用不同的方式来保存它们。


关于AOF持久化
AOF 文件通过保存所有修改数据库的写命令请求来记录服务器的数据库状态。
AOF 文件中的所有命令都以 Redis 命令请求协议的格式保存。
命令请求会先保存到 AOF 缓冲区里面, 之后再定期写入并同步到 AOF 文件。
appendfsync 选项的不同值对 AOF 持久化功能的安全性、以及 Redis 服务器的性能有很大的影响。(redis.conf,appendfsync,有always,everysec,no三个参数,默认为everysec)
服务器只要载入并重新执行保存在 AOF 文件中的命令, 就可以还原数据库本来的状态。
AOF 重写可以产生一个新的 AOF 文件, 这个新的 AOF 文件和原有的 AOF 文件所保存的数据库状态一样, 但体积更小。
AOF 重写是一个有歧义的名字, 该功能是通过读取数据库中的键值对来实现的, 程序无须对现有 AOF 文件进行任何读入、分析或者写入操作。
在执行 BGREWRITEAOF 命令时, Redis 服务器会维护一个 AOF 重写缓冲区, 该缓冲区会在子进程创建新 AOF 文件的期间, 记录服务器执行的所有写命令。 当子进程完成创建新 AOF 文件的工作之后, 服务器会将重写缓冲区中的所有内容追加到新 AOF 文件的末尾, 使得新旧两个 AOF 文件所保存的数据库状态一致。 最后, 服务器用新的 AOF 文件替换旧的 AOF 文件, 以此来完成 AOF 文件重写操作。

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



关于redis的过期时间
redis的过期时间

设置过期时间
expire  <key> <ttl>  将键key的生存时间设置为ttl秒
pexpire <key> <ttl>  将键key的生存时间设置为ttl毫秒

expireat <key> <timestamp>  将键key的过期时间设置为timestamp所指定的秒数时间戳
pexpireat <key> <timestamp> 将键key的过期时间设置为timestamp所指定的毫秒数时间戳

在redis底层,expire、pexpire、pexpireat三个命令都使用pexpireat命令来实现的 

移除过期时间
pexpireat mesaage  145090000000000
ttl message
persist message  //移除过期时间
ttl message 

ps:
linux 获取当前时间的时间戳 date +%s
linux 获取指定时间的时间戳 date --date=20151123 +%s




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