1 Gbit/s带宽的网络的延迟时间大约为200μs,而Unix域套接字的延迟时间可以低至30μs
redis:Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
#redis-cli
#redis-cli -h -p -a
切换db
通过命令来切换当前的db:select 0,该命令表示切换到第一个数据库。数据库id是从0到15,可以自由切换db,每个db的存储空间是不一样的。
dbsize:查看redis中的k数量
模糊批量删除:redis-cli -a "UBRedis#@2022" -n 6 KEYS "VMP_DEVICE_000000_5301*" | xargs redis-cli -a "UBRedis#@2022" -n 6 del
keys *:查看redis中所有的key
set key_1 v_1:新增一个key_1,包含v_1
get key_1:查看key_1中的内容
del key_1:删除key_1
exists(key):确认一个key是否存在
type(key):返回值的类型
randomkey:随机返回key空间的一个key
rename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除newname表示的key
ttl:获得一个key的活动时间
select(index):按索引查询
move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库
flushall:删除所有数据库中的所有key
flushdb:删除当前选择数据库中的所有key
save:将当前redis中的所有数据持久化到文件中,文件路径和文件名在redis.conf里配置
quit:关闭连接(connection)
模糊匹配:通配符 * ? [] 其匹配的字符跟一般的正则一样。
KEYS pattern
keys a* 可以匹配以a开头的字符串。keys语法简单,但是数据量大的时候容易出现超时异常。
keys dltp:user:*:domain
发布和订阅:
PUBLISH main "test"
SUBSCRIBE main
Redis的高级特性一览:
缓存系统
计数器
排行榜
实时系统
https://segmentfault.com/a/1190000020279468
Redis慢查询设置和查询:
https://www.cnblogs.com/huamei2008/p/8850047.html
https://blog.51cto.com/5148737/1976757
开启慢查询日志:
config set slowlog-log-slower-than 10000 (单位us)
config set slowlog-max-len 1024 日志最多存个数
config rewrite
1)获取慢查询语句:
命令:slowlog get [N]
选型:N,可选,代表获取的日志条数
例如:slowlog get 5
slowlog get
10.30.113.42:11100> slowlog get
1) 1) (integer) 0 #查询命令id
2) (integer) 1601368720 #命令的时间戳
3) (integer) 3964 #耗时:单位(us)
4) 1) "config" #操作命令
2) "rewrite" #操作参数
2) 获取慢查询日志列表当前长度
slowlog len
例如,当前Redis中有45条慢查询:
127.0.0.1:6370> slowlog len
(integer) 23
3)慢查询日志重置
slowlog reset
针对Redis的性能优化,主要从下面几个层面入手:
最初的也是最重要的,确保没有让Redis执行耗时长的命令
使用pipelining将连续执行的命令组合执行
操作系统的Transparent huge pages功能必须关闭:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
1
echo never > /sys/kernel/mm/transparent_hugepage/enabled
如果在虚拟机中运行Redis,可能天然就有虚拟机环境带来的固有延迟。可以通过./redis-cli —intrinsic-latency 100命令查看固有延迟。同时如果对Redis的性能有较高要求的话,应尽可能在物理机上直接部署Redis。
检查数据持久化策略
考虑引入读写分离机制
避免在使用这些O(N)命令时发生问题主要有几个办法:
不要把List当做列表使用,仅当做队列来使用
通过机制严格控制Hash、Set、Sorted Set的大小
可能的话,将排序、并集、交集等操作放在客户端执行
绝对禁止使用KEYS命令
避免一次性遍历集合类型的所有成员,而应使用SCAN类的命令进行分批的,游标式的遍历
网络引发的延迟
尽可能使用长连接或连接池,避免频繁创建销毁连接
客户端进行的批量数据操作,应使用Pipeline特性在一次交互中完成。具体请参照本文的Pipelining章节
1、事务的语法:
multi
命令1
命令2
...
exec
discard //放弃事务
1:语法错误:致命的错误,事务中的所有命令都不会执行
2:运行错误:不会影响事务中其他命令的执行
例如:进行转账业务操作:
复制代码
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby bankA 5000
QUEUED
127.0.0.1:6379> incrby bankB 5000
QUEUED
127.0.0.1:6379>
3、watch命令
watch命令可以监控一个和多个键,一旦被监控键的值被修改,阻止之后的一个事务执行(即执行exec时返回nil,但这时watch监控也会失效),还记得上面转账吗?当在转账事务过程中,bankA被取走了10000,余额变成0,这时操作转账时应该提示余额不足,无法转账。可以使用watch命令来阻止转账事务的执行。下面优化一下上面的转账业务:
二、生存时间
在实际开发中经常会遇到一些有时效的数据,比如限时优惠活动、缓存或验证码等,过一段时间需要删除这些数据。在关系数据库中一般需要维护一个额外的字段来存储过期时间,然后定期检测删除过期数据。而在redis中命令就可以搞定。
expire key seconds:返回1表示设置成功,0表示设置失败或该键不存在;
127.0.0.1:6379> expire lifecycle 30 #设置生存时间为30秒,最小单位是秒
(integer) 1
127.0.0.1:6379> ttl lifecycle #ttl查看还剩多久
(integer) 13
取消设置时间:persist key
pexpire key mileseconds 精确到毫秒
expireat [key] unix时间戳1351858600
EXPIREAT cache 1355292000 # 这个 key 将在 2012.12.12 过期
2、sort命令
除了上面的有序集合,redis还提供了sort命令,它可以对列表、集合、有序集合类型键进行排序,并且完成如关系数据库中关联查询类似的任务。
延迟性能测试:
redis-cli –latency -h -p命令是一个有助于解决和理解您可能遇到的Redis延迟问题的工具.它通过测量Redis服务器以毫秒为单位响应Redis PING命令的时间来实现.
redis-cli --latency -h 127.0.0.1 -p 6379
什么是最小值:0?最小值表示CLI发出PING的时间与收到回复的时间之间的最小延迟.换句话说,这是我们采样数据的绝对最佳响应时间.
什么是最大值:15?最大值与min相反.它表示CLI发出PING的时间与收到命令回复的时间之间的最大延迟.这是我们采样数据的最长响应时间.在我们的2839个样本的例子中,最长的事务需要15ms.
什么是平均值:0.12? avg值是我们所有采样数据的平均响应时间(以毫秒为单位).所以平均而言,从我们的2839个样本中,响应时间为0.12ms.
基本上,min,max和avg的数字越大越好.
3、关闭Transparent Huge Pages(THP)
THP会造成内存锁影响redis性能,建议关闭
Transparent HugePages :用来提高内存管理的性能
Transparent Huge Pages在32位的RHEL 6中是不支持的
执行命令 echo never > /sys/kernel/mm/transparent_hugepage/enabled
把这条命令添加到这个文件中/etc/rc.local
[root@550f9ed3bb64 data1]# redis-cli
127.0.0.1:6379> INFO
# Server
redis_version:3.2.12
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7897e7d0e13773f
redis_mode:standalone
os:Linux 3.10.0-693.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:27
run_id:8a7cfbde79cda4311040a6f6319d6d67b684ff44
tcp_port:6379
uptime_in_seconds:117831
uptime_in_days:1
hz:10
lru_clock:7543306
executable:/data1/dltp/redis-server
config_file:
# Clients
connected_clients:36
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:1545280
used_memory_human:1.47M
used_memory_rss:2547712
used_memory_rss_human:2.43M
used_memory_peak:1743352
used_memory_peak_human:1.66M
total_system_memory:269924921344
total_system_memory_human:251.39G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.65
mem_allocator:jemalloc-3.6.0
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1601368188
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
# Stats
total_connections_received:38
total_commands_processed:2928770
instantaneous_ops_per_sec:20
total_net_input_bytes:835927467
total_net_output_bytes:847620417
instantaneous_input_kbps:2.16
instantaneous_output_kbps:2.24
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:415
keyspace_misses:480
pubsub_channels:6
pubsub_patterns:0
latest_fork_usec:268
migrate_cached_sockets:0
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# CPU
used_cpu_sys:175.72
used_cpu_user:65.96
used_cpu_sys_children:0.02
used_cpu_user_children:0.00
# Cluster
cluster_enabled:0
# Keyspace
db0:keys=6,expires=0,avg_ttl=0
127.0.0.1:6379> INFO latest_fork_usec
127.0.0.1:6379> INFO latest_fork_usec
127.0.0.1:6379> INFO
# Server
redis_version:3.2.12
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7897e7d0e13773f
redis_mode:standalone
os:Linux 3.10.0-693.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:27
run_id:8a7cfbde79cda4311040a6f6319d6d67b684ff44
tcp_port:6379
uptime_in_seconds:117844
uptime_in_days:1
hz:10
lru_clock:7543319
executable:/data1/dltp/redis-server
config_file:
# Clients
connected_clients:36
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:1545280
used_memory_human:1.47M
used_memory_rss:2547712
used_memory_rss_human:2.43M
used_memory_peak:1743352
used_memory_peak_human:1.66M
total_system_memory:269924921344
total_system_memory_human:251.39G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.65
mem_allocator:jemalloc-3.6.0
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1601368188
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
# Stats
total_connections_received:38
total_commands_processed:2929018
instantaneous_ops_per_sec:21
total_net_input_bytes:835953854
total_net_output_bytes:847649893
instantaneous_input_kbps:2.29
instantaneous_output_kbps:2.38
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:415
keyspace_misses:480
pubsub_channels:6
pubsub_patterns:0
latest_fork_usec:268
migrate_cached_sockets:0
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# CPU
used_cpu_sys:175.74
used_cpu_user:65.97
used_cpu_sys_children:0.02
used_cpu_user_children:0.00
# Cluster
cluster_enabled:0
# Keyspace
db0:keys=6,expires=0,avg_ttl=0
[root@aabb7c8569ec mxnet_dis]# redis-cli --help
redis-cli 3.2.12
Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
-h <hostname> Server hostname (default: 127.0.0.1).
-p <port> Server port (default: 6379).
-s <socket> Server socket (overrides hostname and port).
-a <password> Password to use when connecting to the server.
-r <repeat> Execute specified command N times.
-i <interval> When -r is used, waits <interval> seconds per command.
It is possible to specify sub-second times like -i 0.1.
-n <db> Database number.
-x Read last argument from STDIN.
-d <delimiter> Multi-bulk delimiter in for raw formatting (default: \n).
-c Enable cluster mode (follow -ASK and -MOVED redirections).
--raw Use raw formatting for replies (default when STDOUT is
not a tty).
--no-raw Force formatted output even when STDOUT is not a tty.
--csv Output in CSV format.
--stat Print rolling stats about server: mem, clients, ...
--latency Enter a special mode continuously sampling latency.
--latency-history Like --latency but tracking latency changes over time.
Default time interval is 15 sec. Change it using -i.
--latency-dist Shows latency as a spectrum, requires xterm 256 colors.
Default time interval is 1 sec. Change it using -i.
--lru-test <keys> Simulate a cache workload with an 80-20 distribution.
--slave Simulate a slave showing commands received from the master.
--rdb <filename> Transfer an RDB dump from remote server to local file.
--pipe Transfer raw Redis protocol from stdin to server.
--pipe-timeout <n> In --pipe mode, abort with error if after sending all data.
no reply is received within <n> seconds.
Default timeout: 30. Use 0 to wait forever.
--bigkeys Sample Redis keys looking for big keys.
--scan List all keys using the SCAN command.
--pattern <pat> Useful with --scan to specify a SCAN pattern.
--intrinsic-latency <sec> Run a test to measure intrinsic system latency.
The test will run for the specified amount of seconds.
--eval <file> Send an EVAL command using the Lua script at <file>.
--ldb Used with --eval enable the Redis Lua debugger.
--ldb-sync-mode Like --ldb but uses the synchronous Lua debugger, in
this mode the server is blocked and script changes are
are not rolled back from the server memory.
--help Output this help and exit.
--version Output version and exit.
Examples:
cat /etc/passwd | redis-cli -x set mypasswd
redis-cli get mypasswd
redis-cli -r 100 lpush mylist x
redis-cli -r 100 -i 1 info | grep used_memory_human:
redis-cli --eval myscript.lua key1 key2 , arg1 arg2 arg3
redis-cli --scan --pattern '*:12345*'
(Note: when using --eval the comma separates KEYS[] from ARGV[] items)
When no command is given, redis-cli starts in interactive mode.
Type "help" in interactive mode for information on available commands
and settings.
2、对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
3、对String操作的命令
set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string(它们的名称为key1,key2…)的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赋值,名称为key i的string赋值value i
msetnx(key1, value1, key2, value2,…key N, value N):如果所有名称为key i的string都不存在,则向库中添加string,名称key i赋值为value i
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的子串
4、对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时,若遇到名称为key i的list不存在或该list为空,则命令结束。如果timeout>0,则遇到上述情况时,等待timeout秒,如果问题没有解决,则对 keyi+1开始的list执行pop操作。
brpop(key1, key2,… key N, timeout):rpop的block版本。参考上一命令。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
5、对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的一个元素
6、对zset(sorted set)操作的命令
zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据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,WEIGHTSw1,…wN,AGGREGATESUM|MIN|MAX):对N个zset求并集和交集,并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score,在进行AGGREGATE运算前,都要乘以对于的WEIGHT参数。如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果集合中元素的score是所有集合对应元素进行SUM运算的值,而MIN和MAX是指,结果集合中元素的score是所有集合对应元素中最小值和最大值。
7、对Hash操作的命令
hset(key, field, value):向名称为key的hash中添加元素field<—>value
hget(key, field):返回名称为key的hash中field对应的value
hmget(key, field1, …,field N):返回名称为key的hash中field i对应的value
hmset(key, field1, value1,…,field N, value N):向名称为key的hash中添加元素field i<—>value i
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
8、持久化
save:将数据同步保存到磁盘
bgsave:将数据异步保存到磁盘
lastsave:返回上次成功将数据保存到磁盘的Unix时戳
shundown:将数据同步保存到磁盘,然后关闭服务
#bgrewriteaof 数据持久化 aof的方式保存
#redis-check-aof --fix 进行修复
压缩aof文件:
redis-cli -a jinn@hua#2021 BGREWRITEAOF
1:M 23 Mar 07:41:52.027 * Residual parent diff successfully flushed to the rewritten AOF (0.00 MB)
1:M 23 Mar 07:41:52.029 * Background AOF rewrite finished successfully
Redis利用持久化进行数据迁移:
https://blog.csdn.net/weixin_33984032/article/details/89898547
9、远程服务控制
info:提供服务器的信息和统计
monitor:实时转储收到的请求
slaveof:改变复制策略设置
config:在运行时配置Redis服务器
Redis的软件看门狗:
http://ghoulich.xninja.org/2016/12/30/how-to-monitor-delay-issue-of-redis-system/
Redis 2.6版本引入一个名为Redis软件看门狗的调试工具,它可以用来跟踪上述的各种延迟问题,你不必再使用其他工具来分析问题了。
开启:
redis-cli config set watchdog-period 500 (毫秒)
关闭:
redis-cli config set watchdog-period 0
7大缓存经典问题:
https://www.yuque.com/jifeng-bvojj/elllo4/apywyq
参照资料:
https://www.cnblogs.com/wangsicongde/p/7588658.html
http://ghoulich.xninja.org/2016/12/30/how-to-monitor-delay-issue-of-redis-system/
https://baike.baidu.com/item/Redis/6549233?fr=aladdin