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 Server hostname (default: 127.0.0.1).
-p Server port (default: 6379).
-s Server socket (overrides hostname and port).
-a Password to use when connecting to the server.
-r Execute specified command N times.
-i When -r is used, waits seconds per command.
It is possible to specify sub-second times like -i 0.1.
-n Database number.
-x Read last argument from STDIN.
-d 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 Simulate a cache workload with an 80-20 distribution.
–slave Simulate a slave showing commands received from the master.
–rdb Transfer an RDB dump from remote server to local file.
–pipe Transfer raw Redis protocol from stdin to server.
–pipe-timeout In –pipe mode, abort with error if after sending all data.
no reply is received within 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 Useful with –scan to specify a SCAN pattern.
–intrinsic-latency Run a test to measure intrinsic system latency.
The test will run for the specified amount of seconds.
–eval Send an EVAL command using the Lua script at .
–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的元素,count0,则遇到上述情况时,等待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 = min且rank = min且score
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中添加元素fieldvalue
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 ivalue 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
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: SREWorks v1.5 版本发布 | 基于实时作业平台的日志聚类开源
在经过v1.0~v1.4四个版本迭代后,SREWorks的核心底座已经表现出极高的稳定性和成熟性。在v1.5版本中,SREWorks开发团队在核心底座上,进行了较多的数智化能力迭代。同时,在数智能力迭代过程中,我们也维持着与SREWorks用户较高的沟通频率。…