Redis 基础命令实战,redis命令实战
Redis 基础命令实战
- 目录
- Redis基础命令演示+讲解
- Redis数据结构:String字符串
- Redis数据结构:哈希hash
- Redis数据结构:列表list
- Redis数据结构:集合set
- Redis数据结构:有序集合sortedset
Redis基础命令演示+讲解
$ ./redis-cli (--> 启动客户端)
127.0.0.1:6379> ping (--> 测试是否连接成功)
PONG (--> PONG表示成功)
127.0.0.1:6379> keys *
1) "a"
127.0.0.1:6379> info (--> 查看系统信息)
# Server
redis_version:2.8.0 (--> Redis的版本)
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:b94c80137a5a30dd
redis_mode:standalone
os:Darwin 17.4.0 x86_64
arch_bits:64
multiplexing_api:kqueue
gcc_version:4.2.1 (--> gcc依赖的版本)
process_id:2513 (--> 进程ID)
run_id:2ca59f8410854dfd760112f530bc726d4e9317cb
tcp_port:6379 (--> 端口6379)
uptime_in_seconds:246 (--> 运行时间(秒))
uptime_in_days:0 (--> 运行时间(天))
hz:10
lru_clock:751494
config_file:
# Clients
connected_clients:1 (--> 连接的客户端数量)
client_longest_output_list:0 (--> slave的数量)
client_biggest_input_buf:0
blocked_clients:0
# Memory (--> 使用内存的一些说明)
used_memory:1002816 (--> Redis 分配的内存总量)
used_memory_human:979.31K
used_memory_rss:2072576 (--> Redis 分配的内存总量(包括内存碎片))
used_memory_peak:1002016
used_memory_peak_human:978.53K (--> Redis所用内存的高峰值)
used_memory_lua:33792
mem_fragmentation_ratio:2.07 (--> 内存碎片比率)
mem_allocator:libc
# Persistence (--> 持久化备份的一些参数)
loading:0
rdb_changes_since_last_save:0 (--> 上次保存数据库之后,执行命令的次数)
rdb_bgsave_in_progress:0 (--> 后台进行中的 save 操作的数量)
rdb_last_save_time:1517464135 (--> 最后一次成功保存的时间点,以 UNIX 时间戳格式显示)
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
aof_enabled:0 (--> redis是否开启了aof备份模式)
aof_rewrite_in_progress:0 (--> 后台进行中的 aof 文件修改操作的数量)
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
# Stats (--> 各种状态)
total_connections_received:1 (--> 运行以来连接过的客户端的总数量)
total_commands_processed:2 (--> 运行以来执行过的命令的总数量)
instantaneous_ops_per_sec:0
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0 (--> 运行以来过期的 key 的数量)
evicted_keys:0 (--> 运行以来删除过的key的数量)
keyspace_hits:0 (--> 命中 key 的次数)
keyspace_misses:0 (--> 不命中 key 的次数)
pubsub_channels:0 (--> 当前使用中的频道数量)
pubsub_patterns:0 (--> 当前使用的模式的数量)
latest_fork_usec:0
# Replication (--> 主从同步相关的数据)
role:master (--> 当前实例的角色master还是slave)
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 (--> CPU)
used_cpu_sys:0.04
used_cpu_user:0.04
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
# Keyspace (--> 数据库)
db0:keys=1,expires=0,avg_ttl=0 (--> 各个数据库的 key 的数量,以及带有生存期的 key 的数量)
db10:keys=4,expires=0,avg_ttl=0
127.0.0.1:6379> select 1 (--> 选择第一个database)
OK
127.0.0.1:6379[1]> keys * (--> 查看当前数据库都有那些键)
(empty list or set)
127.0.0.1:6379[1]> set 1 1
OK
127.0.0.1:6379[1]> flushdb (--> 清除当前database,再次使用info命令,会发现已经没有这个数据库)
OK
127.0.0.1:6379[1]> flushall (--> 清除所有database)
OK
127.0.0.1:6379> dbsize (--> 当前db的数量)
(integer) 0
127.0.0.1:6379> set a a
OK
127.0.0.1:6379> set b b
OK
127.0.0.1:6379> keys *
1) "a"
2) "b"
127.0.0.1:6379> dbsize
(integer) 2
127.0.0.1:6379> save (--> 人工手动保存)
OK
127.0.0.1:6379> quit (--> 退出当前redis客户端连接)
Redis 常用键命令演示+讲解
able@localhost:/Documents/Java/Tools/Redis/redis-2.8.0/src $ ./redis-cli
127.0.0.1:6379> set test test (--> 新增key)
OK
127.0.0.1:6379> keys * (--> 查询)
1) "test"
2) "a"
3) "b"
127.0.0.1:6379> del test (--> 删除键值)
(integer) 1 (--> 1:表示成功)
127.0.0.1:6379> del xxx
(integer) 0 (--> 0:表示失败)
127.0.0.1:6379> keys * (--> 查询所有键值)
1) "a"
2) "b"
## ------------------------------邪恶分割线--------------------------------
127.0.0.1:6379> exists a (--> 判断是否存在)
(integer) 1 (--> 1:表示存在)
127.0.0.1:6379> exists m
(integer) 0 (--> 0:表示不存在)
127.0.0.1:6379> ttl a (--> 查看这个key 的剩余生存时间,单位为秒 - time to live)
(integer) -1 (--> -1:负1表示这个key 是没有过期时间的)
127.0.0.1:6379> expire a 10 (设置key的过期时间/秒,单点登录session有效期可以使用)
(integer) 1
127.0.0.1:6379> ttl a (--> 查看剩余生存时间,从上面设置成共就开始倒计时)
(integer) 2 (--> 剩余的生存时间 2秒)
......
127.0.0.1:6379> ttl a
(integer) -2 (--> -2:负2表示这个key不存在)
## ------------------------------邪恶分割线--------------------------------
127.0.0.1:6379> type b (--> type:查看key的类型)
string (--> 字符串)
127.0.0.1:6379> hset hash name tom (--> 设置一个key为hash,hash=tom)
(integer) 1 (--> 1:表示成功)
127.0.0.1:6379> type hash (--> 查看类型)
hash (--> 可以看到返回的是Hash)
127.0.0.1:6379> randomkey (--> 随机生成key)
"hash"
127.0.0.1:6379> keys *
1) "hash"
2) "b"
127.0.0.1:6379> set a a (生成一个key,a=a)
OK
127.0.0.1:6379> set c c (生成一个key,c=c)
OK
127.0.0.1:6379> keys *
1) "a"
2) "hash"
3) "b"
4) "c"
127.0.0.1:6379> rename a d (--> 重命名)
OK
127.0.0.1:6379> keys *
1) "b" (--> 很明显已经重命名成功,a -> d)
2) "d"
3) "hash"
4) "c"
127.0.0.1:6379> get d (--> 验证一下,获取看到 d = a,说明对的)
"a"
127.0.0.1:6379> set d d (--> 将d的值设置为d,redis会直接覆盖不会校验是否已存在)
OK
127.0.0.1:6379> get d (--> 查看)
"d"
127.0.0.1:6379> rename b c (--> 重命名b改为c,c因为这里key已经存在,会直接覆盖)
OK (--> OK:表示成功)
127.0.0.1:6379> get c (--> 查看)
"b"
127.0.0.1:6379> keys *
1) "d"
2) "hash"
3) "c"
127.0.0.1:6379> set a a
OK
127.0.0.1:6379> set b b
OK
127.0.0.1:6379> set c c
OK
127.0.0.1:6379> set d d (--> 将abcd重新赋值为与键值相同)
OK
127.0.0.1:6379> keys *
1) "b"
2) "a"
3) "d"
4) "hash"
5) "c"
127.0.0.1:6379> renamenx a b (--> nx结尾的命令,一般都有逻辑判断,这里是重命名)
(integer) 0 (--> 0:表示失败!从上面rename可以看到OK才表示成功)
Redis数据结构:String字符串
127.0.0.1:6379> flushall (--> 学习开始直接清空)
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>
127.0.0.1:6379> set a a
OK
127.0.0.1:6379> set b b
OK
127.0.0.1:6379> setex c 100 c (--> setex设置c键,并设置有效期100秒)
OK
127.0.0.1:6379> keys *
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> ttl c (--> 查看这个key 的剩余生存时间,单位为秒)
(integer) 95
127.0.0.1:6379> psetex d 10000 d (--> psetex设置d键,并设置有效期10000毫秒,注意单位!)
OK
127.0.0.1:6379> ttl d
(integer) 8
127.0.0.1:6379> ttl d
(integer) 4
127.0.0.1:6379> get xx (--> 获取一个没有的键xx,会返回nil)
(nil) (--> 不存在)
127.0.0.1:6379> set word wordword
OK
127.0.0.1:6379> get word
"wordword"
127.0.0.1:6379> getrange word 0 2 (--> 获取word键的 0~2个元素,注意是闭合区间)
"wor"
127.0.0.1:6379> getrange word 3 5
"dwo"
127.0.0.1:6379> get a (--> 获取a的键值)
"a"
127.0.0.1:6379> getset a aa (--> getset:将a键的值设置为aa,并返回a键的原始值,这个命令很有用!!)
"a"
127.0.0.1:6379> get a (--> 重新获取,验证一下)
"aa"
127.0.0.1:6379> mset a1 a1 b1 b1 c1 c1 (--> mset同时设置一个或多个键值)
OK
127.0.0.1:6379> keys *
1) "b1"
2) "a1"
3) "b"
4) "word"
5) "a"
6) "c1"
7) "yyy"
127.0.0.1:6379> mget a1 b1 c1 word a b (--> mget同时获取一个或多个键值)
1) "a1"
2) "b1"
3) "c1"
4) "wordword"
5) "aa"
6) "b"
127.0.0.1:6379> keys *
1) "b1"
2) "a1"
3) "b"
4) "word"
5) "a"
6) "c1"
7) "yyy"
127.0.0.1:6379> get a
"aa"
127.0.0.1:6379> setnx a newavalue (--> 设置a键的值,因为a键已经存在)
(integer) 0 (--> 0:表示失败)
127.0.0.1:6379> setnx newvalue newvalue (--> 设置newvalue键)
(integer) 1 (--> 1:表示成功)
127.0.0.1:6379> strlen word (--> 查看字符串的长度)
(integer) 8
127.0.0.1:6379> msetnx q q w w (--> msetnx:批量设置1个或多个键,注意是不存在的,否则会失败!)
(integer) 1
127.0.0.1:6379> set 1 1
OK
127.0.0.1:6379> get 1
"1"
127.0.0.1:6379> incr 1 (--> 值加1,注意值必须是数字,否则会失败!)
(integer) 2
127.0.0.1:6379> incr 1
(integer) 3
127.0.0.1:6379> get 1
"3"
127.0.0.1:6379> get a
"aa"
127.0.0.1:6379> incr a (--> 因为a键的值不是数字,所以这里做运算会失败!!)
(error) ERR value is not an integer or out of range
127.0.0.1:6379> incrby 1 100 (--> incrby:增量,每次为1的键值加100)
(integer) 103
127.0.0.1:6379> incrby 1 100
(integer) 203
127.0.0.1:6379> get 1
"203"
127.0.0.1:6379> decr 1 (--> 相应的删除)
(integer) 202
127.0.0.1:6379> decrby 1 100 (--> 增量删除)
(integer) 102
127.0.0.1:6379> append 1 appendstr (--> 拼接字符串,直接追加到末尾,相信大家不会陌生)
(integer) 10
127.0.0.1:6379> get 1 (--> 获取验证)
"1appendstr"
Redis数据结构:哈希hash
127.0.0.1:6379> select 1 # 选择一个新库进行测试
OK
127.0.0.1:6379[1]> keys * # 获取所有的key
(empty list or set)
127.0.0.1:6379[1]> hset map name jim # set一个map
(integer) 1
127.0.0.1:6379[1]> keys *
1) "map"
127.0.0.1:6379[1]> type map # 查看map键的类型
hash
127.0.0.1:6379[1]> hexists map name # 查看map中是否存在name
(integer) 1 # 1:表示存在
127.0.0.1:6379[1]> hexists map xxx
(integer) 0 # 0:表示不存在
127.0.0.1:6379[1]> hget map name # 获取map键中的name的值
"jim"
127.0.0.1:6379[1]> hget map xxx # 同上
(nil) # nil:表示不存在
127.0.0.1:6379[1]> hset map age 18 # 再放一个age=18
(integer) 1 # 1:表示成功
127.0.0.1:6379[1]> hgetall map # hgetall:表示获取map键下所有的结果集
1) "name" # name=jim,age=18
2) "jim"
3) "age"
4) "18"
127.0.0.1:6379[1]> hkeys map # 获取map键中所有的key
1) "name"
2) "age"
127.0.0.1:6379[1]> hvals map # 获取map键所有的valus
1) "jim"
2) "18"
127.0.0.1:6379[1]> hlen map # 获取map键下值的个数
(integer) 2 # 很明显是name和age,2个
127.0.0.1:6379[1]> hmget map name age # 获取指定的key
1) "jim"
2) "18"
127.0.0.1:6379[1]> hmset map newname namevalue newage newagevalue # set指定map键中的key、value
OK # 成功
127.0.0.1:6379[1]> hmset map key1 value1 key2 value2
OK
127.0.0.1:6379[1]> hkeys map
1) "name"
2) "age"
3) "newname"
4) "newage"
5) "key1"
6) "key2"
127.0.0.1:6379[1]> hdel map key1 key2 # 删除map的key
(integer) 2
127.0.0.1:6379[1]> hkeys map
1) "name"
2) "age"
3) "newname"
4) "newage"
127.0.0.1:6379[1]> hsetnx map name newjim # 使用nx结尾的命令
(integer) 0 # 0:表示失败,因为name这个key已经存在
127.0.0.1:6379[1]> hgetall
(error) ERR wrong number of arguments for 'hgetall' command
127.0.0.1:6379[1]> hgetall map
1) "name"
2) "jim"
3) "age"
4) "18"
5) "newname"
6) "namevalue"
7) "newage"
8) "newagevalue"
127.0.0.1:6379[1]> hsetnx map color red # 重新set一个不存在的key
(integer) 1 # 1:表示成功
127.0.0.1:6379[1]> hgetall map # 查看所有
1) "name"
2) "jim"
3) "age"
4) "18"
5) "newname"
6) "namevalue"
7) "newage"
8) "newagevalue"
9) "color"
10) "red"
Redis数据结构:列表list
# **list可以重复
127.0.0.1:6379[1]> select 2 # 选择一个新库进行测试
OK
127.0.0.1:6379[2]> keys *
(empty list or set)
127.0.0.1:6379[2]> lpush list 1 2 3 4 5 6 7 8 9 10 # 创建list
(integer) 10
127.0.0.1:6379[2]> keys *
1) "list"
127.0.0.1:6379[2]> type list # 查看类型
list
127.0.0.1:6379[2]> llen list # 查看长度
(integer) 10
127.0.0.1:6379[2]> lrange list 0 2 # 根据角标获取0~2的元素
1) "10" # 这里注意取出的顺序
2) "9"
3) "8"
127.0.0.1:6379[2]> lset list 0 100 # 指定角标位置的值
OK
127.0.0.1:6379[2]> lrange list 0 2 # 重新获取
1) "100" # 很显然角标为0的位置从 0-->10
2) "9"
3) "8"
127.0.0.1:6379[2]> lindex list 5 # 通过索引获取 索引为5的元素
"5"
127.0.0.1:6379[2]> lpop list # 移除
"100" # 表示移除了 队列最前的元素100
127.0.0.1:6379[2]> rpop list # 移除
"1" # 表示移除了 队列最后的元素1
127.0.0.1:6379[2]> lrange list 0 100 # 获取交表从 0~100 的所有元素
1) "9"
2) "8"
3) "7"
4) "6"
5) "5"
6) "4"
7) "3"
8) "2"
Redis数据结构:集合set
# **set不可以重复,因为使用hashset实现的,所以它的复杂度为O1
127.0.0.1:6379[2]> select 3 # 切换空间
OK
127.0.0.1:6379[3]> keys *
(empty list or set)
127.0.0.1:6379[3]> sadd set a b c d # set几个新值
(integer) 4
127.0.0.1:6379[3]> keys *
1) "set"
127.0.0.1:6379[3]> type set # 类型
set
127.0.0.1:6379[3]> sadd set a # 添加一个a
(integer) 0 # 0:表示失败!,因为set不允许重复
127.0.0.1:6379[3]> scard set # scard:返回这个集合元素的数量
127.0.0.1:6379[3]> rename set set1 # 重命名
OK
127.0.0.1:6379[3]> keys *
1) "set1"
127.0.0.1:6379[3]> sadd set2 c d e f # 添加一个新的集合
(integer) 4
127.0.0.1:6379[3]> keys * # 查看所有的元素
1) "set1"
2) "set2"
127.0.0.1:6379[3]> smembers set1 # smembers:查看set1元素成员
1) "d"
2) "a"
3) "b"
4) "c"
127.0.0.1:6379[3]> smembers set2 # smembers:查看set2元素成员
1) "d"
2) "f"
3) "e"
4) "c"
(integer) 4
127.0.0.1:6379[3]> sdiff set1 set2 # 差集,对比上面查看
1) "a" # set1对set2的差集是a、b
2) "b"
127.0.0.1:6379[3]> sdiff set2 set1
1) "f"
2) "e"
127.0.0.1:6379[3]> sinter set1 set2 # 交集
1) "d"
2) "c"
127.0.0.1:6379[3]> sunion set1 set2 # 并集
1) "f"
2) "e"
3) "b"
4) "a"
5) "d"
6) "c"
127.0.0.1:6379[3]> srandmember set1 2 # srandmember;随机返回set1集合中的2个元素
1) "d"
2) "c"
127.0.0.1:6379[3]> sismember set1 a # sismember:set1集合中是否存在a元素
(integer) 1 # 1:存在
127.0.0.1:6379[3]> sismember set1 xxx
(integer) 0 # 0:不存在
127.0.0.1:6379[3]> smembers set1 # 查看set1集合的元素
1) "b"
2) "a"
3) "d"
4) "c"
127.0.0.1:6379[3]> srem set1 a b # 移除set1集合中的a、b元素
(integer) 2 # 成功
127.0.0.1:6379[3]> smembers set1
1) "d"
2) "c"
127.0.0.1:6379[3]> spop set2 # spop:"移除"并"返回"集合中的一个"随机"元素
"c" # "移除"并"返回"了c元素
127.0.0.1:6379[3]> smembers set2 # 查看,发现c元素果然被移除
1) "d"
2) "f"
3) "e"
Redis数据结构:有序集合sortedset
## 有序集合,复杂度O1,已经为它也是通过HashSet来实现的
127.0.0.1:6379[3]> select 4 # 切换空间
OK
127.0.0.1:6379[4]> keys *
(empty list or set)
127.0.0.1:6379[4]> zadd sortedset1 100 a 200 b 300 c # 创建新集合
(integer) 3
127.0.0.1:6379[4]> keys *
1) "sortedset1"
127.0.0.1:6379[4]> type sortedset1 # 类型
zset
127.0.0.1:6379[4]> rename sortedset1 sortedset # 重命名
OK
127.0.0.1:6379[4]> zcard sortedset # 查看元素数量
(integer) 3
127.0.0.1:6379[4]> zscore sortedset a # 查看a元素的值
"100"
127.0.0.1:6379[4]> zscore sortedset b
"200"
127.0.0.1:6379[4]> zscore sortedset c
"300"
127.0.0.1:6379[4]> zscore sortedset d
(nil) # 不存在
127.0.0.1:6379[4]> zcount sortedset 0 220 # 根据分数,查询排序0~220之间的数量
(integer) 2 # 2个
127.0.0.1:6379[4]> zcount sortedset 0 300
(integer) 3
127.0.0.1:6379[4]> zrank sortedset a # 查看a的索引
(integer) 0
127.0.0.1:6379[4]> zrank sortedset b # 查看b的索引
(integer) 1
127.0.0.1:6379[4]> zincrby sortedset 1000 a # 给 a的值增加1000
"1200"
127.0.0.1:6379[4]> zrank sortedset a # 查看重新排序后,a的索引
(integer) 2
127.0.0.1:6379[4]> zrange sortedset 0 100 # 根据排序,拿取所有的0~100元素
1) "b"
2) "c"
3) "a"
127.0.0.1:6379[4]> zrange sortedset 0 100 withscores # 根据排序,拿取所有的0~100元素 以及 对应的值
1) "b"
2) "200"
3) "c"
4) "300"
5) "a"
6) "1200"
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。