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                   (--> 端口6379uptime_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"
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值