一、Redis介绍
Redis和Memcached相似也是一种数据缓存服务,但Redis支持更为丰富的数据类型,比如string、list、hash、set、而且Redis支持数据持久化,可以把内存中的数据保存在磁盘中。除此还有sentinel哨兵模式和集群模式,可以实现主从故障自动转移,实现高可用。而Redis不如Memcached的地方就是只能单线程工作,单线程意味着Redis一次只能一条命令,所以需要避免在线上主库操作一些长命令,如keys、flushall\flushdb等。但是也不是说Redis性能就很差,单线程并不是Redis的瓶颈所在,经过测试发现Redis平均每秒大概可以处理50W次并发请求,存储100万个small key其内存消耗也仅仅100M左右。缓存系统、计数器、排行榜、消息队列、实时系统,基本上社交媒体的功能都可以通过Redis实现。
二、安装Redis
Redis下载的官方网站是http://redis.io/download/;所有历史版本页面:http://download.redis.io/releases/。下载好需要的安装包后解压并安装
tar zxf redis-3.0.4.tar.gz
cd redis-3.0.4
make #不需要configure
make install # make的时候安装已经完成,make install会把redis命令放在/usr/bin下
#使用jemalloc内存分配器,在处理内存碎片化上优于Redis默认内存分配器libc
yum install jemalloc
make prefix=/usr/local/redis MALLOC=/usr/lib64/libjemalloc.so.1 #通过rpm -ql可以查到so文件路径
三、Redis配置
1、redis脚本介绍
· redis-server:Redis服务启动脚本
· redis-cli:Redis客户端命令行操作工具
· redis-benchmark:Redis压力测试工具,测试Redis在当前系统下的读写性能
redis-benchmark -c 100 -n 10000 -r 10000 #100个客户端总共发起10000个请求,并且随机生成大量key,否则只有几个key
· redis-check-aof:对aof数据文件检查修复工具
· redis-check-dump:检查导出工具
2、启动Redis服务
· 直接运行redis-server脚本可以使用默认参数来启动服务,但是启动服务后会有警告信息“Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf”,这个是说明没有指定配置文件
redis-server
· 指定配置文件启动redis
redis-server /usr/local/redis/etc/redis.conf
· 指定配置文件并后台启动redis
vi /usr/local/redis/etc/redis.conf daemonize yes #此项改为yes
5、使用客户端连接Redis测试,默认端口为6379,如果能正常连接上就代表一切成功了
6、登录Redis后输入help命令可以查看帮助,要详细查看指定类型数据的子命令有哪些,可以用@符号来指定组名,如“help @string”“help @list”。也可以用tab来自动补全
./redis-cli 127.0.0.1:6379>
7、关闭redis最好的方法是连接上客户端后运行shutdown,不建议直接kill
8、另外redis的日志中会有一些优化建议,可以在运行后根据日志修改系统配置
四、Redis.conf配置文件示例
bind 127.0.0.1 protected-mode yes port 6379 tcp-backlog 511 #在高并发环境下需要调高该值避免客户端连接问题。该值收到/proc/sys/net/core/somaxconn系统参数的影响,需要一起调整 timeout 0 #客户端空闲时间达到多少秒就被关闭,0为不关闭 tcp-keepalive 300 supervised no pidfile /var/run/redis_6379.pid loglevel notice logfile "/data/redis/logs/redis.log" databases 16 requirepass 123456 #redis密码 # rename-command CONFIG "" #命令别名 maxclients 10000 #最大客户端连接数 maxmemory 1GB #redis最大占用内存,可写为1kb,5GB,4Mb等常见格式,不区分大小写 maxmemory-policy volatile-lru #内存回收策略 # maxmemory-samples 5 #LRU和最小TTL算法精确度不高,但是很接近(为了省内存),这里可以设置用N个样本做检测 requirepass "123456" #redis密码 # RDB持久化配置 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes #如果快照保存失败,所有节点停止写入 rdbcompression yes #RDB是否压缩 rdbchecksum yes #校验RDB文件 dbfilename dump.rdb #RDB文件名 dir /data/redis/rdb/ #RDB存放目录 rdb-save-incremental-fsync yes #当Redis保存RDB文件时,每生成32MB数据就执行一次fsync操作,这样分批提交可以避免高延迟 # 主从配置 slaveof <masterip> <masterport> #如果填写了其他节点ip与端口,本节点就作为那个节点的从库 masterauth <master-password> #主库的密码 slave-serve-stale-data yes #如果从库与主库失联,是否继续响应客户端请求,No则响应SYNC with master in progress slave-read-only yes #从库是否只读 repl-ping-slave-period 10 #从库向主库发送ping请求的间隔 repl-timeout 60 #主从超时时间 repl-disable-tcp-nodelay no #是否用nodelay方式传输数据,no可以降低数据传输到从库的延迟,但使用更多的带宽 repl-backlog-size 10mb #从库与主库断开连接的一段时间内,数据将传送给这个日志,从库重连时从这个日志增量同步 repl-backlog-ttl 3600 #当所有从库都与主库断开连接后达到多少秒释放backlog slave-priority 100 #从库优先级,数字越小优先级越高,0代表不会被哨兵选为主 # min-slaves-to-write 3 #如果从库少于N个,主库就停止写入,需配合min-slaves-max-lag一起使用。比如至少需要3个从库、并且延时小于等于10秒的,主库才能写入 # min-slaves-max-lag 10 #如果从库延迟小于N秒,主库才能写入数据,需配合min-slaves-to-write一起使用。比如至少需要3个从库、并且延时小于等于10秒的,主库才能写入 repl-diskless-sync yes #主从复制采用无磁盘化方式,master端直接将RDB file传到slave,不需要等本地落盘后再传输 repl-diskless-sync-delay 5 # AOF持久化配置 appendonly no appendfilename "appendonly.aof" appendfsync everysec # appendfsync always # appendfsync no no-appendfsync-on-rewrite no #如果正在导出rdb数据则停止aof的写入,aof将保存在一个队列中,等rdb备份完成后再执行队列,不会丢失数据 auto-aof-rewrite-percentage 100 #aof文件体积与上次相比增长率达到100%就进行重写(重写相当于记总账,比如对同一个key做了100次操作,我们只需要最后一次的操作,重写就会把多余的操作给忽略掉,节省内存 auto-aof-rewrite-min-size 64mb #和auto-aof-rewrite-percentage组合使用,aof文件达到64M时进行重写 aof-load-truncated yes aof-rewrite-incremental-fsync yes #当Redis保存AOF文件时,每生成32MB数据就执行一次fsync操作,这样分批提交可以避免高延迟 #慢日志配置 slowlog-log-slower-than 1000000 #达到N毫秒则记录慢日志 slowlog-max-len 1000 #慢日志记录条数 #当hash\list\set类型的键只有少量数据时会用一种更节省内存的数据结构来编码 hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes #启用hash刷新,尽快释放内存 #客户端输出缓冲区配置 client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 #默认10,可选范围1到500,通常不建议调整该值。该值决定了Redis处理后台任务的频率,比如清理过期Key、关闭超时连接等。调高该值可以让CPU空闲时间更频繁的去处理后台的任务,但通常不建议调高到100以上 dynamic-hz yes #动态调整hz的值
五、Redis缓冲区
在redis.conf配置中,client-output-buffer-limit用于控制缓冲区的大小。缓冲区的主要作用是避免Redis处理速度慢于发送速度,导致数据丢失和性能问题。但是缓冲区随着使用增多,需要的内存也就越来越多。如果缓冲区占用的内存超出了设定的上限阈值,就会出现缓冲区溢出而丢失数据。但是缓冲区也不能设置得太大或者不限制,因为随着累积的数据越来越多,缓冲区占用内存空间越来越大,一旦耗尽了 Redis 实例所在机器的可用内存,就会导致 Redis OOM。
· 输入缓冲区:暂存客户端发送的命令,可能导致溢出的情况主要是写入了bigkey或者Redis主线程阻塞。这样Redis就无法及时处理正常发送的请求,导致客户端发送的请求在缓冲区越积越多。客户端输入缓冲区大小在代码中设定为1G(无法直接修改),也就是说允许每个客户端暂存1GB的命令和数据。如果要避免输入缓冲区溢出就只能从数据命令的发送和处理速度入手,避免写入大量bigkey以及Redis主线程阻塞。
redis > client list #关注qbuf和qbuf-free的值,如果qbuf快接近qbuf-free代表没有什么缓冲区可用了,如果该客户端继续大量写入,则会被关闭
· 输出缓冲区:暂存Redis返回给客户端的数据。可能导致溢出的原因主要有服务器端返回bigkey的大量结果、持续monitor、缓冲区大小设置不合理三种情况。而对于输出缓冲区可以通过client-output-buffer-limit选项进行控制,客户端类型分有normal普通客户端、slave从库客户端和pubsub订阅客户端三种。
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最大内存的说明
如果看到客户端提示command not allowed when used memory > 'maxmemory'的提示,代表当前redis服务使用内存已经达到设置的上限。根据Redis默认的删除算法,达到最大内存后redis对后续操作会直接返回错误。要设置删除算法的话需要修改maxmemory-policy这个选项的值,Redis支持以下几种删除算法:
· volatile-lru:使用LRU算法删除设有ttl的key
· volatile-random:随机删除设有设置ttl的key
· volatile-ttl:删除ttl最小的key,前提是key有设置过期时间
· allkeys-lru:使用LRU算法在所有key中进行删除,LRU算法是删除使用次数最小的KEY
· allkeys-random:随机在所有key中进行删除
· noeviction:默认删除算法,不进行任何操作,直接返回错误
发表评论: