1.redis-cli的用法
a)连接redis(参数后面必须加空格)
redis-cli -h xx.xx.xx.xx -p 6379 -a "xxxx"
b)–bigkeys
redis-cli --bigkeys
统计bigkey的分布,使用scan命令对redis的键进行采样,从中找到内存占用比较大的键,这些键可能是系统的瓶颈。
生产环境执行时强烈建议在从节点实行,如果担心OPS太高,可以使用 -i 0.1 ,表示每100条scan命令休眠0.1秒
c)–hotkeys
redis-cli --hotkeys
统计redis中的热点key
仅限于最大内存策略为 volatile-lfu 或 allkeys-lfu。实际上是通过 scan + object freq 完成的
LRU首先淘汰最长时间未被使用的key!
LFU淘汰一定时期内被访问次数最少的key!
d) monitor
redis-cli monitor
打印出所有正在执行的命令
2.查看redis状态
info [section]
例如:
info clients
127.0.0.1:6379> info clients
# Clients
connected_clients:28 #已连接客户端的数量(不包括通过从服务器连接的客户端)
client_longest_output_list:0 #当前连接的客户端当中,最长的输出列表
client_biggest_input_buf:0 #当前连接的客户端当中,最大输入缓存
blocked_clients:1 #正在等待阻塞命令的客户端的数量
info Keyspace
127.0.0.1:6379> info Keyspace
# Keyspace
db0:keys=2210,expires=2198,avg_ttl=62633246
info Memory
127.0.0.1:6379> info Memory
# Memory
used_memory:2322224
used_memory_human:2.21M #Redis 实际使用的内存总量
used_memory_rss:4902912
used_memory_rss_human:4.68M #从操作系统的角度Redis 已分配的内存总量
used_memory_peak:11744760
used_memory_peak_human:11.20M #Redis 的内存消耗峰值
total_system_memory:134910550016
total_system_memory_human:125.65G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:2.11 #内存碎片率,>1表明有内存碎片,越大表明越多,<1表明正在使用虚拟内存
mem_allocator:jemalloc-4.0.3
3.查看key
a)keys *
b)scan cursor [MATCH pattern] [COUNT count]
例如:scan 0 match * count 100
redis 127.0.0.1:6379> scan 0
1) "17"
2) 1) "key:12"
2) "key:8"
3) "key:4"
4) "key:14"
5) "key:16"
6) "key:17"
7) "key:15"
8) "key:10"
9) "key:3"
10) "key:7"
redis 127.0.0.1:6379> scan 17
1) "0"
2) 1) "key:5"
2) "key:18"
3) "key:0"
4) "key:2"
5) "key:19"
6) "key:13"
7) "key:6"
8) "key:9"
9) "key:11"
4.查看value
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
确定key的类型 type key
a)字符串get key
b)哈希hgetall key
c)列表lrange key start stop
d)集合smembers key
e)有序集合zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
举例 ZRANGEBYSCORE key (1 5 返回所有符合条件 1 < score <= 5 的成员
ZRANGEBYSCORE key -inf +inf 返回所有成员
5.查看慢日志
a)redis slowlog的优势
slowlog只保存在内存中,循环利用
保存时会截断大key
不会占用过多内存,因此slowlog的效率很高,完全不用担心会影响到redis的性能。
b)slowlog的限制
版本>=2.2.12
没有物理文件存储,展示需要额外处理
显示内容比较简单
慢查询比较多的情况下,可能会丢失部分慢查询命令
c)慢查查参数的设置:
slowlog-log-slower-than
慢日志阈值,单位微秒,默认10000即10毫秒或0.01秒
由于redis是单线程的,如果按照10毫秒的阈值,每个命令都是10毫秒的话,1秒钟只能执行100条命令,即OPS只有100。所以高并发环境可以调小阈值,例如1毫秒。
slowlog-max-len
慢日志保留条数,默认128条(先进先出循环,保留最近的128条)
可以用config get和config set的方式查看和动态调整
例如:
127.0.0.1:6300> config get slowlog-log-slower-than
1) "slowlog-log-slower-than"
2) "10000"
127.0.0.1:6300> config set slowlog-log-slower-than 1000
OK
d)慢日志获取:
slowlog get num
num为慢日志条数,不写默认为10
e)获取慢日志条数
slowlog len
f)清空慢日志
slowlog reset
g)redis命令的执行生命周期:
查询日志只是统计步骤3执行命令的时间,不包括排队时间和网络时间,所以慢查询并不代表客户端没有超时问题。因此客户端命令的执行时间要大于redis服务器实际执行命令的时间。因为命令执行排队极致,慢查询会导致命令级联阻塞,因此当客户端出现请求超时,需要检查该时间点是否有对应的慢查询,从而分析是否因为慢查询导致的命令级联阻塞。
慢查询日志由以下四个属性组成:
标识ID,发生时间戳,命令耗时,执行命令和参数
举例:
127.0.0.1:6300> set a b
OK
127.0.0.1:6300> slowlog get 1
1) 1) (integer) 1 #标识ID,重启后重置
2) (integer) 1606300807 #执行时间UNIX时间戳
3) (integer) 4 #执行时间(单位微秒)
4) 1) "set" #执行具体命令
2) "a"
3) "b"
6.redis常用命令汇总:
a)连接操作相关的命令
默认直接连接 远程连接-h 192.168.1.20 -p 6379
ping:测试连接是否存活如果正常会返回pong
echo:打印
select:切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值
quit:关闭连接(connection)
auth:简单密码认证
b)服务端相关命令
time:返回当前服务器时间
client list: 返回所有连接到服务器的客户端信息和统计数据 参见http://redisdoc.com/server/client_list.html
client kill ip:port:关闭地址为 ip:port 的客户端
save:将数据同步保存到磁盘
bgsave:将数据异步保存到磁盘
lastsave:返回上次成功将数据保存到磁盘的Unix时戳
shundown:将数据同步保存到磁盘,然后关闭服务
info:提供服务器的信息和统计
config resetstat:重置info命令中的某些统计数据
config get:获取配置文件信息
config set:动态地调整 Redis 服务器的配置(configuration)而无须重启,可以修改的配置参数可以使用命令 CONFIG GET * 来列出
config rewrite:Redis 服务器时所指定的 redis.conf 文件进行改写
monitor:实时转储收到的请求
slaveof:改变复制策略设置
c)发布订阅相关命令
psubscribe:订阅一个或多个符合给定模式的频道 例如psubscribe news.* tweet.*
publish:将信息 message 发送到指定的频道 channel 例如publish msg “good morning”
pubsub channels:列出当前的活跃频道 例如PUBSUB CHANNELS news.i*
pubsub numsub:返回给定频道的订阅者数量 例如PUBSUB NUMSUB news.it news.internet news.sport news.music
pubsub numpat:返回客户端订阅的所有模式的数量总和
punsubscribe:指示客户端退订所有给定模式。
subscribe:订阅给定的一个或多个频道的信息。例如 subscribe msg chat_room
unsubscribe:指示客户端退订给定的频道。
d)对KEY操作的命令
exists(key):确认一个key是否存在
del(key):删除一个key
type(key):返回值的类型
keys(pattern):返回满足给定pattern的所有key
randomkey:随机返回key空间的一个
keyrename(oldname, newname):重命名key
dbsize:返回当前数据库中key的数目
expire:设定一个key的活动时间(s)
ttl:获得一个key的活动时间
move(key, dbindex):移动当前数据库中的key到dbindex数据库
flushdb:删除当前选择数据库中的所有key
flushall:删除所有数据库中的所有key
e)对String操作的命令
set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string的value
setnx(key, value):添加string,名称为key,值为value
setex(key, time, value):向库中添加string,设定过期时间time
mset(key N, value N):批量设置多个string的值
msetnx(key N, value N):如果所有名称为key i的string都不存在
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的子串
f)对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之间的元素
ltrim(key, start, end):截取名称为key的list
lindex(key, index):返回名称为key的list中index位置的元素
lset(key, index, value):给名称为key的list中index位置的元素赋值
lrem(key, count, value):删除count个key的list中值为value的元素
lpop(key):返回并删除名称为key的list中的首元素
rpop(key):返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop命令的block版本。
brpop(key1, key2,… key N, timeout):rpop的block版本。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
g)对Set操作的命令
sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :移到集合元素
scard(key) :返回名称为key的set的基数
sismember(key, member) :member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
sunion(key1, (keys)) :求并集
sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
sdiff(key1, (keys)) :求差集
sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素
h)对Hash操作的命令
hset(key, field, value):向名称为key的hash中添加元素field
hget(key, field):返回名称为key的hash中field对应的value
hmget(key, (fields)):返回名称为key的hash中field i对应的value
hmset(key, (fields)):向名称为key的hash中添加元素field
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
i)对ZSET操作的命令
ZADD key score1 member1 [score2 member2]:向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZCARD key:获取有序集合的成员数
ZCOUNT key min max:计算在有序集合中指定区间分数的成员数
ZINCRBY key increment member:有序集合中对指定成员的分数加上增量 increment
ZINTERSTORE destination numkeys key [key …]:计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 destination 中
ZLEXCOUNT key min max:在有序集合中计算指定字典区间内成员数量
ZRANGE key start stop [WITHSCORES]:通过索引区间返回有序集合指定区间内的成员
ZRANGEBYLEX key min max [LIMIT offset count]:通过字典区间返回有序集合的成员
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]:通过分数返回有序集合指定区间内的成员
ZRANK key member:返回有序集合中指定成员的索引
ZREM key member [member …]:移除有序集合中的一个或多个成员
ZREMRANGEBYLEX key min max:移除有序集合中给定的字典区间的所有成员
ZREMRANGEBYRANK key start stop:移除有序集合中给定的排名区间的所有成员
ZREMRANGEBYSCORE key min max:移除有序集合中给定的分数区间的所有成员
ZREVRANGE key start stop [WITHSCORES]:返回有序集中指定区间内的成员,通过索引,分数从高到低
ZREVRANGEBYSCORE key max min [WITHSCORES]:返回有序集中指定分数区间内的成员,分数从高到低排序
ZREVRANK key member:返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
ZSCORE key member:返回有序集中,成员的分数值
ZUNIONSTORE destination numkeys key [key …]:计算给定的一个或多个有序集的并集,并存储在新的 key 中
ZSCAN key cursor [MATCH pattern] [COUNT count]:迭代有序集合中的元素(包括元素成员和元素分值)