1、使用INFOcommandstats 查看所有命令统计的快照,比如命令执行了多少次,执行命令所耗费的毫秒数(每个命令的总时间和平均时间),
只需要简单地执行 CONFIG RESETSTAT 命令就可以重置,这样你就可以得到一个全新的统计结果。
2、用 scan 代替 keys *
3、redis-cli -h localhost -p 6379 client list | grep -v "omem=0"这条命令在排查redis慢的时候绝对是神技。一般阻塞的命令都会导致omem不断升高,这条命令能快速找到引起阻塞的命令
4、通常我们可以通过redis慢日志来找到引起redis慢的命令,用法为slowlog get 10来查看最慢的10条命令,然后针对性的进行优化。慢日志可以通过redis.conf或者 运行时
CONFIG SET slowlog-log-slower-than 5000
CONFIG SET slowlog-max-len 25
来设置slowlog参数,其中slowlog-log-slower-than表示执行时间超过该值(单位毫秒)的命令记为慢查询,slowlog-max-len可以设置记录的最大条数。可以通过slowlog reset命令来重置慢日志记录。
5、避免使用慢查询语句如:keys *, flushall, drop table, update table set a=1 等,可通过slowlog 进行监控
6、redis的键名最佳命名规则:对象类型:对象ID:对象属性,比如user:6:friends来存储ID为6的用户的好友列表,对于多个单词则推荐使用.分隔符,另外可读性也非常重要,不要省这么一点点空间。
7、redis监控工具RedisLive:http://www.nkrode.com/article/real-time-dashboard-for-redis (需要先安装Python环境)
8、redis的内部结构dict 是一个基于哈希表的算法,一个dict包含两个dictht,用于在重hash时进行增量式哈希。重哈希的过程中,在dictht[0]上以bucket为单位,对其中的key进行哈希计算映射到dictht[1]中,每次的CRUD都会触发部分的重哈希操作,其中增加操作只会将要增加的k-v插入到dictht[1]上。一个database所有的 key和value的映射都是通过dict来维护的。
9、redisobj所表示的就是Redis对外暴露的第一层面的数据结构:string, list, hash, set, sorted set,而每一种数据结构的底层实现所对应的是哪个(或哪些)第二层面的数据结构(dict, sds, ziplist, quicklist, skiplist, 等),则通过不同的encoding来区分。可以说,redisobj是联结两个层面的数据结构的桥梁
10、一个ziplist整体占用一大块内存。它是一个表(list),但其实不是一个链表(linked list),ziplist本来就设计为各个数据项挨在一起组成连续的内存空间,这种结构并不擅长做修改操作。一旦数据发生改动,就会引发内存realloc,可能导致内存拷贝。
11、hash随着数据的增大,其底层数据结构的实现是会发生变化的,当然存储效率也就不同。在field比较少,各个value值也比较小的时候,hash采用ziplist来实现;而随着field增多和value值增大,hash可能会变成dict来实现。当hash底层变成dict来实现的时候,它的存储效率就没法跟那些序列化方式相比了。
12、quicklist的每个节点都是一个ziplist,ziplist本身也是一个有序列表,而且是一个内存紧缩的列表(各个数据项在内存上前后相邻)。比如,一个包含3个节点的quicklist,如果每个节点的ziplist又包含4个数据项,那么对外表现上,这个list就总共包含12个数据项。
13、当数据较少时,sorted set是由一个ziplist来实现的。当数据多的时候,sorted set是由一个叫zset的数据结构来实现的,这个zset包含一个dict + 一个skiplist。dict用来查询数据到分数(score)的对应关系,而skiplist用来根据分数查询数据(可能是范围查找)。
14、redis一个database里的所有key-value数据都是由dict数据结构来维护的,其中key对应的数据结构是sds,而value的数据结构是redisobjs。redisobjs结构内type指定对外的数据类型(string,list,set,hash,sorted set),enconding指定内部存储对应的数据结构(sds,ziplist,quicklist,dict,skiplist...)
15、在使用 JedisPool 连接redis时,注意设置jedispool 的链接数大小,当连接数超过该值时,jedispool 会进行阻塞处理。
16、如果master同时收到多个slave发来的同步连接命令,master只会启动一个进程来写数据库镜像,然后发送给所有的slave。master同步数据时是非阻塞式的,可以接收用户的读写请求。然而在slave端是阻塞模式的,slave在同步master数据时,并不能够响应客户端的查询。
17、查看所有的连接客户端命名:redis-cli client list