Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令 && 高级应用之 安全性 和 主从复制

Redis 提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以在 Linux 终端使用。

1. 键值相关命令;

2. 服务器相关命令

键值相关命令

keys 命令

返回满足给定 pattern 的所有 key。

【例】

127.0.0.1:> keys *
) "time"
) "list4"
) "list1"
) "email"
) "age"
) "myset6"
) "list3"
) "myhash"
) "myset4"
) "myset2"
) "list2"
) "app"
) "times"
) "realkey7"
) "key1"
) "gold"
) "myset1"
) "key3"
) "user:002"
) "myzset"
) "key4"
) "myset5"
) "realage"
) "real-age"
) "key2"
) "myset3"
) "list5"
) "name"
) "user:001"

用表达式 *,代表取出所有的 key(当前库里的所有的键)。

【例2】只显示 my 开头的键

127.0.0.1:> keys my*
) "myset6"
) "myhash"
) "myset4"
) "myset2"
) "myset1"
) "myzset"
) "myset5"
) "myset3"

exists 命令

确认一个 key 是否存在。

【例】

127.0.0.1:> exists name
(integer)

127.0.0.1:> exists school
(integer)

del 命令

删除一个 key。

【例】

127.0.0.1:> exists name
(integer) 127.0.0.1:> del name
(integer) 127.0.0.1:> del name
(integer) 127.0.0.1:> exists name
(integer)

expire 命令

设置一个(现有的) key 的过期时间。

【例】

127.0.0.1:> expire age
(integer) 127.0.0.1:> ttl age
(integer)
127.0.0.1:> ttl age
(integer)
127.0.0.1:> ttl age
(integer)
127.0.0.1:> ttl age
(integer)
127.0.0.1:> ttl age
(integer) -
127.0.0.1:> ttl age
(integer) -
127.0.0.1:> ttl age
(integer) -2

 127.0.0.1:6379> get age
  (nil)

move 命令

将当前数据库中的 key 转移到其他数据库中。

【注意】 select 命令:选择数据库。

【例】

127.0.0.1:> select 0
OK #代表选择 0 数据库 127.0.0.1:> set age
OK 127.0.0.1:> get age
"" 127.0.0.1:> move age
(integer) 127.0.0.1:> get age
(nil) 127.0.0.1:> select
OK 127.0.0.1:[]> get age
""

数据库名包括 0 - 15,共 16 个数据库;进入 Redis 客户端时,默认进入的是 0 数据库。

persist 命令

移除给定 key 的过期时间(取消定时)。

【例】

127.0.0.1:> expire age
(integer) 127.0.0.1:> ttl age
(integer) 127.0.0.1:> persist age
(integer) 127.0.0.1:> ttl age
(integer) -

randomkey 命令

随即返回 key 空间的一个 key。

【例】

127.0.0.1:> randomkey
"key3" 127.0.0.1:> randomkey
"myset3" 127.0.0.1:> randomkey
"myset3" 127.0.0.1:> randomkey
"myset3" 127.0.0.1:> randomkey
"times"

rename 命令

重命名 key。

【例】

127.0.0.1:> select
OK 127.0.0.1:[]> keys *
) "age" 127.0.0.1:[]> rename age age_new
OK 127.0.0.1:[]> keys *
) "age_new"

type 命令

返回值的类型。

【例】

127.0.0.1:> type key1
string 127.0.0.1:> type user:
hash 127.0.0.1:> type list5
list 127.0.0.1:> type myset3
set 127.0.0.1:> type myzset
zset

服务器相关命令

ping 命令

测试连接是否存活。

127.0.0.1:> ping
PONG

现在停止 Redis 服务(新开一个连接):

[root@localhost ~]# pkill redis-server

再使用 ping 命令:

127.0.0.1:> ping
Could not connect to Redis at 127.0.0.1:: Connection refused

再开启 Redis 服务(新连接):

