常用命令:
Redis
概念: redis是-款高性能的NosQks系列的非关系型数据库
1.1.1. NOSQL 和关系型数据库比较
优点
- 成本: nosq1数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。
- 查询速度: nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosq1数据库。
- 存储数据的格式: nosql的存储格式是key ,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。
- 扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
缺点: - 维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。
- 不提供对sql的支持,如果不支持sq1这样的工业标准,将产生- -定用户的学习和使用成本。
- 不提供关系型数据库对事务的处理。
1.1.2.非关系型数据库的优势
- 性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
- 可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。
1.1.3.关系型数据库的优势 :
- 复杂查询可以用SQL语句方便的在一 个表以及多个表之间做非常复杂的数据查询。
- 事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的优势就是自己的弱势,反之亦然。
1.1.4.总结 .
关系型数据库 与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库,让NoSQL数据库对关系型数据库的不足进行弥补。一于般会将数据存储在关系型数据库中,在nosql 数据库中备份存储关系型数据库的数据
1.2.主流的NOSQL产品
键值(Key-Value)存储数据库
- 相关产品: Tokyo Cabinet/Tyrant、 Redis、 Voldemort、Berkeley DB
- 典型应用:内容缓存,主要用于处理大量数据的高访问负载。数据模型:–系列键值对
优势:快速查询
劣势:存储的数据缺少结构化列存储数据库 - 相关产品: Cassandra, HBase, Redisy
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一-列数据存在- -起
优势:查找速度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限 - 文档型数据库
相关产品: CouchDB、MongoDB
典型应用: Web应用(与Key -Value类似, value是 结构化的)
数据模型:一系列键值对.
优势:数据结构要求不严格
劣势:查询性能不高,而且缺乏统-的查询语法 - 图形(Graph)数据库
相关数据库: Neo4J、InfoGrid、 Infinite Graph
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法。
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
1.3什么是Redis
Redis是用c语言开发的一个开源的高性能键值对(key-value) 数据库,官方提供测试数据,50个并发执行00000个请求,读的速度是110000次/s,写的速度是81000次/s,且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
- 字符串类型string
- 哈希类型hash
- 列表类型list
- 集合类型set
- 有序集合类型sorteaset
1.3.1 redis的应用场景
- 缓存(数据查询、短连接、新闻内容、商品内容等等)
- 聊天室的在线好友列表
- 任务队列。(秒杀、 抢购、12306等等)
- 应用排行榜
- 网站访问统计
- 数据过期处理(可以精确到毫秒)
- 分布式集群架构中的session分离
下载安装
1.官网: https 😕/redis. io
2.中文网: http://www. redis. net. cn/
3.解压直接可以使用:
- redis .windows .conf :配置文件
- redis-cli.exe : redis的客户端
- redis-server.exe : redis服务器端
启动 redis 客户端,打开终端并输入命令 redis-cli。该命令会连接本地的 redis 服务。 - redi s的数据结构:
*redis存储的是: key ,value格式的数据,其中key都是字符串
Value有5种不同的数据结构
value的数据结构
- 字符串类型string
- 哈希类型hash : map格式
- 列表类型list linkedlist格式
- 集合类型set
- 有序集合类型sortedset
1.string类型的常用命令:
1.存储:set key value
2.获取:get key
3.删除: del key
incr key:该key对应的value自增1 decr key:该key对应的value自减1’
incrby key xx:该key对应的value增加xx decrby key xx:减少xx
getrange key x1 x2: 获取x1-x2范围内的值,类似between…and的关系,从零到负一表示全部
2.哈希类型hash
- 存储: hset key field value
- 获取:hget key field: 获取指定的field对应的值
- hgetall key :获取所有的field和value
- 删除: hdel key field
3.列表类型list :简单的字符串列表,
按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)
1.存储:
- lpush key value :从左边存入列表
- rpush key value :从右边存入列表
- llen:查看某个list数据类型的长度
- 获取 lrange key start end :范围获取
- 删除: 1pop key: 从列表的最左边移除一 个元素,并将元素返回; rpop key :从列表的最右边移除一个元素,并将元素返回
4.集合类型set :不允许重复元素
- 存储:saddkeyvalue
- 获取: smembers key: 获取set集合中所有元秦
- 删除: srem key value:删除set集合中的某个元素
- sadd:添加数据
- scard:查看set数据中存在的元素个数
- sismember:判断set数据中是否存在某个元素
4 .sorted_set类型
新的存储需求:根据排序有利于数据的有效显示,需要提供一种可以根据自身特征进行排序的方式。
需要的存储结构:新的存储模型,可以保存可排序的数据。
sorted_set类型:在set的存储结构基础上添加可排序字段。
score只存储其顺序。
sorted_set类型数据的基本操作
添加数据
zadd key score1 member1 [score2 member2]
获取全部数据
zrange key start stop [WITHSCORES]//按照从小到大的顺序,加上WITHSCORES,就会带上scores一起显示
zrevrange key start stop [WITHSCORES]//按照从大到小的顺序
删除数据
zrem key member [member …]
按条件获取数据
//查询scores在某个范围内的值
zrangebyscore key min max [WITHSCORES] [LIMIT]
//查询key某个索引范围内的值
zrevrangebyscore key max min [WITHSCORES]
条件删除
zremrangebyrank key start stop
zremrangebyscore key min max
注意:
minmax用于限定搜索查询的条件
start与stop用于限定查询范围,作用于索引,表示开始和结束索引
offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量
获取集合数据总量
zcard key //获取总量
zcount key min max //获取某一个范围的总量
集合交、并存储操作
zinterstore destination numkeys key [key …] //求和
zunionstore destination numkeys key [key …]
sorted_set 类型数据的扩展操作
业务场景- 建立排序依据
解决方案
获取数据对应的索引(排名)
zrank key member //正数第几位
zrevrank key member //倒数第几位
score 值获取与修改
zscore key member //获取
zincrby key increment member //score递增 increment
sorted_set 类型数据操作的注意事项
score 保存的数据存储空间是64位
score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时侯要慎重
sorted_set底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果
业务场景-会员短期体验之过期失效
解决方案
对于基于时间线限定的任务处理,将处理时间记录为score值,利用排序功能区分处理的先后顺序
记录下一个要处理的事件,当对比系统时间发现当然仍后到期后移除redis中的记录,并记录下一个要处理的时间
当新任务加入时,判定并更新当前下一个要处理的任务时间
为提升sorted_set的性能,通常将任务根据特征存储成若干个sorted_set.例如1小时内,1天内,年度等,操作时逐渐提升,将即将操作的若干个任务纳入到1小时内处理队列中
time命令获取当前系统时间
数据类型实践案例
按次调用-计数器
如何实现这个每分钟只能调用10次呢?
解决方案
设计计数器,记录调用次数,用于控制业务执行次数。以用户id作为key,使用此时作为value
在调用前获取次数,判断是否超过限定次数,不超过次数的情况下,每次调用计数+1,业务调用失败,不递增
为了计数器设置生命周期为指定周期,例如10次/分钟,自动清空周期内使用次数。
解决方案改良
利用可以存储的最大值是9223372036854775807,超过这个值就会抛出异常的特性。假如一分钟只能访问5次,可以将初始值设置为9223372036854775802,每次访问都加1,访问5次后这个数就会溢出异常。
解决方案
依赖list的数据具有顺序的特征对消息进行管理,将list结构作为栈使用
对指定与普通会话分别创建独立的list分别管理
当某个list中接收到用户消息后,将消息发送方的id从list的一侧加入list(此处设定左侧)
多个相同id发出的消息反复入栈会出现问题,在入栈之前无论是否具有当前id对应得消息,先删除对应id
推送消息时先推送顶置会话list,再推送普通会话list,推送完成的list清除所有数据
消息的数量,也就是微信用户对话数量采用计数器的思想另行记录,伴随list操作同步更新
6. Redis新数据类型
6.1.Bitmaps简介。
现代计算机用二进制(位)作为信息的基础单位,1个字节等于8位,例如“abc"
字符串是由3个字节组成,但实际在计算机存储时将其用二进制表示,“abc” 分别
对应的ASCII 码分别是97、98、 99 ,对应的二进制分别是01100001、01100010
和01100011 ,如下图。
(1). 格式
setbit <key> <offset> <value>设置Bitmaps中媒个偏移量的值(0或1 )。
127 .0.0.1:6379> setbit key offset value
*offset:偏移量从0开始。
2、getbit.
(1)格式
getbit <key> <offset>获取Bitmaps中某个偏移量的值127.0.0.1:6379> getbit key offset
获取键的第offset位的值(从0开始算)。
3、bitcount.
统计字符串被设置为1的bit数。一般情况下,给定的整个字符串都会被进行计数,通
过指定额外的start或end参数,可以让计数只在特定的位上进行。start 和end参数
的设置,都可以使负数值:比如-1 示后-个位,而-2表示倒数第个位,
start、end 是指bit组的字节的下标数, =者皆包含。。
(1)格式
bitcount <key>[start end]统计字符串从start字节到end字节比特值为1的数量
位计数<key>[Start End]统计字符串从Start字节到End字节比特值为1的数量
127.0.0.1:6379> bitcount key [start
很明显,这种情况下使用Bitmaps 能节省很多的内存空间,尤其是随着时间推
移节省的内存还是非常可观的
**但Bitmaps并不是万金油,假如该网站每天的独立访问用户很少,例如只有10
万(大量的僵尸用户),那么两者的对比如下表所示,很显然,这时候使用.
,Bitmaps就不太合适了,因为基本上大部分位都是0。。
**
6.2、HyperLogLog
用于计算基数的操作,{1,2,3,4,5,5,6,4}基数为6,一共有6个不重复元素。
命令
pfadd,向hyperloglog中添加数据,相同元素会去重
pfcount,统计基数个数
pfmerge,合并多个个hll到一个hll中
6.3、Geospatial
是地理位置的基本操作
命令
geoadd,添加地理位置,经度、纬度、名称,有效经度为±180°,有效纬度约为±85°,已经添加的数据无法再次添加
geopos,获取地点的经纬度
geodist,获取俩个位置间的直线距离
georadius,以给定的经纬度为中心,寻找半径内的元素
7.1 事务
第一种 组队情况
第二种 在组队中没有失败,最后执行错误的命令报错,其他命令不影响。
乐观锁
悲观锁
WATCH key [key … ]。
在执行multi之前,先执行watch key1 [key2],可以监视一个(或多个) key ,如果在事务
执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。。
unwatch.
取消WATCH命令对所有key的监视。。
如果在执行WATCH命令之后, EXEC命令或DISCARD命令先被执行了的话,那么就
不需要再执行UNWATCH了。
Redis持久化策略.avi
AOF方式
配置(config)
为了能够读取配置文件,redis启动的时候必须指定配置文件,如下:
./redis-server /path/to/redis.conf
接下来我们就来介绍redis.conf的具体可配置参数。
一、基本配置
- 内存大小设置
当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写):
1k =< 1000 bytes
1kb =< 1024 bytes
1m =< 1000000 bytes
1mb =< 10241024 bytes
1g =< 1000000000 bytes
1gb =< 10241024*1024 bytes
- daemonize no
默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes。
- pidfile /var/run/redis.pid
当redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,你可以配置到其他地址。当运行多个redis
服务时,需要指定不同的pid文件和端口。
- port 6379
指定redis运行的端口。
-
bind 127.0.0.1
If you want you can bind a single interface, if the bind option is not
specified all the interfaces will listen for incoming connections.
bind 127.0.0.1
该处说明bind的是interface,也就是说是网络接口。服务器可以有一个网络接口(通俗的说网卡),或者多个。打个比方
说机器上有两个网卡,分别为192.168.205.5 和192.168.205.6,如果bind 192.168.205.5,那么只有该网卡地址接受外
部请求,如果不绑定,则两个网卡口都接受请求。
注意:在集群模式时,不能指定lo网卡(127.0.0.1I),否则客户端重定向时会报”Connection refused”的错误。
- timeout 0
设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么server端关闭该连接。0为关
闭该设置。
- tcp-keepalive 0
指定TCP连接是否为长连接,“侦探”信号由server端维护,长连接将会额外的增加server端的开支。
默认为0,表示禁用; 非0值表示开启“长连接” ; “侦探”信号的发送间隔将有linux系统决定。
在多次“侦探”后,如果对等端仍不回复,将会关闭连接,否则连接将会被保持开启。
client端socket也可以通过配置keepalive选项,开启”长连接”。
- loglevel notice
server日志级别,合法值:debug,verbose,notice,warning 默认为notice。
debug适合开发环境,客户端操作信息都会输出日志。
verbose输出一些相对有用的信息,目前效果不明。
notice适合生产环境。
warning异常信息。
- logfile
指定Redis日志记录方式,默认值为stdout,表示打印在命令行终端的窗口上,也可设为/dev/null屏蔽日志。
- databases 16
设定redis所允许的最大“db簇”(可以理解为数据库)的个数,默认为16个簇。
客户端可以通过“select”指令指定需要使用的“db簇”索引号,默认为0。
redis的顶层数据结构中,所有K-V都潜在的包括了“db簇”索引号,任何一个key都将隶属于一个“db”。
任何对数据的检索,只会覆盖指定的“db”;例如数据被插入到“db 10”中,那么在“db 1”中去get,将会返回null。
对数据归类到不同的db簇中,可以帮助我们实现一些特定的需求,比如根据不同客户端连接,来指定不同的db索引号。
注:集群模式的时候,只能用0号数据库。
- maxclients 128
限制同时连接的客户数量。
当连接数超过这个值时,redis 将不再接收其他连接请求,客户端尝试连接时将收到 error 信息。
- maxmemory
设置redis能够使用的最大内存。
达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key(设置过expire信息的key)。
在删除时,按照过期时间进行删除,将要被过期的key将最先被删除
如果已到期或即将到期的key删光,仍进行set操作,那么将返回错误。
maxmemory的设置比较适合于把redis当作于类似memcached 的缓存来使用。
- maxmemory-policy
内存达到最大值的时候Redis会选择删除哪些数据?有六种方式可供选择:
volatile-lru:只对设置了过期时间的key进行LRU(默认值) (LRU:最近使用 Least Recently Used )
allkeys-lru:利用LRU算法移除任何key。
volatile-random:移除设置过过期时间的随机key
allkeys-random:随机删除
volatile-ttl: 删除即将过期的
noeviction:不移除任何key,只是返回一个写错误
注意:对于上面的策略,如果没有合适的key可以移除,当写的时候Redis会返回一个错误。
写命令包括: set setnx setex append
# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
# getset mset msetnx exec sort
##
- syslog-enabled no
'syslog-enabled’设置为yes会把日志输出到系统日志,默认是no。
- syslog-ident redis
指定syslog的标示符,如果’syslog-enabled’是no,则这个选项无效。
- syslog-facility local0
指定syslog 设备(facility), 必须是USER或者LOCAL0到LOCAL7。
- include /path/to/local.conf
我们知道Redis只有一个配置文件,如果多个人进行开发维护,那么就需要多个这样的配置文件,这时候多个配置文件就可以在此通过 include /path/to/local.conf 配置进来,而原本的 redis.conf 配置文件就作为一个总闸。
另外需要注意的时,如果将此配置写在redis.conf 文件的开头,那么后面的配置会覆盖引入文件的配置,如果想以引入文件的配置为主,那么需要将 include 配置写在 redis.conf 文件的末尾。
- maxmemory-samples
LRU 和 minimal TTL 算法都不是精准的算法,但是相对精确的算法(为了节省内存)。随意你可以选择样本大小进行检,redis默认选择3个样本进行检测,你可以通过maxmemory-samples进行设置样本数。
二、SLOWLOG(慢日志)
可以通过两个参数设置slow log:一个是告诉Redis执行超过多少时间被记录的参数slowlog-log-slower-than(毫秒),另
一个是slow log 的长度。当一个新命令被记录的时候最早的命令将被从队列中移除。
- slowlog-log-slower-than 10000
Redis slow log用来记录超过指定执行时间的查询。执行时间不包括I/O计算比如连接客户端,返回结果等,只是命令执
行时间。
可以通过两个参数设置slow log:一个是告诉Redis执行超过多少时间被记录的参数slowlog-log-slower-than(毫秒),另
一个是slow log 的长度。当一个新命令被记录的时候最早的命令将被从队列中移除。
- slowlog-max-len
对日志长度没有限制,只是要注意它会消耗内存。
可以通过 SLOWLOG RESET 回收被慢日志消耗的内存。
三、Snapshotting(快照)
- save
save,用来描述“在多少秒期间至少多少个变更操作”触发snapshot
snapshot最终将生成新的dump.rdb文件。
save “”用来禁用snapshot功能。
例如:
save 300 1 表示5分钟内至少一个key变更,触发snapshot
- rdbcompression yes
是否启用rdb文件压缩手段,默认为yes。
压缩可能需要额外的cpu开支,不过这能够有效的减小rdb文件的大小,有利于存储/备份/传输/数据恢复。
- rdbchecksum yes
是否对rdb文件使用CRC64校验和, 默认为“yes”, 那么每个rdb文件内容的末尾都会追加CRC校验和。
对于其他第三方校验工具,可以很方便的检测文件的完整性。
- dbfilename dump.rdb
镜像备份文件的文件名
# The filename where to dump the DB
dbfilename dump.rdb
- dir ./
指定rdb/AOF文件的目录位置,只能为文件夹不能为文件。
# Note that you must specify a directory here, not a file name.
dir /var/lib/redis
- stop-writes-on-bgsave-error
默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。这会让用户意识到数据没有正确持久化到磁盘上,否则没有人会注意到灾难(disaster)发生了。如果Redis重启了,那么又可以重新开始接收数据了。
四、AOF
- appendonly no
默认情况下,Redis会异步的把数据保存到硬盘。如果你的应用场景允许因为系统崩溃等极端情况而导致最新数据丢失#
的话,那这种做法已经很ok了。否则你应该打开"append only"模式,开启这种模式后,Redis会在appendonly.aof
文件中添加每一个写操作,这个文件会在Redis启动时被读取来在内存中重新构建数据集。
如果你需要,你可以同时开启“append only”模式和异步dumps模式(你需要注释掉上面的save表达式来禁止dumps),这种情况下,Redis重建数据集时会优先使用appendonly.aof而忽略dump.rdb。
- appendfilename appendonly.aof
AOF文件名称 (默认: “appendonly.aof”)
- appendfsync everysec
调用fsync()函数通知操作系统立刻向硬盘写数据。
Redis支持三种同步AOF文件的策略:
no:不fsync, 只是通知OS可以flush数据了,具体是否flush取决于OS。性能更好。
always: 每次写入append only 日志文件后都会fsync。性能差,但很安全。
everysec: 每间隔1秒进行一次fsync。折中。
默认是"everysec",按照速度和安全折中这是最好的。
如果想让Redis能更高效的运行,你也可以设置为"no",让操作系统决定什么时候去执行。
或者相反想让数据更安全你也可以设置为"always"。
如果不确定就用 “everysec”。
- no-appendfsync-on-rewrite no
AOF策略设置为always或者everysec时,后台处理进程(后台保存或者AOF日志重写)会执行大量的I/O操作。
在某些Linux配置中会阻止过长的fsync()请求。注意现在没有任何修复,即使fsync在另外一个线程进行处理。
为了减缓这个问题,可以设置下面这个参数no-appendfsync-on-rewrite
- auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
append only 文件的自动重写。
当AOF 日志文件即将增长到指定百分比时,Redis可以通过调用BGREWRITEAOF 来自动重写append only文件。
它是这么干的:Redis会记住最近一次重写后的AOF 文件size。然后它会把这个size与当前size进行比较,如果当前size
比指定的百分比大,就会触发重写。同样,你需要指定AOF文件被重写的最小size,这对避免虽然百分比达到了, 但是实
际上文件size还是很小(这种情况没有必要重写)却导致AOF文件重写的情况很有用。
auto-aof-rewrite-percentage 设置为 0 可以关闭AOF重写功能。
- aof-load-truncated
aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。重启可能发生在redis所在的主机操作系统宕机后,尤其在ext4文件系统没有加上data=ordered选项,出现这种现象 redis宕机或者异常终止不会造成尾部不完整现象,可以选择让redis退出,或者导入尽可能多的数据。如果选择的是yes,当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load。如果是no,用户必须手动redis-check-aof修复AOF文件才可以。默认值为 yes。
五、高级配置
- hash-max-zipmap-entries 512
hash-max-zipmap-value 64
redis 2.0后引入了 hash 数据结构。
当hash中包含超过指定元素个数并且最大的元素没有超过临界时,hash将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值。
Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现:
当Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结
构,对应的value redisObject的encoding为zipmap。
当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
- activerehashing yes
是否重置Hash表。
设置成yes后redis将每100毫秒使用1毫秒CPU时间来对redis的hash表重新hash,可降低内存的使用。
当使用场景有较为严格的实时性需求,不能接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。
如果没有这么严格的实时性要求,可以设置为 yes,以便能够尽可能快的释放内存。
- list-max-ziplist-entries 512
list-max-ziplist-value 64
list 数据类型多少节点以下会采用去指针的紧凑存储格式。
list 数据类型节点值大小小于多少字节会采用紧凑存储格式。
- set-max-intset-entries 512
set数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储。
- zset-max-ziplist-entries 128
zset-max-ziplist-value 64
zsort 数据类型多少节点以下会采用去指针的紧凑存储格式。
zsort 数据类型节点值大小小于多少字节会采用紧凑存储格式。
六、Replication(复制)
- slaveof
将当前server做为slave,并为其指定master信息。
slaveof 当本机为从服务时,设置主服务的IP及端口。
# slaveof <masterip> <masterport>
slaveof 11.41.8.209 63789
- masterauth
以认证的方式连接到master。 如果master中使用了“密码保护”,slave必须交付正确的授权密码,才能连接成功。
“requirepass”配置项指定了当前server的密码。
此配置项中值需要和master机器的“requirepass”保持一致。
masterauth tinywanredis
- slave-serve-stale-data yes
如果当前server是slave,那么当slave与master失去通讯时,是否继续为客户端提供服务,“yes”表示继续,“no”表示终止。
在“yes”情况下,slave继续向客户端提供只读服务,有可能此时的数据已经过期.
在“no”情况下,任何向此server发送的数据请求服务(包括客户端和此server的slave)都将被告知”error”,但 INFO 和SLAVEOF
命令除外。
# When a slave loses its connection with the master, or when the replication
# is still in progress, the slave can act in two different ways:slave-serve-stale-data yes
- slave-read-only
配置Redis的Slave实例是否接受写操作,即Slave是否为只读Redis。默认值为yes。
- repl-diskless-sync
主从数据复制是否使用无硬盘复制功能。默认值为no。
- repl-diskless-sync-delay
当启用无硬盘备份,服务器等待一段时间后才会通过套接字向从站传送RDB文件,这个等待时间是可配置的。 这一点很重要,因为一旦传送开始,就不可能再为一个新到达的从站服务。从站则要排队等待下一次RDB传送。因此服务器等待一段 时间以期更多的从站到达。延迟时间以秒为单位,默认为5秒。要关掉这一功能,只需将它设置为0秒,传送会立即启动。默认值为5。
- repl-disable-tcp-nodelay
同步之后是否禁用从站上的TCP_NODELAY 如果你选择yes,redis会使用较少量的TCP包和带宽向从站发送数据。但这会导致在从站增加一点数据的延时。 Linux内核默认配置情况下最多40毫秒的延时。如果选择no,从站的数据延时不会那么多,但备份需要的带宽相对较多。默认情况下我们将潜在因素优化,但在高负载情况下或者在主从站都跳的情况下,把它切换为yes是个好主意。默认值为no。
七、VM(虚拟内存)
- vm-enabled no
是否开启虚拟内存支持。
redis 是一个内存数据库,当内存满时,无法接收新的写请求,所以在redis2.0后,提供了虚拟内存的支持。
但需要注意的,redis 所有的key都会放在内存中,在内存不够时,只把value 值放入交换区。
虽使用虚拟内存,但性能基本不受影响,需要注意的是要把vm-max-memory设置到足够来放下所有的key。
- vm-swap-file /tmp/redis.swap
设置虚拟内存的交换文件路径,不可多个Redis实例共享。
- vm-max-memory 0
设置开启虚拟内存后,redis将使用的最大物理内存大小。
默认为0,redis将把他所有能放到交换文件的都放到交换文件中,以尽量少的使用物理内存。
即当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。
在生产环境下,需要根据实际情况设置该值,最好不要使用默认的 0。
- vm-page-size 32
设置虚拟内存的页大小。
如果 value 值比较大,如要在 value 中放置博客、新闻之类的所有文章内容,就设大一点。
- vm-pages 134217728
设置交换文件的总的 page 数量
注意page table信息是放在物理内存中,每8个page 就会占据RAM中的 1 个 byte
总的虚拟内存大小 = vm-page-size * vm-pages。
- vm-max-threads 4
设置 VM IO 同时使用的线程数量。
八、Security(安全)
- requirepass foobared
当前server的授权密码
任何客户端或者slave与此server交互前,需要提交密码,其他server的masterauth配置和此参数值保持一致。
密码应该足够复杂(64字节)
需要客户端在执行任何命令之前指定 AUTH
# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.requirepass tinywanredis
- rename-command
命令重命名。对于一些危险命令例如:
flushdb(清空数据库)
flushall(清空所有记录)
config(客户端连接后可配置服务器)
keys(客户端连接后可查看所有存在的键)
作为服务端redis-server,常常需要禁用以上命令来使得服务器更加安全,禁用的具体做法是是:
rename-command FLUSHALL “”
也可以保留命令但是不能轻易使用,重命名这个命令即可:
rename-command FLUSHALL abcdefg
这样,重启服务器后则需要使用新命令来执行操作,否则服务器会报错unknown command。
九、LUA SCRIPTING
- lua-time-limit
一个lua脚本执行的最大时间,单位为ms。默认值为5000。
十、REDIS CLUSTER
- cluster-enabled
集群开关,默认是不开启集群模式。
- cluster-config-file
集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。 这个文件并不需要手动配置,这个配置文件有Redis生成并更新,每个Redis集群节点需要一个单独的配置文件。请确保与实例运行的系统中配置文件名称不冲突。默认配置为nodes-6379.conf。
- cluster-node-timeout
可以配置值为15000。节点互连超时的阀值,集群节点超时毫秒数
- cluster-slave-validity-factor
可以配置值为10。在进行故障转移的时候,全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了, 导致数据过于陈旧,这样的slave不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。判断方法是:比较slave断开连接的时间和(node-timeout * slave-validity-factor) + repl-ping-slave-period 如果节点超时时间为三十秒, 并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移
- cluster-migration-barrier
可以配置值为1。master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数若被设为2,那么只有当一个主节点拥有2 个可工作的从节点时,它的一个从节点会尝试迁移。
- cluster-require-full-coverage
默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。 设置为no,可以在slot没有全部分配的时候提供服务。不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,而造成很长时间数据不一致。
Redis主从复制失败
要是因为这里的redis配置了码,可以在slave的配置文件里指定(配从不配主)
应用场景