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 寻找下一个):

这里设置的密码是: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

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

init 0   #关机

克隆(clone):

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

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

登录主机(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 只有回环网卡:

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

解决方案:

step1.

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

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

step2.

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

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

step3. 重启 slave:

reboot

重启完毕,此时:

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

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

ifconfig eth0 192.168.254.101

ping 一下 master:

ping 192.168.254.100

③ 在 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:

配置:

再搜索 masterauth:

配置:

保存退出。

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

此时 keys * ,结果为空:

⑧ master 下写入:

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

⑨ 在 slave 下 keys *:

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

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

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

在 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:>

  

最新文章

  1. Xamarin+Prism开发详解三:Visual studio 2017 RC初体验
  2. MySQL的if,case语句使用总结
  3. session management
  4. VS中展开和折叠代码
  5. python走起之第二话
  6. LeetCode题解-----Majority Element II 摩尔投票法
  7. poj 2635 千进制
  8. State Management
  9. android 66 sharedperference的使用
  10. VC com 通信实例
  11. 蓝缘管理系统第二个版本号开源了。springMVC+springSecurity3.x+Mybaits3.x 系统
  12. angular2新手学习笔记(1)概述
  13. HTML+DIV+CSS+JSweb前端基础
  14. sys.exc_info()可以捕获到任意异常
  15. Linux 使用nmcli配置网络
  16. CSS中清除浮动的作用以及如何清除浮动
  17. Key Lookup开销过大导致聚集索引扫描
  18. dbexpress连接mysql提示Operation not allowed on a unidirectional dataset
  19. Python之小练习
  20. Node、PHP、Java 和 Go 服务端 I/O 性能PK

热门文章

  1. MVC准备前基础知识
  2. Android之SurfaceView
  3. oracle 10g 学习之数据进行增删改查、数据库事务、约束(8)
  4. ffmpeg 中添加264支持
  5. HDU 4974 Dracula and Ethan 优先队列
  6. TextView属性大全
  7. Selenium自动化中DOM,XPATH,CSS定位Web页面对象的优劣性分析
  8. hdu 1269 迷宫城堡 强连通分量
  9. Python 中文Key 报错问题
  10. http://jingyan.baidu.com/article/86112f13582848273797879b.html