redis常用命令、常见错误、配置技巧等分享
1.redis查看当前所有的key
KEYS*
2.查看当前redis的配置信息
CONFIGGET*
3.MISCONFRedisisconfiguredtosaveRDBsnapshots,butiscurrentlynotabletopersistondisk.Commandsthatmaymodifythedatasetaredisabled.PleasecheckRedislogsfordetailsabouttheerror.
强制停止redis快照导致,redis运行用户没有权限写rdb文件或者磁盘空间满了,解决办法:
configsetstop-writes-on-bgsave-errorno
例如:
set'name''shenhui' -MISCONFRedisisconfiguredtosaveRDBsnapshots,butiscurrentlynotabletopersistondisk.Commandsthatmaymodifythedatasetaredisabled.PleasecheckRedislogsfordetailsabouttheerror. configsetstop-writes-on-bgsave-errorno +OK set'name''shenhui' +OK
4.redis127.0.0.1:6379>CONFIGSETlogfile"/var/log/redis/redis-server.log"
(error)ERRUnsupportedCONFIGparameter:logfile
logfile不能通过set动态设置
5.(error)OOMcommandnotallowedwhenusedmemory>
设置了maxmemory的选项,redis内存使用达到上限。
可以通过设置LRU算法来删除部分key,释放空间。
默认是按照过期时间的,如果set时候没有加上过期时间就会导致数据写满maxmemory。
如果不设置maxmemory或者设置为064位系统不限制内存,32位系统最多使用3GB内存。
volatile-lru->根据LRU算法生成的过期时间来删除。
allkeys-lru->根据LRU算法删除任何key。
volatile-random->根据过期设置来随机删除key。
allkeys->random->无差别随机删。
volatile-ttl->根据最近过期时间来删除(辅以TTL)
noeviction->谁也不删,直接在写操作时返回错误。
6.reids日志位置
logfile日志记录方式,默认值为stdout,如果设置为stdout且以守护进程方式运行,那么日志会被重定向到/dev/null,也就是不记日志。
7.reids配置参数详解
#daemonizeno 默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes daemonizeyes # 当redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,你可以配置到其他地址。 # 当运行多个redis服务时,需要指定不同的pid文件和端口 pidfile/var/run/redis_6379.pid # 指定redis运行的端口,默认是6379 port6379 # 在高并发的环境中,为避免慢客户端的连接问题,需要设置一个高速后台日志 tcp-backlog511 # 指定redis只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求 #bind192.168.1.10010.0.0.1 #bind127.0.0.1 # 设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接 #0是关闭此设置 timeout0 #TCPkeepalive # 在Linux上,指定值(秒)用于发送ACKs的时间。注意关闭连接需要双倍的时间。默认为0。 tcp-keepalive0 # 指定日志记录级别,生产环境推荐notice #Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose #debug 记录很多信息,用于开发和测试 #varbose 有用的信息,不像debug会记录那么多 #notice 普通的verbose,常用于生产环境 #warning 只有非常重要或者严重的信息会记录到日志 loglevelnotice # 配置log文件地址 # 默认值为stdout,标准输出,若后台模式会输出到/dev/null。 logfile/var/log/redis/redis.log # 可用数据库数 # 默认值为16,默认数据库为0,数据库范围在0-(database-1)之间 databases16 ################################快照################################# # 保存数据到磁盘,格式如下: # save # 指出在多长时间内,有多少次更新操作,就将数据同步到数据文件rdb。 # 相当于条件触发抓取快照,这个可以多个条件配合 # 比如默认配置文件中的设置,就设置了三个条件 # save9001 900秒内至少有1个key被改变 # save30010 300秒内至少有300个key被改变 # save6010000 60秒内至少有10000个key被改变 #save9001 #save30010 #save6010000 # 后台存储错误停止写。 stop-writes-on-bgsave-erroryes # 存储至本地数据库时(持久化到rdb文件)是否压缩数据,默认为yes rdbcompressionyes #RDB文件的是否直接偶像chcksum rdbchecksumyes # 本地持久化数据库文件名,默认值为dump.rdb dbfilenamedump.rdb # 工作目录 # 数据库镜像备份的文件放置的路径。 # 这里的路径跟文件名要分开配置是因为redis在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成, # 再把该该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中。 #AOF文件也会存放在这个目录下面 # 注意这里必须制定一个目录而不是文件 dir/var/lib/redis-server/ #################################复制################################# # 主从复制.设置该数据库为其他数据库的从数据库. # 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步 #slaveof # 当master服务设置了密码保护时(用requirepass制定的密码) #slave服务连接master的密码 #masterauth # 当从库同主机失去连接或者复制正在进行,从机库有两种运行方式: #1) 如果slave-serve-stale-data设置为yes(默认设置),从库会继续响应客户端的请求 #2) 如果slave-serve-stale-data是指为no,出去INFO和SLAVOF命令之外的任何请求都会返回一个 # 错误"SYNCwithmasterinprogress" slave-serve-stale-datayes # 配置slave实例是否接受写。写slave对存储短暂数据(在同master数据同步后可以很容易地被删除)是有用的,但未配置的情况下,客户端写可能会发送问题。 # 从Redis2.6后,默认slave为read-only slaveread-onlyyes # 从库会按照一个时间间隔向主库发送PINGs.可以通过repl-ping-slave-period设置这个时间间隔,默认是10秒 #repl-ping-slave-period10 #repl-timeout 设置主库批量数据传输时间或者ping回复时间间隔,默认值是60秒 # 一定要确保repl-timeout大于repl-ping-slave-period #repl-timeout60 # 在slavesocket的SYNC后禁用TCP_NODELAY # 如果选择“yes”,Redis将使用一个较小的数字TCP数据包和更少的带宽将数据发送到slave,但是这可能导致数据发送到slave端会有延迟,如果是Linuxkernel的默认配置,会达到40毫秒. # 如果选择"no",则发送数据到slave端的延迟会降低,但将使用更多的带宽用于复制. repl-disable-tcp-nodelayno # 设置复制的后台日志大小。 # 复制的后台日志越大,slave断开连接及后来可能执行部分复制花的时间就越长。 # 后台日志在至少有一个slave连接时,仅仅分配一次。 #repl-backlog-size1mb # 在master不再连接slave后,后台日志将被释放。下面的配置定义从最后一个slave断开连接后需要释放的时间(秒)。 #0意味着从不释放后台日志 #repl-backlog-ttl3600 # 如果master不能再正常工作,那么会在多个slave中,选择优先值最小的一个slave提升为master,优先值为0表示不能提升为master。 slave-priority100 # 如果少于N个slave连接,且延迟时间<=M秒,则master可配置停止接受写操作。 # 例如需要至少3个slave连接,且延迟<=10秒的配置: #min-slaves-to-write3 #min-slaves-max-lag10 # 设置0为禁用 # 默认min-slaves-to-write为0(禁用),min-slaves-max-lag为10 ##################################安全################################### # 设置客户端连接后进行任何其他指定前需要使用的密码。 # 警告:因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150K次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解 #requirepassfoobared # 命令重命名. # 在一个共享环境下可以重命名相对危险的命令。比如把CONFIG重名为一个不容易猜测的字符。 # 举例: #rename-commandCONFIGb840fc02d524045429941cc15f59e41cb7be6c52 # 如果想删除一个命令,直接把它重命名为一个空字符""即可,如下: #rename-commandCONFIG"" ###################################约束################################### #设置同一时间最大客户端连接数,默认无限制, #Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数, #如果设置 maxclients0,表示不作限制。 #当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回maxnumberofclientsreached错误信息 #maxclients10000 # 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会按照清除策略尝试清除已到期的Key # 如果Redis依照策略清除后无法提供足够空间,或者策略设置为”noeviction”,则使用更多空间的命令将会报错,例如SET,LPUSH等。但仍然可以进行读取操作 # 注意:Redis新的vm机制,会把Key存放内存,Value会存放在swap区 # 该选项对LRU策略很有用。 #maxmemory的设置比较适合于把redis当作于类似memcached的缓存来使用,而不适合当做一个真实的DB。 # 当把Redis当做一个真实的数据库使用的时候,内存使用将是一个很大的开销 #maxmemory # 当内存达到最大值的时候Redis会选择删除哪些数据?有五种方式可供选择 #volatile-lru-> 利用LRU算法移除设置过过期时间的key(LRU:最近使用 LeastRecentlyUsed) #allkeys-lru-> 利用LRU算法移除任何key #volatile-random-> 移除设置过过期时间的随机key #allkeys->random->removearandomkey,anykey #volatile-ttl-> 移除即将过期的key(minorTTL) #noeviction-> 不移除任何可以,只是返回一个写错误 # 注意:对于上面的策略,如果没有合适的key可以移除,当写的时候Redis会返回一个错误 # 默认是: volatile-lru #maxmemory-policyvolatile-lru #LRU 和 minimalTTL算法都不是精准的算法,但是相对精确的算法(为了节省内存),随意你可以选择样本大小进行检测。 #Redis默认的灰选择3个样本进行检测,你可以通过maxmemory-samples进行设置 #maxmemory-samples3 ##############################AOF############################### # 默认情况下,redis会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时的,而且备份也不能很频繁,如果发生诸如拉闸限电、拔插头等状况,那么将造成比较大范围的数据丢失。 # 所以redis提供了另外一种更加高效的数据库备份及灾难恢复方式。 # 开启appendonly模式之后,redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态。 # 但是这样会造成appendonly.aof文件过大,所以redis还支持了BGREWRITEAOF指令,对appendonly.aof进行重新整理。 # 你可以同时开启asynchronousdumps和 AOF appendonlyno #AOF文件名称 (默认:"appendonly.aof") #appendfilenameappendonly.aof #Redis支持三种同步AOF文件的策略: #no: 不进行同步,系统去操作 .Faster. #always:always表示每次有写操作都进行同步.Slow,Safest. #everysec: 表示对写操作进行累积,每秒同步一次.Compromise. # 默认是"everysec",按照速度和安全折中这是最好的。 # 如果想让Redis能更高效的运行,你也可以设置为"no",让操作系统决定什么时候去执行 # 或者相反想让数据更安全你也可以设置为"always" # 如果不确定就用 "everysec". #appendfsyncalways appendfsynceverysec #appendfsyncno #AOF策略设置为always或者everysec时,后台处理进程(后台保存或者AOF日志重写)会执行大量的I/O操作 # 在某些Linux配置中会阻止过长的fsync()请求。注意现在没有任何修复,即使fsync在另外一个线程进行处理 # 为了减缓这个问题,可以设置下面这个参数no-appendfsync-on-rewrite no-appendfsync-on-rewriteno #AOF 自动重写 # 当AOF文件增长到一定大小的时候Redis能够调用 BGREWRITEAOF 对日志文件进行重写 # 它是这样工作的:Redis会记住上次进行些日志后文件的大小(如果从开机以来还没进行过重写,那日子大小在开机的时候确定) # 基础大小会同现在的大小进行比较。如果现在的大小比基础大小大制定的百分比,重写功能将启动 # 同时需要指定一个最小大小用于AOF重写,这个用于阻止即使文件很小但是增长幅度很大也去重写AOF文件的情况 # 设置 percentage为0就关闭这个特性 auto-aof-rewrite-percentage100 auto-aof-rewrite-min-size64mb ################################LUASCRIPTING############################# #一个Lua脚本最长的执行时间为5000毫秒(5秒),如果为0或负数表示无限执行时间。 lua-time-limit5000 ################################LOWLOG################################ #RedisSlowLog 记录超过特定执行时间的命令。执行时间不包括I/O计算比如连接客户端,返回结果等,只是命令执行时间 # 可以通过两个参数设置slowlog:一个是告诉Redis执行超过多少时间被记录的参数slowlog-log-slower-than(微妙), # 另一个是slowlog的长度。当一个新命令被记录的时候最早的命令将被从队列中移除 # 下面的时间以微妙为单位,因此1000000代表一秒。 # 注意指定一个负数将关闭慢日志,而设置为0将强制每个命令都会记录 slowlog-log-slower-than10000 # 对日志长度没有限制,只是要注意它会消耗内存 # 可以通过 SLOWLOGRESET回收被慢日志消耗的内存 # 推荐使用默认值128,当慢日志超过128时,最先进入队列的记录会被踢出 slowlog-max-len128 ################################ 事件通知 ############################# # 当事件发生时,Redis可以通知Pub/Sub客户端。 # 可以在下表中选择Redis要通知的事件类型。事件类型由单个字符来标识: #K Keyspace事件,以_keyspace@_的前缀方式发布 #E Keyevent事件,以_keysevent@_的前缀方式发布 #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-eventsElg # 默认所用的通知被禁用,因为用户通常不需要改特性,并且该特性会有性能损耗。 # 注意如果你不指定至少K或E之一,不会发送任何事件。 notify-keyspace-events“” ############################## 高级配置 ############################### # 当hash中包含超过指定元素个数并且最大的元素没有超过临界时, #hash将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值 #RedisHash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现, # 这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的valueredisObject的encoding为zipmap, # 当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。 hash-max-zipmap-entries512 hash-max-zipmap-value64 # 和Hash一样,多个小的list以特定的方式编码来节省空间。 #list数据类型节点值大小小于多少字节会采用紧凑存储格式。 list-max-ziplist-entries512 list-max-ziplist-value64 #set数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储。 set-max-intset-entries512 # 和hashe和list一样,排序的set在指定的长度内以指定编码方式存储以节省空间 #zsort数据类型节点值大小小于多少字节会采用紧凑存储格式。 zset-max-ziplist-entries128 zset-max-ziplist-value64 #Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用 # 当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。 # 如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存 activerehashingyes #客户端的输出缓冲区的限制,因为某种原因客户端从服务器读取数据的速度不够快, #可用于强制断开连接(一个常见的原因是一个发布/订阅客户端消费消息的速度无法赶上生产它们的速度)。 # 可以三种不同客户端的方式进行设置: #normal-> 正常客户端 #slave ->slave和MONITOR客户端 #pubsub-> 至少订阅了一个pubsubchannel或pattern的客户端 # 每个client-output-buffer-limit语法: #client-output-buffer-limit # 一旦达到硬限制客户端会立即断开,或者达到软限制并保持达成的指定秒数(连续)。 # 例如,如果硬限制为32兆字节和软限制为16兆字节/10秒,客户端将会立即断开 # 如果输出缓冲区的大小达到32兆字节,客户端达到16兆字节和连续超过了限制10秒,也将断开连接。 # 默认normal客户端不做限制,因为他们在一个请求后未要求时(以推的方式)不接收数据, # 只有异步客户端可能会出现请求数据的速度比它可以读取的速度快的场景。 # 把硬限制和软限制都设置为0来禁用该特性 client-output-buffer-limitnormal000 client-output-buffer-limitslave256mb64mb60 client-output-buffer-limitpubsub32mb8mb60 #Redis调用内部函数来执行许多后台任务,如关闭客户端超时的连接,清除过期的Key,等等。 # 不是所有的任务都以相同的频率执行,但Redis依照指定的“Hz”值来执行检查任务。 # 默认情况下,“Hz”的被设定为10。 # 提高该值将在Redis空闲时使用更多的CPU时,但同时当有多个key同时到期会使Redis的反应更灵敏,以及超时可以更精确地处理。 # 范围是1到500之间,但是值超过100通常不是一个好主意。 # 大多数用户应该使用10这个预设值,只有在非常低的延迟的情况下有必要提高最大到100。 hz10 # 当一个子节点重写AOF文件时,如果启用下面的选项,则文件每生成32M数据进行同步。 aof-rewrite-incremental-fsyncyes
8.Redis官方文档对VM的使用建议:
当你的key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大.
当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value.
最好使用linuxext3等对稀疏文件支持比较好的文件系统保存你的swap文件.
vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.
有了VM功能,Redis终于摆脱了受内存容量限制的噩梦了,似乎我们可以称其为Redis数据库了,我们还可以想象又有多少新的用法可以产生.当然,希望这一功能不会对Redis原有的非常牛B的内存存储性能有所影响.
9.redis修改持久化路径和日志路径
vimredis.conf logfile/data/redis_cache/logs/redis.log#日志路径
dir/data/redis_cache#持久化路径,修改后记得要把dump.rdb持久化文件拷贝到/data/redis_cache下
先杀掉redis,拷贝dump.rdb,启动
10.清redis缓存
./redis-cli #进入 dbsize flushall #执行 exit
11.删除redis当前数据库中的所有Key
flushdb
12.删除redis所有数据库中的key
flushall