Redis 命令行使用介绍
基础
登录命令:
redis-cli -h 127.0.0.1 -p 6379 -a <passport>
帮助:
[root@xiexianbin_cn ~]# redis-cli --help
redis-cli 3.2.8
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.
登录
redis-cli -h 127.0.0.1 -p 6379 -a <passport>
检测是否启动
127.0.0.1:6379[1]> ping
PONG
查看 client 信息
127.0.0.1:6379[1]> CLIENT LIST
切换数据库
Redis 支持多个 DB,默认是16
个(默认0-15
,支持 redis.conf 中配置),你可以设置将数据存在哪一个 DB 中,不同 DB 间的数据具有隔离性,选择数据库:
redis 127.0.0.1:6379> SELECT 1
redis 127.0.0.1:6379[1]>
keys 相关操作
keys *
keys *<key_name>
keys <key_name>
keys <key_name>*
exists <key_name>
127.0.0.1:6379[1]> DEL <key_name>
(integer) 1
设置 TTL (数据过期设置)
Redis 支持按 key 设置过期时间,过期后值将被删除(在客户端看来是补删除了的)
用 TTL 命令可以获取某个 key 值的过期时间(-1表示永不过期)
redis 127.0.0.1:6379> SET name "John Doe"
OK
redis 127.0.0.1:6379> TTL name
(integer) -1
下面命令先用EXISTS命令查看key值是否存在,然后设置了5秒的过期时间
redis 127.0.0.1:6379> SET name "John Doe" #[NX|XX]
OK
redis 127.0.0.1:6379> EXISTS name
(integer) 1
redis 127.0.0.1:6379> EXPIRE name 5
(integer) 1
等同于
redis 127.0.0.1:6379> SET name "John Doe" EX 5
5秒后再查看
redis 127.0.0.1:6379> EXISTS name
(integer) 0
redis 127.0.0.1:6379> GET name
(nil)
这个值已经没有了。上在是直接设置多少秒后过期,你也可以设置在某个时间点过期,下面例子是设置2011-09-24 00:40:00过期。
redis 127.0.0.1:6379> SET name "John Doe"
OK
redis 127.0.0.1:6379> EXPIREAT name 1316805000
(integer) 1
redis 127.0.0.1:6379> EXISTS name
(integer) 0
清空当前数据库
127.0.0.1:6379[1]> FLUSHDB
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
清空当所有据库
127.0.0.1:6379[1]> FLUSHALL
发布订阅
订阅:
redis 127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
发布:
redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"
(integer) 1
订阅结果:
1) "message"
2) "redisChat"
3) "Redis is a great caching technique"
数据类型
获取数据类型:
127.0.0.1:6379> TYPE <key_name>
hash
数据类型包括:
strings
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"
> set name1 1
> incr name1 # 加1
> decr name1 # 减1
> incrby name1 10 # 加10
> decrby name 10 # # 减10
lists/queue
list 分左右:LPUSH、RPUSH
# 放入元素
LPUSH imlist 1
LPUSH imlist 2
# 查看所有元素,开始为 0,最后一个元素为 -1
lrange <key> [start] [end]
lrange imlist 0 -1
rpush imlist 3
lrange imlist 0 -1
# 获取元素数量
llen <key>
# 重左面/右面获取元素,返回 value
LPOP/RPOP
lpop <key>
rpop <key>
# 延时获取值,返回 `key, value`,若为空则阻塞,0 一直阻塞
blpop <key> 0
brpop <key> 0
组合为队列(先入先出):
说明:
- 获取数据时,若无值直接返回 nil,会导致 CPU 等资源消耗过大,可以使用 brpop/blpop 添加一个阻塞时间
sets
127.0.0.1:6379> type _tooz_groups
set
127.0.0.1:6379> smembers _tooz_groups
1) "central-111111"
2) "ceilometer.notification"
3) "alarm_evaluator"
4) "central-global"
sadd <key-name> key1 key2 key3
smembers <key-name>
sadd <key-name> key4
# 判断是否存在
sismember <key-name> key5
# 移除元素
srem <key-name> key6
# 交集、并集、差集、补集,参考官方文档
SINTER s1 s2
SUNION s1 s2
SDIFF s1 s2
sorted sets/zsets
处理优先级任务:
- 权重最小的
zrange names 0 0
,使用后删除 zrem
- 权重最小的
zrevrange names 0 0
zadd <key-name> <score> <name>
zadd names 1 n1
zadd names 2 n2
zadd names 3 n3
zrange names 0 -1
zrange names 0 -1 withscores
zrevrange names 0 -1
zrevrange names 0 -1 withscores
zrem <key-name> <name>
hashes
127.0.0.1:6379[1]> HSET myhash field1 "Hello"
(integer) 0
127.0.0.1:6379[1]> KEYS *
1) "myhash"
127.0.0.1:6379[1]> TYPE myhash
hash
127.0.0.1:6379[1]> HKEYS myhash
1) "field1"
127.0.0.1:6379[1]> HGETALL myhash
1) "field1"
2) "Hello"
127.0.0.1:6379[1]> HGET myhash field1
"Hello"
hash map
hmset <key-name> key1 val1 key2 val2
hgetall <key-name>
hmset <key-name> key1 val1-1 key2 val3-1
hset <key-name> key1 val1-1
hmget <key-name> key1 key2
hsetnx <key-name> key1 key2
hget <key-name> key1
hexists <key-name> key1
hdel <key-name> key1
del <key-name>
hash set
SETEX
设置key,并添加 ttl(seconds),SETEX
是一个原子性(atomic)
操作,关联值和设置生存时间两个动作会在同一事务中完成,一般用作缓存
SETEX key seconds value
# 等价于
SET key value
EXPIRE key seconds # 设置生存时间
SETNX
SETNX(SET if Not eXists)
如果不存在 key,则 SET,当 key 存在时,设置不成功
SETNX key value
最佳实践
分布式锁
分布式锁
在分布式系统中控制多个进程对共有资源的访问,只有一个进程能访问成功(获取锁的进程)
- 分布式锁具有的性质
互斥性
同一时刻,只有一个客户端可以获取锁
安全性
锁的获取和释放是同一个客户端
可用性
高可用的分布式锁系统避免产生死锁
- set 原子方式加锁
SET <key> <value> NX EX <ttl>
说明:
- Redis 2.6.12 以后,直接使用 set 方法进行加锁,避免死锁
<key>
键
<value>
一般为随机值,由客户端生成
NX
表示不存在 key 时才能设置成功,SET IF NOT Exist
<ttl>
在 EX 后,表示过期时间,控制时效
- 不建议使用
setnx + expire 加锁
,可能产生死锁
- 比较删除解锁,
DEL Key
前判断是否为加锁的客户端,可以通过添加客户端的唯一 id 到 value 中,每次删除前比较,一致在进行删除解锁,保证安全性
运维
关闭redis
使用 shutdown 命令,保证 Redis 在退出之前将数据保存在磁盘上
redis-cli shutdown
保存
执行保存后,一般在 /var/lib/redis/dump.rdb
中
redis-cli save
monitor
monitor
用来监视 redis 处理的每一个命令,使用 Ctrl-C
停止监听
redis-cli monitor