教你看懂redis配置 – 安全
我们可以要求redis客户端在向redis-server发送请求之前,先进行密码验证。当你的redis-server处于一个不太可信的网络环境中时,相信你会用上这个功能。由于redis性能非常高,所以每秒钟可以完成多达15万次的密码尝试,所以你最好设置一个足够复杂的密码,否则很容易被黑客破解。
复制代码代码如下:
requirepass zhimakaimen
这里我们通过requirepass将密码设置成“芝麻开门”。
redis允许我们对redis指令进行更名,比如将一些比较危险的命令改个名字,避免被误执行。比如可以把CONFIG命令改成一个很复杂的名字,这样可以避免外部的调用,同时还可以满足内部调用的需要:
复制代码代码如下:
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c89
我们甚至可以禁用掉CONFIG命令,那就是把CONFIG的名字改成一个空字符串:
复制代码代码如下:
rename-command CONFIG “”
但需要注意的是,如果你使用AOF方式进行数据持久化,或者需要与从redis进行通信,那么更改指令的名字可能会引起一些问题。
教你看懂redis配置 -限制
我们可以设置redis同时可以与多少个客户端进行连接。默认情况下为10000个客户端。当你无法设置进程文件句柄限制时,redis会设置为当前的文件句柄限制值减去32,因为redis会为自身内部处理逻辑留一些句柄出来。
如果达到了此限制,redis则会拒绝新的连接请求,并且向这些连接请求方发出“max number of clients reached”以作回应。
复制代码代码如下:
maxclients 10000
我们甚至可以设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。
如果redis无法根据移除规则来移除内存中的数据,或者我们设置了“不允许移除”,那么redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。但是对于无内存申请的指令,仍然会正常响应,比如GET等。
复制代码代码如下:
maxmemory
需要注意的一点是,如果你的redis是主redis(说明你的redis有从redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素。
对于内存移除规则来说,redis提供了多达6种的移除规则。他们是:
1.volatile-lru:使用LRU算法移除过期集合中的key
2.allkeys-lru:使用LRU算法移除key
3.volatile-random:在过期集合中移除随机的key
4.allkeys-random:移除随机的key
5.volatile-ttl:移除那些TTL值最小的key,即那些最近才过期的key。
6.noeviction:不进行移除。针对写操作,只是返回错误信息。
无论使用上述哪一种移除规则,如果没有合适的key可以移除的话,redis都会针对写请求返回错误信息。
复制代码代码如下:
maxmemory-policy volatile-lru
LRU算法和最小TTL算法都并非是精确的算法,而是估算值。所以你可以设置样本的大小。假如redis默认会检查三个key并选择其中LRU的那个,那么你可以改变这个key样本的数量。
复制代码代码如下:
maxmemory-samples 3
最后,我们补充一个信息,那就是到目前版本(2.8.4)为止,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
教你看懂redis配置 – 追加模式
默认情况下,redis会异步的将数据持久化到磁盘。这种模式在大部分应用程序中已被验证是很有效的,但是在一些问题发生时,比如断电,则这种机制可能会导致数分钟的写请求丢失。
如博文上半部分中介绍的,追加文件(Append Only File)是一种更好的保持数据一致性的方式。即使当服务器断电时,也仅会有1秒钟的写请求丢失,当redis进程出现问题且操作系统运行正常时,甚至只会丢失一条写请求。
我们建议大家,AOF机制和RDB机制可以同时使用,不会有任何冲突。对于如何保持数据一致性的讨论,请参见本文。
复制代码代码如下:
appendonly no
我们还可以设置aof文件的名称:
复制代码代码如下:
appendfilename “appendonly.aof”
fsync()调用,用来告诉操作系统立即将缓存的指令写入磁盘。一些操作系统会“立即”进行,而另外一些操作系统则会“尽快”进行。
redis支持三种不同的模式:
1.no:不调用fsync()。而是让操作系统自行决定sync的时间。这种模式下,redis的性能会最快。
2.always:在每次写请求后都调用fsync()。这种模式下,redis会相对较慢,但数据最安全。
3.everysec:每秒钟调用一次fsync()。这是性能和安全的折衷。
默认情况下为everysec。有关数据一致性的揭秘,可以参考本文。
复制代码代码如下:
appendfsync everysec
当fsync方式设置为always或everysec时,如果后台持久化进程需要执行一个很大的磁盘IO操作,那么redis可能会在fsync()调用时卡住。目前尚未修复这个问题,这是因为即使我们在另一个新的线程中去执行fsync(),也会阻塞住同步写调用。
为了缓解这个问题,我们可以使用下面的配置项,这样的话,当BGSAVE或BGWRITEAOF运行时,fsync()在主进程中的调用会被阻止。这意味着当另一路进程正在对AOF文件进行重构时,redis的持久化功能就失效了,就好像我们设置了“appendsync none”一样。如果你的redis有时延问题,那么请将下面的选项设置为yes。否则请保持no,因为这是保证数据完整性的最安全的选择。
复制代码代码如下:
no-appendfsync-on-rewrite no
我们允许redis自动重写aof。当aof增长到一定规模时,redis会隐式调用BGREWRITEAOF来重写log文件,以缩减文件体积。
redis是这样工作的:redis会记录上次重写时的aof大小。假如redis自启动至今还没有进行过重写,那么启动时aof文件的大小会被作为基准值。这个基准值会和当前的aof大小进行比较。如果当前aof大小超出所设置的增长比例,则会触发重写。另外,你还需要设置一个最小大小,是为了防止在aof很小时就触发重写。
复制代码代码如下:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
如果设置auto-aof-rewrite-percentage为0,则会关闭此重写功能。
教你看懂redis配置 – LUA脚本
lua脚本的最大运行时间是需要被严格限制的,要注意单位是毫秒:
复制代码代码如下:
lua-time-limit 5000
如果此值设置为0或负数,则既不会有报错也不会有时间限制。
教你看懂redis配置 – 慢日志
redis慢日志是指一个系统进行日志查询超过了指定的时长。这个时长不包括IO操作,比如与客户端的交互、发送响应内容等,而仅包括实际执行查询命令的时间。
针对慢日志,你可以设置两个参数,一个是执行时长,单位是微秒,另一个是慢日志的长度。当一个新的命令被写入日志时,最老的一条会从命令日志队列中被移除。
单位是微秒,即1000000表示一秒。负数则会禁用慢日志功能,而0则表示强制记录每一个命令。
复制代码代码如下:
slowlog-log-slower-than 10000
慢日志最大长度,可以随便填写数值,没有上限,但要注意它会消耗内存。你可以使用SLOWLOG RESET来重设这个值。
复制代码代码如下:
slowlog-max-len 128
教你看懂redis配置 – 事件通知
redis可以向客户端通知某些事件的发生。这个特性的具体解释可以参见本文。
教你看懂redis配置 – 高级配置
有关哈希数据结构的一些配置项:
复制代码代码如下:
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
有关列表数据结构的一些配置项:
复制代码代码如下:
list-max-ziplist-entries 512
list-max-ziplist-value 64
有关集合数据结构的配置项:
复制代码代码如下:
set-max-intset-entries 512
有关有序集合数据结构的配置项:
复制代码代码如下:
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
关于是否需要再哈希的配置项:
复制代码代码如下:
activerehashing yes
关于客户端输出缓冲的控制项:
复制代码代码如下:
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
有关重写aof的配置项
复制代码代码如下:
aof-rewrite-incremental-fsync yes
Redis内存数据库操作命令详解
一、连接操作相关的命令
quit关闭连接connection
auth简单密码认证
二、对value操作的命令
exists(key)确认一个key是否存在
del(key)删除一个key
type(key)返回值的类型
keys(pattern)返回满足给定pattern的所有key
randomkey随机返回key空间的一个key
rename(oldname,newname)将key由oldname重命名为newname若newname存在则删除newname表示的key
dbsize返回当前数据库中key的数目
expire设定一个key的活动时间s
ttl获得一个key的活动时间
select(index)按索引查询
move(key,dbindex)将当前数据库中的key转移到有dbindex索引的数据库
flushdb删除当前选择数据库中的所有key
flushall删除所有数据库中的所有key
三、对String操作的命令
set(key, value)给数据库中名称为key的string赋予值value
get(key)返回数据库中名称为key的string的value
getset(key, value)给名称为key的string赋予上一次的value
mget(key1, key2,…, key N)返回库中多个string它们的名称为key1key2…的value
setnx(key, value)如果不存在名称为key的string则向库中添加string名称为key值为value
setex(key,time,value)向库中添加string名称为key值为value同时设定过期时间time
mset(key1, value1, key2, value2,…key N, value N)同时给多个string赋值名称为keyi的string赋值valuei
msetnx(key1, value1, key2, value2,…key N, value N)如果所有名称为keyi的string都不存在则向库中添加string名称keyi赋值为valuei
incr(key)名称为key的string增1操作
incrby(key, integer)名称为key的string增加integer
decr(key)名称为key的string减1操作
decrby(key, integer)名称为key的string减少integer
append(key, value)名称为key的string的值附加value
substr(key, start, end)返回名称为key的string的value的子串
四、对List操作的命令
rpush(key, value)在名称为key的list尾添加一个值为value的元素
lpush(key, value)在名称为key的list头添加一个值为value的 元素
llen(key)返回名称为key的list的长度
lrange(key, start, end)返回名称为key的list中start至end之间的元素下标从0开始下同
ltrim(key, start, end)截取名称为key的list保留start至end之间的元素
lindex(key, index)返回名称为key的list中index位置的元素
lset(key, index, value)给名称为key的list中index位置的元素赋值为value
lrem(key, count, value)删除count个名称为key的list中值为value的元素。count为0删除所有值为value的元素count>0从头至尾删除count个值为value的元素count<0从尾到头删除|count|个值为value的元素。
lpop(key)返回并删除名称为key的list中的首元素
rpop(key)返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout)lpop命令的block版本。即当timeout为0时若遇到名称为keyi的list不存在或该list为空则命令结束。如果timeout>0则遇到上述情况时等待timeout秒如果问题没有解决则对keyi+1开始的list执行pop操作。
brpop(key1, key2,… key N, timeout)rpop的block版本。参考上一命令。
rpoplpush(srckey, dstkey)返回并删除名称为srckey的list的尾元素并将该元素添加到名称为dstkey的list的头部
五、对Set操作的命令
sadd(key, member)向名称为key的set中添加元素member
srem(key, member) 删除名称为key的set中的元素member
spop(key) 随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) 将member元素从名称为srckey的集合移到名称为dstkey的集合
scard(key) 返回名称为key的set的基数
sismember(key, member) 测试member是否是名称为key的set的元素
sinter(key1, key2,…key N) 求交集
sinterstore(dstkey, key1, key2,…key N) 求交集并将交集保存到dstkey的集合
sunion(key1, key2,…key N) 求并集
sunionstore(dstkey, key1, key2,…key N) 求并集并将并集保存到dstkey的集合
sdiff(key1, key2,…key N) 求差集
sdiffstore(dstkey, key1, key2,…key N) 求差集并将差集保存到dstkey的集合
smembers(key) 返回名称为key的set的所有元素
srandmember(key) 随机返回名称为key的set的一个元素
六、对zsetsorted set操作的命令
zadd(key, score, member)向名称为key的zset中添加元素memberscore用于排序。如果该元素已经存在则根据score更新该元素的顺序。
zrem(key, member) 删除名称为key的zset中的元素member
zincrby(key, increment, member) 如果在名称为key的zset中已经存在元素member则该元素的score增加increment否则向集合中添加该元素其score的值为increment
zrank(key, member) 返回名称为key的zset元素已按score从小到大排序中member元素的rank即index从0开始若没有member元素返回“nil”
zrevrank(key, member) 返回名称为key的zset元素已按score从大到小排序中member元素的rank即index从0开始若没有member元素返回“nil”
zrange(key, start, end)返回名称为key的zset元素已按score从小到大排序中的index从start到end的所有元素
zrevrange(key, start, end)返回名称为key的zset元素已按score从大到小排序中的index从start到end的所有元素
zrangebyscore(key, min, max)返回名称为key的zset中score >= min且score <= max的所有元素
zcard(key)返回名称为key的zset的基数
zscore(key, element)返回名称为key的zset中元素element的score
zremrangebyrank(key, min, max)删除名称为key的zset中rank >= min且rank <= max的所有元素
zremrangebyscore(key, min, max) 删除名称为key的zset中score >= min且score <= max的所有元素
zunionstore / zinterstore(dstkeyN,key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX) 对N个zset求并集和交集并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score在进行AGGREGATE运算前都要乘以对于 的WEIGHT参数。如果没有提供WEIGHT默认为1。默认的AGGREGATE是SUM即结果集合中元素的score是所有集合对应元素进行 SUM运算的值而MIN和MAX是指结果集合中元素的score是所有集合对应元素中最小值和最大值。
七、对Hash操作的命令
hset(key, field, value)向名称为key的hash中添加元素field<—>value
hget(key, field)返回名称为key的hash中field对应的value
hmget(key, field1, …,field N)返回名称为key的hash中fieldi对应的value
hmset(key, field1, value1,…,field N, value N)向名称为key的hash中添加元素fieldi<—>valuei
hincrby(key, field, integer)将名称为key的hash中field的value增加integer
hexists(key, field)名称为key的hash中是否存在键为field的域
hdel(key, field)删除名称为key的hash中键为field的域
hlen(key)返回名称为key的hash中元素个数
hkeys(key)返回名称为key的hash中所有键
hvals(key)返回名称为key的hash中所有键对应的value
hgetall(key)返回名称为key的hash中所有的键field及其对应的value
八、持久化
save将数据同步保存到磁盘
bgsave将数据异步保存到磁盘
lastsave返回上次成功将数据保存到磁盘的Unix时戳
shundown将数据同步保存到磁盘然后关闭服务
九、远程服务控制
info提供服务器的信息和统计
monitor实时转储收到的请求
slaveof改变复制策略设置
config在运行时配置Redis服务器
网友评论