[root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

ping:

127.0.0.1:> ping
PONG

echo 命令

在命令行打印一些内容。

【例】

127.0.0.1:6379> echo dee
"dee"

select 命令

选择数据库。Redis 数据库编号从 0 - 15,我们可以选择任意一个数据库来进行数据的存取。

选择 16 时,会报错。说明没有编号为 16 的数据库。

【例】

127.0.0.1:> select
(error) ERR invalid DB index

quite 命令(exit 命令或者 ctrl + c 都是退出连接)

退出连接。

【例】

127.0.0.1:> quit

[root@localhost ~] 

dbsize 命令

返回当前数据库中  key 的数目。

【例】

127.0.0.1:> dbsize
(integer)

说明此库中有 26 个 key。

info 命令

获取服务器的信息和统计。

【例】

127.0.0.1:> info
# Server
redis_version:2.8.
redis_git_sha1:
redis_git_dirty:
redis_build_id:e2559761bd460ca0
redis_mode:standalone
os:Linux 2.6.-.el6.i686 i686
arch_bits:
multiplexing_api:epoll
gcc_version:4.4.
process_id:
run_id:e967856f623a542c1c31842bdd208238969433c0
tcp_port:
uptime_in_seconds:
uptime_in_days:
hz:
lru_clock:
config_file:/usr/local/redis/etc/redis.conf # Clients
connected_clients:
client_longest_output_list:
client_biggest_input_buf:
blocked_clients: # Memory
used_memory:
used_memory_human:.59K
used_memory_rss:
used_memory_peak:
used_memory_peak_human:.59K
used_memory_lua:
mem_fragmentation_ratio:2.95
mem_allocator:jemalloc-3.6. # Persistence
loading:
rdb_changes_since_last_save:
rdb_bgsave_in_progress:
rdb_last_save_time:
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:
rdb_current_bgsave_time_sec:-
aof_enabled:
aof_rewrite_in_progress:
aof_rewrite_scheduled:
aof_last_rewrite_time_sec:-
aof_current_rewrite_time_sec:-
aof_last_bgrewrite_status:ok
aof_last_write_status:ok # Stats
total_connections_received:
total_commands_processed:
instantaneous_ops_per_sec:
total_net_input_bytes:
total_net_output_bytes:
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:
sync_full:
sync_partial_ok:
sync_partial_err:
expired_keys:
evicted_keys:
keyspace_hits:
keyspace_misses:
pubsub_channels:
pubsub_patterns:
latest_fork_usec: # Replication
role:master
connected_slaves:
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen: # CPU
used_cpu_sys:1.27
used_cpu_user:0.22
used_cpu_sys_children:0.01
used_cpu_user_children:0.00 # Keyspace
db0:keys=,expires=,avg_ttl=
db1:keys=,expires=,avg_ttl=

info

config get 命令

实时传储收到的请求。

【例】

127.0.0.1:> config get dir
) "dir"
) "/root"

说明:上例获取了 dir 这个参数配置的值,如果想获取全部参数的配置值也很简单,只需要执行 config get * ,即可将全部的值显示出来。

【例】

127.0.0.1:> config get *
) "dbfilename"
) "dump.rdb"
) "requirepass"
) ""
) "masterauth"
) ""
) "unixsocket"
) ""
) "logfile"
) ""
) "pidfile"
) "/var/run/redis.pid"
) "maxmemory"
) ""
) "maxmemory-samples"
) ""
) "timeout"
) ""
) "tcp-keepalive"
) ""
) "auto-aof-rewrite-percentage"
) ""
) "auto-aof-rewrite-min-size"
) ""
) "hash-max-ziplist-entries"
) ""
) "hash-max-ziplist-value"
) ""
) "list-max-ziplist-entries"
) ""
) "list-max-ziplist-value"
) ""
) "set-max-intset-entries"
) ""
) "zset-max-ziplist-entries"
) ""
) "zset-max-ziplist-value"
) ""
) "hll-sparse-max-bytes"
) ""
) "lua-time-limit"
) ""
) "slowlog-log-slower-than"
) ""
) "latency-monitor-threshold"
) ""
) "slowlog-max-len"
) ""
) "port"
) ""
) "tcp-backlog"
) ""
) "databases"
) ""
) "repl-ping-slave-period"
) ""
) "repl-timeout"
) ""
) "repl-backlog-size"
) ""
) "repl-backlog-ttl"
) ""
) "maxclients"
) ""
) "watchdog-period"
) ""
) "slave-priority"
) ""
) "min-slaves-to-write"
) ""
) "min-slaves-max-lag"
) ""
) "hz"
) ""
) "repl-diskless-sync-delay"
) ""
) "no-appendfsync-on-rewrite"
) "no"
) "slave-serve-stale-data"
) "yes"
) "slave-read-only"
) "yes"
) "stop-writes-on-bgsave-error"
) "yes"
) "daemonize"
) "yes"
) "rdbcompression"
) "yes"
) "rdbchecksum"
) "yes"
) "activerehashing"
) "yes"
) "repl-disable-tcp-nodelay"
) "no"
) "repl-diskless-sync"
) "no"
) "aof-rewrite-incremental-fsync"
) "yes"
) "aof-load-truncated"
) "yes"
) "appendonly"
) "no"
) "dir"
) "/root"
) "maxmemory-policy"
) "noeviction"
) "appendfsync"
) "everysec"
) "save"
) "900 1 300 10 60 10000"
) "loglevel"
) "notice"
) "client-output-buffer-limit"
) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
) "unixsocketperm"
) ""
) "slaveof"
) ""
) "notify-keyspace-events"
) ""
) "bind"
) ""

