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

这里设置的密码是: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:>
Redis 笔记与总结5 Redis 常用命令之 键值命令 和 服务器命令 && 高级应用之 安全性 和 主从复制的更多相关文章
- Redis源码解析:09redis数据库实现(键值对操作、键超时功能、键空间通知)
本章对Redis服务器的数据库实现进行介绍,说明Redis数据库相关操作的实现,包括数据库中键值对的添加.删除.查看.更新等操作的实现:客户端切换数据库的实现:键超时相关功能的实现.键空间事件通知等. ...
- Delphi中一些常用的组合键值
Delphi中一些常用的组合键值 CTRL+A: #1 CTRL+B: #2 CTRL+C: #3 CTRL+D: #4 CTRL+E: #5 CTRL+F: #6 CTRL+G: #7 ...
- Redis 笔记(五)—— HASH 常用命令
添加和删除键值对的散列操作 命令 用例和描述 HMGET HMGET key-name key [key ...] —— 从散列里面获取一个或多个键的值 HMSET HMSET key-name ke ...
- 05_NoSQL数据库之Redis数据库:Redis的常用命令,键值相关命令和服务器相关命令
Redis常用命令 Redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以再Linux终端使用. 键值相关命令: Keys:返回满足给定pattern的所有key 用表达式*表 ...
- Redis笔记(三)Redis的数据类型
前面说过,Redis的一大特性是支持丰富的数据类型, 这为更多的应用场景提供了可能. Redis有五种数据类型,包括string,list,set,sorted set和hash,注意,Redis的数 ...
- Redis笔记(八)Redis的持久化
Redis相比Memcached的很大一个优势是支持数据的持久化, 通常持久化的场景一个是做数据库使用,另一个是Redis在做缓存服务器时,防止缓存失效. Redis的持久化主要有快照Snapshot ...
- Redis笔记(二)Redis的部署和启动
Linux下Redis的部署和启动 下载安装介质 Redis官网地址:http://www.redis.io/目前最新版本是redis-3.0.3. 可以访问 http://download.redi ...
- Redis笔记(一)Redis简介
关于Redis Redis是一款开源的高性能键值对数据库,最初的作者是意大利的Salvatore Sanfilippo,他的github是 antirez ,Redis的源码同样托管在Git上:htt ...
- Redis 笔记与总结6 Redis 高级应用之 事务处理、持久化操作、pub_sub、虚拟内存
3.事务处理 redis 对事务的支持目前还比较简单. redis 只能保证一个 client 发起的事务中的命令可以连续的执行,而中间不会插入其他 client 的命令. 由于 redis 是单线 ...
随机推荐
- rsync 不能同不子级目录的问题
/usr/bin/rsync -vr /alidata/www/pro/mobile/* /alidata/www/crontal/mobile #-r, --recursive 对子目录以递归模式处 ...
- java基础知识回顾之javaIO类总结
java IO体系图 IO流的操作规律总结: 1,明确体系: 数据源:InputStream ,Reader 数据汇:OutputStream,Writer 2,明确数据:因为数据分两种:字节,字符. ...
- Kinect学习笔记(五)——更专业的深度图
这一节的内容就是把深度图转换为彩色图,然后不再使用硬解码,而是继续采用sdk里面封装好的功能来减少测量的误差,以及避免转换为灰度图时,出现绿巨人时候的掉针的bug. 下面直接 ...
- Centos6.4编译安装Node.js(已验证)
1.准备源文件包 [felix@MyTerminal Downloads]$ mv node-6.5.0 node [felix@MyTerminal Downloads]$ ls node node ...
- 移动端Web开发之我见
Web比App简单? 前两天有人问手机上做网页简单还是做app简单,我真答不上来.很多人会不以为意的说当然是网页简单,但真的是这样吗? 放眼现在上线的手机网页,大多数都是平时pc的技术沿用过来的,鲜有 ...
- 餐厅到店点餐系统app燃尽图
队友: 郭志豪:http://www.cnblogs.com/gzh13692021053/ 杨子健:http://www.cnblogs.com/yzj666/ 刘森松:http://www.cnb ...
- LightOJ1033 Generating Palindromes(区间DP/LCS)
题目要计算一个字符串最少添加几个字符使其成为回文串. 一年多前,我LCS这道经典DP例题看得还一知半解时遇到一样的问题,http://acm.fafu.edu.cn/problem.php?id=10 ...
- ural 1306. Sequence Median
1306. Sequence Median Time limit: 1.0 secondMemory limit: 1 MBLanguage limit: C, C++, Pascal Given a ...
- POJ 3020 (二分图+最小路径覆盖)
题目链接:http://poj.org/problem?id=3020 题目大意:读入一张地图.其中地图中圈圈代表可以布置卫星的空地.*号代表要覆盖的建筑物.一个卫星的覆盖范围是其周围上下左右四个点. ...
- TYVJ P1056 能量项链 Label:环状区间DP
做题记录:2016-08-16 20:05:27 背景 NOIP2006 提高组 第一道 描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头 ...