Redis服务常用命令

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

猜你喜欢

转载自blog.csdn.net/huapeng_guo/article/details/131598633