config get *

flushdb 命令

删除当前选择数据库中的所有的 key。

【例】

127.0.0.1:> select
OK 127.0.0.1:[]> keys *
) "age_new" 127.0.0.1:[]> flushdb
OK 127.0.0.1:[]> keys *
(empty list or set) 127.0.0.1:[]> dbsize
(integer)

说明:上例中清除了 1 号数据库中所有的 key。

flushall 命令

删除所有数据库中的所有 key。

【例】

127.0.0.1:[]> dbsize
(integer) 127.0.0.1:[]> select
OK 127.0.0.1:> dbsize
(integer) 127.0.0.1:> flushall
OK 127.0.0.1:> dbsize
(integer) 127.0.0.1:> select
OK 127.0.0.1:[]> dbsize
(integer)

Redis 高级应用

1. 安全性

2. 主从复制

3. 事务处理

4. 持久化机制

5. 发布订阅消息

6. 虚拟内存的使用

1.安全性

设置客户端连接后执行任何其他指令前需要使用的密码。

警告:因为 redis 速度非常快,所以在一台比较好的服务器下,一个外部的用户可以在 1 秒内进行 150k 次的密码尝试,这意味着需要设置非常非常强大的密码来防止暴力破解。

【操作】

需要在配置文件中设置 requirepass。

【例】

[root@localhost ~]# vim /usr/local/redis/etc/redis.conf

搜索 requirepass(/ 进行搜索, n 寻找下一个):

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

这里设置的密码是:phpdee

保存退出。停止 redis 服务:

[root@localhost ~]# pkill redis-server

启动 redis 服务:

[root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
[root@localhost ~]# redis-cli
127.0.0.1:>

进入 redis 客户端时不需要密码;但是输入命令时:

127.0.0.1:> keys *
(error) NOAUTH Authentication required.

操作被禁止(没有权限)。

授权方法:

127.0.0.1:> auth phpdee
OK
127.0.0.1:> keys *
) "time"

以上为一种授权方式。还可以在登录时输入用户名密码:

127.0.0.1:> exit

[root@localhost ~]# redis-cli -a phpdee

127.0.0.1:> keys *
) "time"

2.主从复制(重要)

Redis 主从复制配置和使用都比较简单。通过主从复制可以允许多个 slave server 拥有和 master server 相同的数据库副本。

Redis 主从复制特点:

1. master 可以拥有多个 slave;

2. 多个 slave 可以连接到同一个 master 外,还可以连接到其他 slave(注:当 master 宕掉之后,该 slave 立马转换角色,变成 master)

3. 主从复制不会阻塞 master,在同步数据时,master 可以继续处理 client 请求;

4. 提高系统的伸缩性

【过程】

当 slave(从机)向 master(主机)请求同步命令时,无论是第一次连接还是重新连接,master 都会再开启一个后台进程,把其当前的数据库备份到一个文

件(file)里,此时如果 master 还有其他操作比如插入插座,并不影响备份进程。备份成功以后,将该文件发送给 slave,slave 把该文件保存到自己的硬盘

上,启动时找到该文件,把该文件里的数据库映射到本地数据库,达到主从同步:

1. slave 与 master 建立连接,发送 sync 同步命令;

2. master 会启动一个后台进程,将数据库快照保存到文件中,同时 master 主进程会开始收集新的写命令并缓存;

3. 后台完成保存后,就将此文件发送给 slave;

4.slave 将此文件保存到硬盘上

如果 master 同时收到多个 slave 发来的同步连接命令,master 只会启动一个进程来写数据库镜像,然后发送给所有的 slave。

【配置主从服务器】

配置 slave 服务器比较简单,只需要在 slave 的配置文件中加入以下配置:

slaveof 192.168.254.100   #指定 master 的 ip 和端口
masterauth phpdee #主机的密码

使用虚拟机(VMware)进行模拟:

① 把当前虚拟机名称重命名为 Redis_master

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

② 关机;把该服务器克隆一下:

init 0   #关机

克隆(clone):

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

下一步,下一步(虚拟机的当前状态),下一步(创建一个链接克隆),虚拟机名称:Redis_slave,完成,关闭。

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

同时启动两台服务器(我可怜的小破本内存告急)。

登录主机(master),查看 ip 地址:

