[TOC]
redis-cli +命令 直接执行命令
`redis-cli client list |grep -v "omem=0"`
这是配合了Linux命令,执行了redis命令
> * redis是单线程架构,所有的读写操作都是在是在一 条主线程上完成的。
> * 大的数据结构的拆分,避免使用keys ,sort命令
> * config set 动态的设置redis参数
> * redis bind 配置是连接redis绑定的网卡,如果绑定内网卡,则只能由内网卡对应的IP访问,外网同理。
* * * * *
### 1. 阻塞
1. 对于较大数据进行复杂度O(n)的操作
slowlog get<n> 查询出最近n条慢查询命令。解决办法:
1)修改为复杂度低的操作,禁用keys、sort等命令
2)查分较大的数据结构
2. 持久化造成的阻塞
1)fork阻塞
在RDB和AOF重写时,fork创建子进程,fork操作时间过长导致主线程的阻塞。info stats命令查看状态。
2)AOF
文件刷盘操作每秒执行一次,如果超过2秒,则阻塞后台进程直到fsync操作完成。
* * * * *
### 2. CPU、内存
* 单线程的Redis处理命令时只能使用一个CPU。而CPU 饱和是指Redis把单核CPU使用率跑到接近100%。使用 top命令很容易识别出对应Redis进程的CPU使用率。
* redis对内存的消耗主要包括:自身内存+对象内存+内存碎片
* redis是典型的cpu密集型应用,最好不要和其他多核密集型应用部署到一起。
* 为了充分利用多核CPU,通常一台机器部署多台redis实例。为了充分利用多核CPU,通常一台机器部署多台redis实例。子进程重写时对单核CPU使用率通常在90%以上,父进程与子进程将产生激烈CPU竞争,极大影响Redis稳定性。因此对于开启了持久化或参与复制的主节点不建议绑定CPU。
* * * * *
#### 2.1内存信息
* redis使用内存分为进程和子进程消耗两块
* info memory
命令获取内存使用相关信息,下面是执行命令得到的结果
~~~
127.0.0.1:6379> info memory
Memory
used_memory:2154128 ---由 Redis 分配器分配的内存总量,以字节(byte)为单位,redis存储的所有数据所占内存
used_memory_human:2.05M ---直观可读的内存总量
used_memory_rss:4263936---从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)
used_memory_rss_human:4.07M
used_memory_peak:2301128
used_memory_peak_human:2.19M
total_system_memory:2098147328
total_system_memory_human:1.95G
used_memory_lua:37888---Lua 引擎所使用的内存大小(以字节为单位)
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.98---used_memory_rss和used_memory以及它们的比值
mem_allocator:libc
~~~
说明:
* 当mem_fragmentation_ratio>1时说明used_memory_rss-used_memory多出来的内存没有用于数据存储,而是别内存碎片消耗,越大说明碎片越严重。
* 当mem_fragmentation_ratio<1时说明这种情况一般出现在操作系统把Redis内存交换(Swap)到硬盘导致,由于硬盘速度远远慢于内存,Redis性能会变得很差,甚至僵死。
#### 内存划分
![](https://box.kancloud.cn/efafd541621976a9a7e6ebbb94c15b22_388x234.png)
> 1. 对象内存:key对象和value对象
> 2. 缓冲内存:客户端缓冲区、复制积压缓冲区和AOF缓冲区
* * * * *
#### 2.2内存占用
* 对象内存是占用redis内存最大的,存储着用户的数据。
* 缓冲内存(客户端缓冲、复制积压缓冲、AOF缓冲)
#### 2.3内存管理
1. 设置内存上限
通过设置maxmemory参数限制最大可用内内存,或者config set maxmemory进行动态修改。
1)用于缓存:当超出内存上限maxmemory时,使用2)LRU等删除策略释放空间
3)防止所用内存超过服务器内存
4)方便实现一台服务器部署多个redis进程的内存控制
2. 内存回收
1)删除过期键对象
redis的所用键都可以设置过期属性,内部保存在过期字典中。
2)内存溢出控制
当redis所用内存达到maxmemory上限时会触发相应的溢出控制策略。
* * * * *
#### 2.4 内存优化
* redisObject结构体:
redis存储的所有值对象在内部定义为redisObject结构体。redisObject对象包含以下属性
1)type :表示当前对象使用的数据类型redis主要支持五种数据类型(string、hash、List、set、zset)
2) encode:表示当前对象采用哪种数据结构实现
3)lru:记录对象最后一次被访问的时间
4)refcount:记录当前对象被引用次数,当refcount=0时,可以安全回收对象空间。
5)ptr:对象的数据内容相关,如果是整数,直接存储数据,否则是指针
* 开发时尽量少对字符串频繁修改操作,例如append、setrange,用set 修改字符串,降低预分配带来的内存浪费和内存碎片。
* 利用hash结构对大规模的键进行重构,使用zipList编码可以减少内存消耗,如果是用hashtable编码反而会增加内存的消耗。---ziplist+hash优化keys
1. 如果有多个redis实例,尽量保证同一时刻只有一个子进程在工作
2. 避免大量写入时,子进程做重写操作,这样到这父进程维护大量的副本,造成内存消耗。
* * * * *
### 3. 数据持久化
* redis是内存数据库,所有运行时的数据都存在于内存中,如果redis服务器被关闭或者重启,所有数据将会消失,所以对数据进行持久化操作在某些环境下是非常必要的。redis的持久化操作有两种:
1)RDB(redis DB):在磁盘上以二进制文件的形式保存所有redis数据,文件名dump.rdb。
2)AOF(append only file):保存命令,文件名appendonly.aof。
* * * * *
#### 3.1 RDB
* 读取RDB恢复数据较快,由于数据量大,无法实时持久化。
将redis数据写到磁盘,覆盖原来的dump.rdb文件,这种数据的写入可以手工的触发,也可以通过配置文件自动执行。
1. 手动触发写入磁盘
1)save 命令:执行这个命令会阻塞redis服务器,服务器不能处理客户端请求。
2)bgsave:会创建子进程完成写入磁盘操作,会阻塞redis服务,阻塞时间为fork子进程所花费的时间,虽然时间可能很短,在高并发的业务场景下,可能也会拖慢数万条命令的执行。但是写入速度慢于save命令。
* rdb采用LZF算法存储,所有dump.rdb文件比内存中的数据小的多
* rdbacompression :yes表示开启压缩,no,不压缩
#### 3.2 fork进程开销
* info stats 命令
![](https://box.kancloud.cn/4eeda7f6666c0af341f92ea13f8bf852_489x417.png)
~~~
total_connections_received:7 # redis一共服务了多少个连接
total_commands_processed:41 # redis处理多少个命令
latest_fork_usec:209 # 最近一次fork子进程所花费的时间(微秒)
~~~
* save命令适合于在客户端请求少的情况下使用,很快的完成数据的备份,bgsave虽然备份速度较慢但是不会阻塞redis服务器,应该根据实际的情况选择不同的备份命令。
2. 配置文件的方式备份
在redis的配置文件中redis.conf中默认开启了RDB备份模式。文件中有如下配置
save 900 1
save 300 10
save 60 10000
save <秒> <操作次数>
* 表示在规定秒数内,如果有N个键值对发生变化,则触发备份,上面的条件任意一个满足就会触发,并且这些条件不会叠加。在完成一次备份产生dump.rdb文件后,时间和次数计数器将会被清零。
* * * * *
#### 3.3 AOF
* AOF在redis.conf配置文件中默认默认不开启---
~~~
appendonly no ---yes 开启
appendfsync everysec ---默认每秒持久化一次
auto-aof-rewrite-percentage 100 --- .aofwen文件大小超过一倍时发生重写
auto-aof-rewrite-min-size 64mb ---.aof文件大小超过64M发生重写
no-appendfsync-on-rewrite
~~~
#### 3.4 改善fork消耗性能
1. 优先使用物理机或者高效支持虚拟化的技术,避免使用Xen。
2. 控制redis实例最大可用内存,fork耗时和内存成正比,线上redis实例内存控制在10G以内。
> * no-appendfsync-on-rewrite:指定是否在后台aof文件rewrite期间调用fsync,默认为no,表示要调用fsync(无论后台是否有子进程在刷盘)。Redis在后台写RDB文件或重写afo文件期间会存在大量磁盘IO,此时,在某些linux系统中,调用fsync可能会阻塞。
* AOF重写:为了控制appendonly.aof文件的大小,redis提供了重写功能,重写会重整一些命令,减少命令的数量,并且使得数据不发生改变也不会阻塞redis服务。
* AOF持久化会将命令追加到appendonly.aof文件的末尾,只要redis重新执行这些命令就可以还原数据,在一些由于误操作导致数据丢失,可以将appendonly.aof文件中的操作删掉来恢复数据。最开始命令被写入内存缓冲区中,等到缓冲区被填满或者用户调用fsync、fdatasync命令才将命令写入到磁盘文件。触发命令持久化有三种方式always、everysec、no。
1. always:redis服务器每当接受一条命令都会调用fdatasync命令,将缓冲区的命令追加到文件中。这种方式可以保证数据的零丢失。
2. everysec:redis服务器每秒钟都会调用fdatasync命令,将缓冲区的命令追加到文件中。这种方式可以最多会丢失一秒钟的数据。
3. no:服务器不主动调用fdatasync命令,由操作系统决定何时将缓冲区的命令追加到文件当中去,所以发生意外的时候丢失的数据是无法预料的。
* 这两种持久化方式可以同时使用,根据需要判断,但是还原数据时优先使用AOF持久化。可见,从持久化角度讲,always是最安全的。从效率上讲,no是最快的。而redis默认设置进行了折中,选择了everysec。合情合理。
bgrewriteaof机制,在一个子进程中进行aof的重写,从而不阻塞主进程对其余命令的处理,同时解决了aof文件过大问题。
现在问题出现了,同时在执行bgrewriteaof操作和主进程写aof文件的操作,两者都会操作磁盘,而bgrewriteaof往往会涉及大量磁盘操作,这样就会造成主进程在写aof文件的时候出现阻塞的情形,现在no-appendfsync-on-rewrite参数出场了。如果该参数设置为no,是最安全的方式,不会丢失数据,但是要忍受阻塞的问题。如果设置为yes呢?这就相当于将appendfsync设置为no,这说明并没有执行磁盘操作,只是写入了缓冲区,因此这样并不会造成阻塞(因为没有竞争磁盘),但是如果这个时候redis挂掉,就会丢失数据。丢失多少数据呢?在Linux的操作系统的默认设置下,最多会丢失30s的数据。
### 3.4 持久化对性能的影响
> * 它的运行过程主要涉及CPU、内存、硬盘三部分 的消耗。
* CPU
* 子进程在把内存数据向硬盘持久化时,属于CPU的密集操作,对于单核CPU利用率会达到90%左右。会和父进程产生单核资源竞争。
所以不要把redis和其他CPU密集型服务放在一起,CPU竞争太激烈。
* info Persistence
查看持久化信息,是否发生阻塞redis,AOF如果持久化距离上次持久化超过2秒,主线程将阻塞,直到同步操作完成。如果AOF发生延迟,可能是磁盘压力较大,使用iotop定位消耗IO资源的进程。
* * * * *
### 4.Linux系统对Redis服务的影响
* overcommit:
Linux对大部分内存的请求都回复yes,以便能够运行更多的程序,但是申请内存后并不会马上使用内存,这种技术叫做overcommit。overcommit_memory对应有三个值,分别是0,1,2
0:Linux内核会检查内存是否足够,内存足够的话内存申请就会通过,否则失败并把错误返回给应用程序。
1:允许超量使用内存,知道用完为止。、
2:内核不会过量使用内存,系统整个内存地址空间不会超过swap+50%RAM。
* swap 交换分区
Linux在内存不足时会使用磁盘充当内存使用,解决一定内存紧缺的问题。
* * * * *
### 5.Pipeline
* redis客户端执行一条命令经过以下四个过程
1)发送命令
2)命令排队
3)命令执行
4)返回结果
其中1)+4)称为RoundTripTime(RTT,往返时间)。
* Redis提供了批量操作命令(例如mget、mset等),有效地节约RTT。但大部分命令是不支持批量操作的,例如要执行hgetall命令,并没有相关的批处理命令
* Pipeline(流水线)机制能改善上面这类问题,它能将一组Redis命令进行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给客户端------Java支持Pipeline
* redis批命令与Pipeline对比
1)原生批量命令是原子的,Pipeline是非原子的。
2)原生批量命令是一个命令对应多个key,Pipeline支持多个命令。·原生批量命令是Redis服务端支持实现的,而Pipeline需要服务端和客户端的共同实现。
* * * * *
### 6. 客户端管理
#### 6.1 client list、info clients
> * client list 会列出与redis服务端连接所有客户端连接信息。
![](https://box.kancloud.cn/b45a126c83d8154b0459900b1e937918_920x72.png)
> * clientlist中的age和idle分别代表当前客户端已经连接的时间和最近一次的空闲时间
> 1. id:
客户端连接唯一标识,ID随着redis客户端的连接而自增长。redis重启后重置为0
> 2. addr:
客户端连接的IP和端口号
> 3. fd:
socket的文件描述符,与lsof命令结果中的fd是同一个,如果fd=-1代表当前客户端不是外部客户端,而是Redis内部的伪装客户端。
> 4. qbuf、qbuf-free :输入缓冲区
redis为每个客户端发来的命令分配输入缓冲区,临时保存命令。redis会从输入缓冲区中拉去命令然后执行。qbuf、qbuf-free代表输入缓冲区大小,输入缓冲区剩余
> * 输入缓冲区的大小会根据实际情况动态的分配,不能配置,但是大小不会超过1G,`否则这个客户端将会被关闭。`
> 5. cmd
客户端执行的命令
* info clients:查看redis集群连接状态
![](https://box.kancloud.cn/5b7b969dd1f601182fcc8d225ad23753_364x141.png)
可以查看连接的总数,阻塞的连接总数,最大输入缓冲区的连接。
client_ longest_ output_ list: 最大的客户端连接的输出缓冲区对象个数
* * * * *
#### 6.2 输入缓冲区的问题
1. 一旦某个客户端的输入缓冲区超过1G,这个客户将会被关闭。
2. 输入缓冲区不受maxmemory控制,假设一个Redis实例设置了maxmemory为4G,已经存了2G数据,但是如果此时输入缓冲区使用了3G,已经超过maxmemory限制,可能会产生数据丢失、键值淘汰、OOM等情况。
* 输入缓冲区过大的原因
1. redis的处理速度跟不上输入缓冲区的输入命令速度。
2. 输入缓冲区中包含大量的bigkey
3. redis发生了阻塞,短时间内不能处理缓冲区的命令,导致了堆积。
* * * * *
#### 6.3 解决输入缓冲区的办法
1. 定期执行client list,收集输入缓冲区记录,分析出有问题的客户端连接。
2. 通过 info clients 找到最大的输入缓冲区,client_biggest_input_buf,可以设置超过10m就报警。
![](https://box.kancloud.cn/5b7b969dd1f601182fcc8d225ad23753_364x141.png)
#### 6.4 输出缓冲区
* 为客户端的命令执行结提供缓冲,和输入缓冲区对应。
与输入缓冲区不同的是,输出缓冲区的容量可以通过参数client-output-buffer-limit来进行设置,并且输出缓冲区做得更加细致,按照客户端的不同分为三种:普通客户端、发布订阅客户端、slave客户端。
> * 配置规则
~~~
client- output- buffer- limit < class> < hard limit> < soft limit> < soft seconds>
~~~
`config set client-output-buffer-limit normal 20mb 10mb 120`
> 表示超过10mb,并且连接了120秒,立即连接,如果超过20mb,也立即关闭。把普通客户端输入缓冲区控制起来,防止错误发生。
<class>:客户端类型,分为三种。
a)normal:普通客户端;
b)slave:slave客户端,用于复制;
c)pubsub:发布订阅客户端。
<hardlimit>:如果客户端使用的输出缓冲区大于<hardlimit>,客户端会被立即关闭。
<softlimit>和<softseconds>:如果客户端使用的输出缓冲区超过了<softlimit>并且持续了<softlimit>秒,客户端会被立即关闭
clientlist中的obl代表固定缓冲区的长度,oll代表动态缓冲区列表的长度,omem代表使用的字节数。例如下面代表当前客户端的固定缓冲区的长度为0,动态缓冲区有4869个对象,两个部分共使用了133081288字节=126M
* 输出缓冲区可能造成内存的抖动。
![](https://box.kancloud.cn/fd33a149270835623d8427c4595810de_432x202.png)
#### 6.5 动态设置最大连接数
~~~
config set maxclients 500 # 动态设置同一时间最大连接数。
config get maxclients # 查询最大连接数
~~~
#### 6.6 客户端超时时间
* 执行
`client list`
![](https://box.kancloud.cn/2ed077a8cd9359f64c212ee1a915b7de_1546x61.png)
age:表示客户端已经连接时间
idle:最近一次空闲时间
* 如果发现jedis的idle时间过长,肯定有问题,没有关闭连接。可以设置timeout超时时间,超时就断开连接。redis默认配置idle超时时间为0;
* 如果设置了超时时间,注意对jedis pool 客户端的影响。
![](https://box.kancloud.cn/168ef5b745cbc1a15169a1445764805b_857x160.png)
### 7.主从复制
1. 主从架构中,数据由主节点流向从节点(单向)
2. 主节点和从节点的数据复制的偏移量正常应该一致(info replication)
3. 主从关系首次建立后,主从连接正常,主会把全部数据发送给从节点,此时特别消耗性能。
![](https://box.kancloud.cn/f1fd61928d4816adfff30c5ce8e7947d_610x629.png)
问题:
> 当主从节点网络中断后,从节点再次连上主节点时会发送psync{offset}{runId}命令请求部分复制,如果请求的偏移量不在主节点的积压缓冲区内,则无法提供给从节点数据,因此部分复制会退化为全量复制。全量复制导致性能下降
#### 7.1 repl-disable-tcp-nodelay:默认关闭
![](https://box.kancloud.cn/11a7c9fd5e35ad0f6972db89870ead57_729x96.png)
* 当关闭时,主节点产生的命令会及时发送给从节点,增加了网络消耗
* 当开启时,主节点会合并较小的TCP数据包从而节省带宽。默认发送时间间隔取决于Linux的内核,一般默认为40毫秒.
#### 7.2 复制积压区
* 这个缓冲区可用于,主从复制数据丢失恢复
![](https://box.kancloud.cn/265cece58eaa5c6b038bf7e5cf62fa4e_502x228.png)
> 复制积压缓冲区是保存在主节点上的一个固定长度的队列,默认大小为1MB,当主节点有连接的从节点(slave)时被创建,这时主节点(master)响应写命令时,不但会把命令发送给从节点,还会写入复制积压缓冲区,
~~~
role:master
connected_slaves:1
slave0:ip=192.168.56.130,port=6379,state=online,offset=381567,lag=0 # slave复制偏移量,正常与master相等
master_repl_offset:381567 # master自身复偏移量
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:381566 # redis所有数据偏移量,参考master和slave复制偏移量,查看问题
~~~
![](https://box.kancloud.cn/68fb8933d2a35774c3215b5d7e321a9e_484x231.png)
#### 7.3 复制注意问题
1. 在首次建立主从复制关系后,主节点会执行bgsave命令,产生dump.rdb文件保存到本地,然后给 从节点发送rdb文件,之后异步的发送修改命令给从节点达到数据同步。
所有即使在没有开启RBD的情况下,也会产生rdb文件。
* 主节点没有没开启自动save
![](https://box.kancloud.cn/7802795b9b9b265d8b422e4027e97a08_254x142.png)
* 开启了AOF
![](https://box.kancloud.cn/47f4a2ff6ee0d42b5c97d5960e83ac03_841x304.png)
* 主节点的data目录,下多了dump文件
![](https://box.kancloud.cn/2b73a5a744af4ca16e88cf9e1dcb9a47_468x147.png)
* * * * *
* 主从数据同步超时
> * 针对数据量较大的节点,建议调大repl-timeout参数防止出现全量同步数据超时。例如对于千兆网卡的机器,网卡带宽理论峰值大约每秒传输100MB,在不考虑其他进程消耗带宽的情况下,6GB的RDB文件至少需要60秒传输时间,默认配置下,极易出现主从数据同步超时。
* 复制客户端缓冲区
> * 对于从节点开始接收RDB快照到接收完成期间,主节点仍然响应读写命令,因此主节点会把这期间写命令数据保存在复制客户端缓冲区内,当从节点加载完RDB文件后,主节点再把缓冲区内的数据发送给从节点,保证主从之间数据一致性。如果主节点创建和传输RDB的时间过长,对于高流量写入场景非常容易造成主节点复制客户端缓冲区溢出。默认配置为client-output-buffer-limitslave256MB64MB60,如果60秒内缓冲区消耗持续大于64MB或者直接超过256MB 时, 主节点将直接闭复制客户端连接, 造成全量同步失败。对应日志如下:
#### 7.4 引起全量复制的原因
1. 刚建立主从关系,第一次复制。这是无法避免的,所以注意建立主从关系的时机。
2. 节点运行ID不匹配。如果主节点重启后,runID发生改变,从节点记录的是以前的主节点ID,认为是新主,所以引发全量复制。建议开启哨兵服务。
3. 复制积压缓冲区不足:当主从复制中断后,再次复制,如果请求的偏移量不在复制积压缓冲区中,引起全量复制。在高并发的场景下,增加缓冲区大小,默认是1M。
### 8.bigkeys
* 能在从节点做,尽量在从节点做。
~~~
# -h 127.0.0.1 -p 6379
redis-cli --bigkeys
~~~
![](https://box.kancloud.cn/9f97e0a7c7df02bdb3a6a4a3ede9816a_850x499.png)
* * * * *
### 9. 慢查询
~~~
# 设置慢查询时间,单位微妙
config set slowlog-log-slower-than 200 # 超过200微妙为慢查询
config set slowlog-max-len 1000 # 设置保存慢查询记录条数
slowlog get 4 # 查询四条慢查询
slowlog len # 显示有多少条慢查询
slowlog reset # 清空慢查询
~~~
![](https://box.kancloud.cn/e8e8a32b16bae25095d451bd853d7354_543x342.png)
> * 每条慢查询四个属性
> * * * * *
> 1. 慢查询表示id
> 2. 查询发生时间撮
> 3. 查询消耗时间
> 4. 查询命令、参数
* 图中显示,系统保存128条慢查询记录
![](https://box.kancloud.cn/0e527e5f8b7553a590accf7a16a4624b_505x98.png)
* * * * *
### 10. 实时监控命令
* 实时监控redis数据库库信息,数据库键信息,占用内存,连接信息。。。
`redis-cli --stat`
![](https://box.kancloud.cn/fd22906e263610acc0547866b2222c44_838x316.png)
* * * * *
### 11. 误操作恢复
* 如果持久化是AOF的,并且在误操作后没有发生过重写,则修改屌误操作记录,然后使用 redis- check- aof
检查AOF格式是否正确,修复。然后重启redis
`sudo redis-check-aof --fix appendonly.aof`
* * * * *
### 12. 命令
#### 1.redis-cli
~~~
redis-cli 【option】【command】
~~~
* option
> 1. -r:(repeat),代表将命令重复执行
> redis-cli -r 3 ping
![](https://box.kancloud.cn/b0b2fb431fcfff11da6d3671cd6a0563_563x93.png)
> 2. -i : (interval),代表每隔几秒执行一次命令,必须和-r 一起使用
~~~
tuna@docker02:/etc/init.d$ redis-cli -r 3 -i 2 ping
PONG
PONG
PONG
~~~
> 3. -x,读取标准输入
~~~
tuna@docker01:~$ echo 'hello' | redis-cli -x set x
OK
~~~
> 4. -c:连接redis集群时使用
> 5. -a:加入redis密码
> 6. `--slave`:把客户端模拟成所连接redis节点的从节点,获得数据库更新信息。
![](https://box.kancloud.cn/2c1fab0b87b319a5cc7430a4a3169c72_1308x283.png)
> 7. `--latency`:测试客户端到redis服务器的网络延迟。
> 8. `--state`:实时查看redis信息,包括客户端连接数量,redis占用内存。。。
![](https://box.kancloud.cn/46232abb6431410b862a319ec5715fac_853x561.png)
> 9.` --raw`:返回格式化后的结果,`--no-raw`:返回原始格式
![](https://box.kancloud.cn/5049749a05e24c6fc3640f50b9748b46_507x199.png)
~~~
redis-cli shutdown # 关闭redis,自动持久化,shutdown 后可加nosave|save显示指定是否持久化
~~~
#### 2. redis-benchmark
> 测试redis并发量
> * -c:模拟出的客户端数量(默认50)
> * -n:模拟出客户端请求总数量(默认100000)
> * ` --csv`按照格式导出,便于后续处理,如导入到Excel
> * -t:指定测试的命令,如测试set、get等操作性能
~~~
redis-benchmark
redis-benchmark -c 100 -n 10000 # 显示的指出测试数量
~~~
> `redis-benchmark `
![](https://box.kancloud.cn/abd8a3f4e88ff878002961a2a76c839a_694x278.png)
如图,完成10万次操作用了4.94秒,由于用的是虚拟机,慢很多
* 指定测试操作命令,并格式化
![](https://box.kancloud.cn/a871116619176489e0592fe93215e59c_713x78.png)
- Docker
- 什么是docker
- Docker安装、组件启动
- docker网络
- docker命令
- docker swarm
- dockerfile
- mesos
- 运维
- Linux
- Linux基础
- Linux常用命令_1
- Linux常用命令_2
- ip命令
- 什么是Linux
- SELinux
- Linux GCC编译警告:Clock skew detected. 错误解决办法
- 文件描述符
- find
- 资源统计
- LVM
- Linux相关配置
- 服务自启动
- 服务器安全
- 字符集
- shell脚本
- shell命令
- 实用脚本
- shell 数组
- 循环与判断
- 系统级别进程开启和停止
- 函数
- java调用shell脚本
- 发送邮件
- Linux网络配置
- Ubuntu
- Ubuntu发送邮件
- 更换apt-get源
- centos
- 防火墙
- 虚拟机下配置网络
- yum重新安装
- 安装mysql5.7
- 配置本地yum源
- 安装telnet
- 忘记root密码
- rsync+ crontab
- Zabbix
- Zabbix监控
- Zabbix安装
- 自动报警
- 自动发现主机
- 监控MySQL
- 安装PHP常见错误
- 基于nginx安装zabbix
- 监控Tomcat
- 监控redis
- web监控
- 监控进程和端口号
- zabbix自定义监控
- 触发器函数
- zabbix监控mysql主从同步状态
- Jenkins
- 安装Jenkins
- jenkins+svn+maven
- jenkins执行shell脚本
- 参数化构建
- maven区分环境打包
- jenkins使用注意事项
- nginx
- nginx认证功能
- ubuntu下编译安装Nginx
- 编译安装
- Nginx搭建本地yum源
- 文件共享
- Haproxy
- 初识Haproxy
- haproxy安装
- haproxy配置
- virtualbox
- virtualbox 复制新的虚拟机
- ubuntu下vitrualbox安装redhat
- centos配置双网卡
- 配置存储
- Windows
- Windows安装curl
- VMware vSphere
- 磁盘管理
- 增加磁盘
- gitlab
- 安装
- tomcat
- Squid
- bigdata
- FastDFS
- FastFDS基础
- FastFDS安装及简单实用
- api介绍
- 数据存储
- FastDFS防盗链
- python脚本
- ELK
- logstash
- 安装使用
- kibana
- 安准配置
- elasticsearch
- elasticsearch基础_1
- elasticsearch基础_2
- 安装
- 操作
- java api
- 中文分词器
- term vector
- 并发控制
- 对text字段排序
- 倒排和正排索引
- 自定义分词器
- 自定义dynamic策略
- 进阶练习
- 共享锁和排它锁
- nested object
- 父子关系模型
- 高亮
- 搜索提示
- Redis
- redis部署
- redis基础
- redis运维
- redis-cluster的使用
- redis哨兵
- redis脚本备份还原
- rabbitMQ
- rabbitMQ安装使用
- rpc
- RocketMQ
- 架构概念
- 安装
- 实例
- 好文引用
- 知乎
- ACK
- postgresql
- 存储过程
- 编程语言
- 计算机网络
- 基础_01
- tcp/ip
- http转https
- Let's Encrypt免费ssl证书(基于haproxy负载)
- what's the http?
- 网关
- 网络IO
- http
- 无状态网络协议
- Python
- python基础
- 基础数据类型
- String
- List
- 遍历
- Python基础_01
- python基础_02
- python基础03
- python基础_04
- python基础_05
- 函数
- 网络编程
- 系统编程
- 类
- Python正则表达式
- pymysql
- java调用python脚本
- python操作fastdfs
- 模块导入和sys.path
- 编码
- 安装pip
- python进阶
- python之setup.py构建工具
- 模块动态导入
- 内置函数
- 内置变量
- path
- python模块
- 内置模块_01
- 内置模块_02
- log模块
- collections
- Twisted
- Twisted基础
- 异步编程初探与reactor模式
- yield-inlineCallbacks
- 系统编程
- 爬虫
- urllib
- xpath
- scrapy
- 爬虫基础
- 爬虫种类
- 入门基础
- Rules
- 反反爬虫策略
- 模拟登陆
- problem
- 分布式爬虫
- 快代理整站爬取
- 与es整合
- 爬取APP数据
- 爬虫部署
- collection for ban of web
- crawlstyle
- API
- 多次请求
- 向调度器发送请求
- 源码学习
- LinkExtractor源码分析
- 构建工具-setup.py
- selenium
- 基础01
- 与scrapy整合
- Django
- Django开发入门
- Django与MySQL
- java
- 设计模式
- 单例模式
- 工厂模式
- java基础
- java位移
- java反射
- base64
- java内部类
- java高级
- 多线程
- springmvc-restful
- pfx数字证书
- 生成二维码
- 项目中使用log4j
- 自定义注解
- java发送post请求
- Date时间操作
- spring
- 基础
- spring事务控制
- springMVC
- 注解
- 参数绑定
- springmvc+spring+mybatis+dubbo
- MVC模型
- SpringBoot
- java配置入门
- SpringBoot基础入门
- SpringBoot web
- 整合
- SpringBoot注解
- shiro权限控制
- CommandLineRunner
- mybatis
- 静态资源
- SSM整合
- Aware
- Spring API使用
- Aware接口
- mybatis
- 入门
- mybatis属性自动映射、扫描
- 问题
- @Param 注解在Mybatis中的使用 以及传递参数的三种方式
- mybatis-SQL
- 逆向生成dao、model层代码
- 反向工程中Example的使用
- 自增id回显
- SqlSessionDaoSupport
- invalid bound statement(not found)
- 脉络
- beetl
- beetl是什么
- 与SpringBoot整合
- shiro
- 什么是shiro
- springboot+shrio+mybatis
- 拦截url
- 枚举
- 图片操作
- restful
- java项目中日志处理
- JSON
- 文件工具类
- KeyTool生成证书
- 兼容性问题
- 开发规范
- 工具类开发规范
- 压缩图片
- 异常处理
- web
- JavaScript
- 基础语法
- 创建对象
- BOM
- window对象
- DOM
- 闭包
- form提交-文件上传
- td中内容过长
- 问题1
- js高级
- js文件操作
- 函数_01
- session
- jQuery
- 函数01
- data()
- siblings
- index()与eq()
- select2
- 动态样式
- bootstrap
- 表单验证
- 表格
- MUI
- HTML
- iframe
- label标签
- 规范编程
- layer
- sss
- 微信小程序
- 基础知识
- 实践
- 自定义组件
- 修改自定义组件的样式
- 基础概念
- appid
- 跳转
- 小程序发送ajax
- 微信小程序上下拉刷新
- if
- 工具
- idea
- Git
- maven
- svn
- Netty
- 基础概念
- Handler
- SimpleChannelInboundHandler 与 ChannelInboundHandler
- 网络编程
- 网络I/O
- database
- oracle
- 游标
- PLSQL Developer
- mysql
- MySQL基准测试
- mysql备份
- mysql主从不同步
- mysql安装
- mysql函数大全
- SQL语句
- 修改配置
- 关键字
- 主从搭建
- centos下用rpm包安装mysql
- 常用sql
- information_scheme数据库
- 值得学的博客
- mysql学习
- 运维
- mysql权限
- 配置信息
- 好文mark
- jsp
- jsp EL表达式
- C
- test