[root@localhost ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr :0C:::4E:A6
inet addr:192.168.254.100 Bcast:192.168.254.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe28:4ea6/ Scope:Link
UP BROADCAST RUNNING MULTICAST MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (9.9 KiB) TX bytes: (9.9 KiB)
Interrupt: Base address:0x2000

可以看到主机的 ip 地址是:192.168.254.100

登录 slave,查看 ip 地址,如果报错:

[root@localhost ~]# ifconfig eth0
eth0: error fetching interface information: Device not found

此时发现 slave 只有回环网卡:

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

执行 cat /proc/net/dev,发现没有 eth0,只有 eth1:

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

解决方案:

step1.

vim /etc/udev/rules.d/-persistent-net.rules

删除里面的 eth0 的整段。然后把 eth1(eth2) 的 NAME 修改为 eth0;记住 HWaddr;

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

step2.

vim /etc/sysconfig/network-scripts/ifcfg-eth0

把里面的 HWADDR 改为 之前记住的 HWaddr。

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

step3. 重启 slave:

reboot

重启完毕,此时:

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

参考:《VMWare克隆或复制虚拟机后找不到网卡的解决方法

把 slave 的 ip 地址改为和 master 同一网段:

ifconfig eth0 192.168.254.101

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

ping 一下 master:

ping 192.168.254.100

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

③ 在 master 下启动 redis 服务并进入客户端:

[root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

[root@localhost ~]# redis-cli

127.0.0.1:> 

④ 授权:

127.0.0.1:> auth phpdee
OK

⑤ 清空数据库(为了主从实验)

127.0.0.1:> flushall
OK 127.0.0.1:> keys *
(empty list or set)

⑥ 配置 slave

[root@localhost ~]# vim /usr/local/redis/etc/redis.conf 

搜索 slaveof:

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

配置:

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

再搜索 masterauth:

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

配置:

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

保存退出。

⑦ 启动 slave 的 redis 服务并且授权登录:

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

此时 keys * ,结果为空:

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

⑧ master 下写入:

127.0.0.1:> set name dee
OK 127.0.0.1:> keys *
) "name" 127.0.0.1:> get name
"dee"

⑨ 在 slave 下 keys *:

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

此时 slave 也有了 key 为 name 的键值。

配置而且同步成功(主从复制成功)!

⑩ 在 salve 下输入 info 命令,查看角色(slave)和连接主机的状态(master_link_status:up 正在连接):

Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令  && 高级应用之 安全性 和 主从复制

在 master 下输入 info 命令:

127.0.0.1:> info
# Server
redis_version:2.8.
redis_git_sha1:
redis_git_dirty:
redis_build_id:e2559761bd460ca0
redis_mode:standalone
os:Linux 2.6.-.el6.i686 i686
arch_bits:
multiplexing_api:epoll
gcc_version:4.4.
process_id:
run_id:d6ad6c2e439e37cbbbec728a72ba1971691511b6
tcp_port:
uptime_in_seconds:
uptime_in_days:
hz:
lru_clock:
config_file:/usr/local/redis/etc/redis.conf # Clients
connected_clients:
client_longest_output_list:
client_biggest_input_buf:
blocked_clients: # Memory
used_memory:
used_memory_human:1.62M
used_memory_rss:
used_memory_peak:
used_memory_peak_human:1.62M
used_memory_lua:
mem_fragmentation_ratio:1.09
mem_allocator:jemalloc-3.6. # Persistence
loading:
rdb_changes_since_last_save:
rdb_bgsave_in_progress:
rdb_last_save_time:
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:
rdb_current_bgsave_time_sec:-
aof_enabled:
aof_rewrite_in_progress:
aof_rewrite_scheduled:
aof_last_rewrite_time_sec:-
aof_current_rewrite_time_sec:-
aof_last_bgrewrite_status:ok
aof_last_write_status:ok # Stats
total_connections_received:
total_commands_processed:
instantaneous_ops_per_sec:
total_net_input_bytes:
total_net_output_bytes:
instantaneous_input_kbps:0.04
instantaneous_output_kbps:0.00
rejected_connections:
sync_full:
sync_partial_ok:
sync_partial_err:
expired_keys:
evicted_keys:
keyspace_hits:
keyspace_misses:
pubsub_channels:
pubsub_patterns:
latest_fork_usec: # Replication
role:master
connected_slaves:
slave0:ip=192.168.254.101,port=6379,state=online,offset=868,lag=0

master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen: # CPU
used_cpu_sys:2.25
used_cpu_user:0.46
used_cpu_sys_children:0.01
used_cpu_user_children:0.00 # Keyspace
db0:keys=,expires=,avg_ttl=
127.0.0.1:>

  

上一篇:Redis笔记(六)Redis的消息通知


下一篇:Redis笔记(五)Redis的事务