第四章Redis的事务、锁及管理命令

第四章· Redis的事务、锁及管理命令





回到顶部(go to top)

一.事务介绍



1.Redis的事务与关系型数据库中的事务区别



  • 1)在MySQL中讲过的事务,具有A、C、I、D四个特性
    Atomic(原子性)
    所有语句作为一个单元全部成功执行或全部取消。
    Consistent(一致性)
    如果数据库在事务开始时处于一致状态,则在执行该。?事务期间将保留一致状态。
    Isolated(隔离性)
    事务之间不相互影响。
    Durable(持久性)
    事务成功完成后,所做的所有更改都会准确地记录在?数据库中。所做的更改不会丢失。

  • 2)MySQL具有MVCC(多版本并发控制)的功能,这些都是根据事务的特性来完成的。



  • 3)redis中的事务跟关系型数据库中的事务是一个相似的概念,但是有不同之处。关系型数据库事务执行失败后面的sql语句不在执行前面的操作都会回滚,而在redis中开启一个事务时会把所有命令都放在一个队列中,这些命令并没有真正的执行,如果有一个命令报错,则取消这个队列,所有命令都不再执行。



  • 4)redis中开启一个事务是使用multi,相当于beginstart transaction,exec提交事务,discard取消队列命令(非回滚操作)。
























空格 MySQL Redis
开启 start transaction begin multi
语句 普通SQL 普通命令
失败 rollback回滚 discard取消(这里的取消不是回滚,是队列里的命令根本没有执行,并不是执行了之后,再撤回)
成功 commit exec

和事务相关的命令

1
<SPAN class=hljs-number>1)DISCARD 取消事务,放弃执行事务块内的所有命令。 <SPAN class=hljs-number>2)EXEC 执行所有事务块内的命令。 <SPAN class=hljs-number>3)MULTI 标记一个事务块的开始。 <SPAN class=hljs-number>4)UNWATCH 取消 WATCH 命令对所有 <SPAN class=hljs-keyword>key 的监视。 <SPAN class=hljs-number>5)WATCH <SPAN class=hljs-keyword>key [<SPAN class=hljs-keyword>key ...] 监视一个(或多个) <SPAN class=hljs-keyword>key ,如果在事务执行之前这个(或这些) <SPAN class=hljs-keyword>key 被其他命令所改动,那么事务将被打断。</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>


2.事务测试

1
#登录<SPAN class=hljs-selector-tag>redis <SPAN class=hljs-selector-attr>[root@db01 ~]# <SPAN class=hljs-selector-tag>redis-cli #验证密码 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>auth 123 <SPAN class=hljs-selector-tag>OK #不开启事务直接设置<SPAN class=hljs-selector-tag>key 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>set <SPAN class=hljs-selector-tag>zls "<SPAN class=hljs-selector-tag>Nice" <SPAN class=hljs-selector-tag>OK #查看结果 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>get <SPAN class=hljs-selector-tag>zls "<SPAN class=hljs-selector-tag>Nice" #开启事务 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>MULTI <SPAN class=hljs-selector-tag>OK #设置一个<SPAN class=hljs-selector-tag>key 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>set <SPAN class=hljs-selector-tag>bgx "<SPAN class=hljs-selector-tag>low" <SPAN class=hljs-selector-tag>QUEUED 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>set <SPAN class=hljs-selector-tag>alex "<SPAN class=hljs-selector-tag>Ugly" <SPAN class=hljs-selector-tag>QUEUED #开启另一个窗口查看结果 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>get <SPAN class=hljs-selector-tag>bgx (<SPAN class=hljs-selector-tag>nil) 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>get <SPAN class=hljs-selector-tag>alex (<SPAN class=hljs-selector-tag>nil) #执行<SPAN class=hljs-selector-tag>exec完成事务 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>EXEC 1) <SPAN class=hljs-selector-tag>OK 2) <SPAN class=hljs-selector-tag>OK #再次查看结果 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>get <SPAN class=hljs-selector-tag>bgx "<SPAN class=hljs-selector-tag>low" 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>get <SPAN class=hljs-selector-tag>alex "<SPAN class=hljs-selector-tag>Ugly"</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>

实验结果如下:


回到顶部(go to top)

二.Redis乐观锁介绍



1.乐观锁举例


场景:我正在买票
Ticket -1 , money -100


而票只有1张, 如果在我multi之后,和exec之前, 票被别人买了---即ticket变成0了.
我该如何观察这种情景,并不再提交?


1)悲观的想法:
世界充满危险,肯定有人和我抢, 给 ticket上锁, 只有我能操作. [悲观锁]


2)乐观的想法:
没有那么人和我抢,因此,我只需要注意,
--有没有人更改ticket的值就可以了 [乐观锁]


3)Redis的事务中,启用的是乐观锁,只负责监测key没有被改动.



2.乐观锁实现


模拟买票


开启两个窗口实现(模拟买票)

1
<SPAN class=hljs-comment>#首先在第一个窗口设置一个key(ticket 1) <SPAN class=hljs-meta>127.0.0.1:6379> set ticket <SPAN class=hljs-number>1 OK <SPAN class=hljs-comment>#设置完票的数量之后观察这个票 <SPAN class=hljs-meta>127.0.0.1:6379> WATCH ticket OK <SPAN class=hljs-comment>#开启事务 <SPAN class=hljs-meta>127.0.0.1:6379> MULTI OK <SPAN class=hljs-comment>#买了票所以ticket设置为0 <SPAN class=hljs-meta>127.0.0.1:6379> set ticket <SPAN class=hljs-number>0 QUEUED <SPAN class=hljs-comment>#然后在第二个窗口观察票 <SPAN class=hljs-meta>127.0.0.1:6379> WATCH ticket OK <SPAN class=hljs-comment>#开启事务 <SPAN class=hljs-meta>127.0.0.1:6379> MULTI OK <SPAN class=hljs-comment>#同样设置ticket为0 <SPAN class=hljs-meta>127.0.0.1:6379> set ticket <SPAN class=hljs-number>0 QUEUED <SPAN class=hljs-comment>#此时如果谁先付款,也就是执行了exec另外一个窗口就操作不了这张票了 <SPAN class=hljs-comment>#在第二个窗口先付款(执行exec) <SPAN class=hljs-meta>127.0.0.1:6379> exec <SPAN class=hljs-number>1) OK <SPAN class=hljs-comment>#然后在第一个窗口再执行exec <SPAN class=hljs-meta>127.0.0.1:6379> exec (<SPAN class=hljs-literal>nil) /<SPAN class=hljs-regexp>/无,也就是说我们无法对这张票进行操作</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>

实验结果如下


回到顶部(go to top)

三.Redis管理命令



1.INFO

1
<SPAN class=hljs-meta>#<SPAN class=bash>查看redis相关信息 127.0.0.1:6379> info <SPAN class=hljs-meta>#<SPAN class=bash>服务端信息 <SPAN class=hljs-meta>#<SPAN class=bash> Server <SPAN class=hljs-meta>#<SPAN class=bash>版本号 redis_version:3.2.12 <SPAN class=hljs-meta>#<SPAN class=bash>redis版本控制安全<SPAN class=hljs-built_in>hash算法 redis_git_sha1:00000000 <SPAN class=hljs-meta>#<SPAN class=bash>redis版本控制脏数据 redis_git_dirty:0 <SPAN class=hljs-meta>#<SPAN class=bash>redis建立id redis_build_id:3b947b91b7c31389 <SPAN class=hljs-meta>#<SPAN class=bash>运行模式:单机(如果是集群:cluster) redis_mode:standalone <SPAN class=hljs-meta>#<SPAN class=bash>redis所在宿主机的操作系统 os:Linux 2.6.32-431.el6.x86_64 x86_64 <SPAN class=hljs-meta>#<SPAN class=bash>架构(64位) arch_bits:64 <SPAN class=hljs-meta>#<SPAN class=bash>redis事件循环机制 multiplexing_api:epoll <SPAN class=hljs-meta>#<SPAN class=bash>GCC的版本 gcc_version:4.4.7 <SPAN class=hljs-meta>#<SPAN class=bash>redis进程的pid process_id:33007 <SPAN class=hljs-meta>#<SPAN class=bash>redis服务器的随机标识符(用于sentinel和集群) run_id:46b07234cf763cab04d1b31433b94e31b68c6e26 <SPAN class=hljs-meta>#<SPAN class=bash>redis的端口 tcp_port:6379 <SPAN class=hljs-meta>#<SPAN class=bash>redis服务器的运行时间(单位秒) uptime_in_seconds:318283 <SPAN class=hljs-meta>#<SPAN class=bash>redis服务器的运行时间(单位天) uptime_in_days:3 <SPAN class=hljs-meta>#<SPAN class=bash>redis内部调度(进行关闭timeout的客户端,删除过期key等等)频率,程序规定serverCron每秒运行10次 hz:10 <SPAN class=hljs-meta>#<SPAN class=bash>自增的时钟,用于LRU管理,该时钟100ms(hz=10,因此每1000ms/10=100ms执行一次定时任务)更新一次 lru_clock:13601047 <SPAN class=hljs-meta>#<SPAN class=bash>服务端运行命令路径 executable:/application/redis-3.2.12/redis-server <SPAN class=hljs-meta>#<SPAN class=bash>配置文件路径 config_file:/etc/redis/6379/redis.conf <SPAN class=hljs-meta>#<SPAN class=bash>客户端信息 <SPAN class=hljs-meta>#<SPAN class=bash> Clients <SPAN class=hljs-meta>#<SPAN class=bash>已连接客户端的数量(不包括通过slave的数量) connected_clients:2 <SPAN class=hljs-meta>#<SPAN class=bash><SPAN class=hljs-comment>#当前连接的客户端当中,最长的输出列表,用client list命令观察omem字段最大值 client_longest_output_list:0 <SPAN class=hljs-meta>#<SPAN class=bash>当前连接的客户端当中,最大输入缓存,用client list命令观察qbuf和qbuf-free两个字段最大值                            <SPAN class=hljs-meta>#<SPAN class=bash>正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量 blocked_clients:0 <SPAN class=hljs-meta>#<SPAN class=bash>内存信息 <SPAN class=hljs-meta>#<SPAN class=bash> Memory <SPAN class=hljs-meta>#<SPAN class=bash>由redis分配器分配的内存总量,以字节为单位 used_memory:845336 <SPAN class=hljs-meta>#<SPAN class=bash>以人类可读的格式返回redis分配的内存总量 used_memory_human:825.52K <SPAN class=hljs-meta>#<SPAN class=bash>从操作系统的角度,返回redis已分配的内存总量(俗称常驻集大小)。这个值和top命令的输出一致 used_memory_rss:1654784 <SPAN class=hljs-meta>#<SPAN class=bash>以人类可读方式,返回redis已分配的内存总量 used_memory_rss_human:1.58M <SPAN class=hljs-meta>#<SPAN class=bash>redis的内存消耗峰值(以字节为单位) used_memory_peak:845336 <SPAN class=hljs-meta>#<SPAN class=bash>以人类可读的格式返回redis的内存消耗峰值 used_memory_peak_human:825.52K <SPAN class=hljs-meta>#<SPAN class=bash>整个系统内存 total_system_memory:1028517888 <SPAN class=hljs-meta>#<SPAN class=bash>以人类可读的格式,显示整个系统内存 total_system_memory_human:980.87M <SPAN class=hljs-meta>#<SPAN class=bash>Lua脚本存储占用的内存 used_memory_lua:37888 <SPAN class=hljs-meta>#<SPAN class=bash>以人类可读的格式,显示Lua脚本存储占用的内存 used_memory_lua_human:37.00K <SPAN class=hljs-meta>#<SPAN class=bash>Redis实例的最大内存配置 maxmemory:0 <SPAN class=hljs-meta>#<SPAN class=bash>以人类可读的格式,显示Redis实例的最大内存配置 maxmemory_human:0B <SPAN class=hljs-meta>#<SPAN class=bash>当达到maxmemory时的淘汰策略 maxmemory_policy:noeviction <SPAN class=hljs-meta>#<SPAN class=bash>内存分裂比例(used_memory_rss/ used_memory) mem_fragmentation_ratio:1.96 <SPAN class=hljs-meta>#<SPAN class=bash>内存分配器 mem_allocator:jemalloc-4.0.3 <SPAN class=hljs-meta>#<SPAN class=bash>持久化信息 <SPAN class=hljs-meta>#<SPAN class=bash> Persistence <SPAN class=hljs-meta>#<SPAN class=bash>服务器是否正在载入持久化文件 loading:0 <SPAN class=hljs-meta>#<SPAN class=bash>离最近一次成功生成rdb文件,写入命令的个数,即有多少个写入命令没有持久化 rdb_changes_since_last_save:131 <SPAN class=hljs-meta>#<SPAN class=bash>服务器是否正在创建rdb文件 rdb_bgsave_in_progress:0 <SPAN class=hljs-meta>#<SPAN class=bash>最近一次rdb持久化保存时间 rdb_last_save_time:1540009420 <SPAN class=hljs-meta>#<SPAN class=bash>最近一次rdb持久化是否成功 rdb_last_bgsave_status:ok <SPAN class=hljs-meta>#<SPAN class=bash>最近一次成功生成rdb文件耗时秒数 rdb_last_bgsave_time_sec:-1 <SPAN class=hljs-meta>#<SPAN class=bash>如果服务器正在创建rdb文件,那么这个域记录的就是当前的创建操作已经耗费的秒数 rdb_current_bgsave_time_sec:-1 <SPAN class=hljs-meta>#<SPAN class=bash>是否开启了aof aof_enabled:0 <SPAN class=hljs-meta>#<SPAN class=bash>标识aof的rewrite操作是否在进行中 aof_rewrite_in_progress:0 <SPAN class=hljs-meta>#<SPAN class=bash>rewrite任务计划,当客户端发送bgrewriteaof指令,如果当前rewrite子进程正在执行,那么将客户端请求的bgrewriteaof变为计划任务,待aof子进程结束后执行rewrite aof_rewrite_scheduled:0 <SPAN class=hljs-meta>#<SPAN class=bash>最近一次aof rewrite耗费的时长 aof_last_rewrite_time_sec:-1 <SPAN class=hljs-meta>#<SPAN class=bash>如果rewrite操作正在进行,则记录所使用的时间,单位秒 aof_current_rewrite_time_sec:-1 <SPAN class=hljs-meta>#<SPAN class=bash>上次bgrewriteaof操作的状态 aof_last_bgrewrite_status:ok <SPAN class=hljs-meta>#<SPAN class=bash>上次aof写入状态 aof_last_write_status:ok <SPAN class=hljs-meta>#<SPAN class=bash>统计信息 <SPAN class=hljs-meta>#<SPAN class=bash> Stats <SPAN class=hljs-meta>#<SPAN class=bash>新创建连接个数,如果新创建连接过多,过度地创建和销毁连接对性能有影响,说明短连接严重或连接池使用有问题,需调研代码的连接设置 total_connections_received:19 <SPAN class=hljs-meta>#<SPAN class=bash>redis处理的命令数 total_commands_processed:299 <SPAN class=hljs-meta>#<SPAN class=bash>redis当前的qps,redis内部较实时的每秒执行的命令数 instantaneous_ops_per_sec:0 <SPAN class=hljs-meta>#<SPAN class=bash>redis网络入口流量字节数 total_net_input_bytes:10773 <SPAN class=hljs-meta>#<SPAN class=bash>redis网络出口流量字节数 total_net_output_bytes:97146 <SPAN class=hljs-meta>#<SPAN class=bash>redis网络入口kps instantaneous_input_kbps:0.00 <SPAN class=hljs-meta>#<SPAN class=bash>redis网络出口kps instantaneous_output_kbps:0.00 <SPAN class=hljs-meta>#<SPAN class=bash>拒绝的连接个数,redis连接个数达到maxclients限制,拒绝新连接的个数 rejected_connections:0 <SPAN class=hljs-meta>#<SPAN class=bash>主从完全同步次数 sync_full:0 <SPAN class=hljs-meta>#<SPAN class=bash>主从完全同步成功次数 sync_partial_ok:0 <SPAN class=hljs-meta>#<SPAN class=bash>主从完全同步失败次数 sync_partial_err:0 <SPAN class=hljs-meta>#<SPAN class=bash>运行以来过期的key的数量 expired_keys:5 <SPAN class=hljs-meta>#<SPAN class=bash>过期的比率 evicted_keys:0 <SPAN class=hljs-meta>#<SPAN class=bash>命中次数 keyspace_hits:85 <SPAN class=hljs-meta>#<SPAN class=bash>没命中次数 keyspace_misses:17 <SPAN class=hljs-meta>#<SPAN class=bash>当前使用中的频道数量 pubsub_channels:0 <SPAN class=hljs-meta>#<SPAN class=bash>当前使用的模式的数量 pubsub_patterns:0 <SPAN class=hljs-meta>#<SPAN class=bash>最近一次fork操作阻塞redis进程的耗时数,单位微秒 latest_fork_usec:0 <SPAN class=hljs-meta>#<SPAN class=bash>是否已经缓存了到该地址的连接 migrate_cached_sockets:0 <SPAN class=hljs-meta>#<SPAN class=bash>主从复制信息 <SPAN class=hljs-meta>#<SPAN class=bash> Replication <SPAN class=hljs-meta>#<SPAN class=bash>角色主库 role:master <SPAN class=hljs-meta>#<SPAN class=bash>连接slave的个数 connected_slaves:0 <SPAN class=hljs-meta>#<SPAN class=bash>主从同步偏移量,此值如果和上面的offset相同说明主从一致没延迟,与master_replid可被用来标识主实例复制流中的位置 master_repl_offset:0 <SPAN class=hljs-meta>#<SPAN class=bash>复制积压缓冲区是否开启 repl_backlog_active:0 <SPAN class=hljs-meta>#<SPAN class=bash>复制积压缓冲大小 repl_backlog_size:1048576 <SPAN class=hljs-meta>#<SPAN class=bash>复制缓冲区里偏移量的大小 repl_backlog_first_byte_offset:0 <SPAN class=hljs-meta>#<SPAN class=bash>此值等于 master_repl_offset - repl_backlog_first_byte_offset,该值不会超过repl_backlog_size的大小 repl_backlog_histlen:0 <SPAN class=hljs-meta>#<SPAN class=bash>CPU信息 <SPAN class=hljs-meta>#<SPAN class=bash> CPU <SPAN class=hljs-meta>#<SPAN class=bash>将所有redis主进程在内核态所占用的CPU时求和累计起来 used_cpu_sys:203.44 <SPAN class=hljs-meta>#<SPAN class=bash>将所有redis主进程在用户态所占用的CPU时求和累计起来 used_cpu_user:114.57 <SPAN class=hljs-meta>#<SPAN class=bash>将后台进程在内核态所占用的CPU时求和累计起来 used_cpu_sys_children:0.00 <SPAN class=hljs-meta>#<SPAN class=bash>将后台进程在用户态所占用的CPU时求和累计起来 used_cpu_user_children:0.00 <SPAN class=hljs-meta>#<SPAN class=bash>集群信息 <SPAN class=hljs-meta>#<SPAN class=bash> Cluster <SPAN class=hljs-meta>#<SPAN class=bash>实例是否启用集群模式 cluster_enabled:0 <SPAN class=hljs-meta>#<SPAN class=bash>库相关统计信息 <SPAN class=hljs-meta>#<SPAN class=bash> Keyspace <SPAN class=hljs-meta>#<SPAN class=bash>db0的key的数量,以及带有生存期的key的数,平均存活时间 db0:keys=17,expires=0,avg_ttl=0 <SPAN class=hljs-meta>#<SPAN class=bash>单独查看某一个信息(例:查看CPU信息) 127.0.0.1:6379> info cpu <SPAN class=hljs-meta>#<SPAN class=bash> CPU used_cpu_sys:203.45 used_cpu_user:114.58 used_cpu_sys_children:0.00 used_cpu_user_children:0.00</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>


2.client

1
<SPAN class=hljs-comment>#查看客户端连接信息(有几个会话就会看到几条信息) <SPAN class=hljs-number>127.0.<SPAN class=hljs-number>0.1:<SPAN class=hljs-number>6379> CLIENT LIST id=<SPAN class=hljs-number>19 addr=<SPAN class=hljs-number>127.0.<SPAN class=hljs-number>0.1:<SPAN class=hljs-number>35687 fd=<SPAN class=hljs-number>6 name= age=<SPAN class=hljs-number>30474 idle=<SPAN class=hljs-number>8962 flags=N db=<SPAN class=hljs-number>0 sub=<SPAN class=hljs-number>0 psub=<SPAN class=hljs-number>0 multi=-<SPAN class=hljs-number>1 qbuf=<SPAN class=hljs-number>0 qbuf-free=<SPAN class=hljs-number>0 obl=<SPAN class=hljs-number>0 oll=<SPAN class=hljs-number>0 omem=<SPAN class=hljs-number>0 events=r <SPAN class=hljs-keyword>cmd<SPAN class=bash>=info id=<SPAN class=hljs-number>21 addr=<SPAN class=hljs-number>127.0.<SPAN class=hljs-number>0.1:<SPAN class=hljs-number>35689 fd=<SPAN class=hljs-number>7 name= age=<SPAN class=hljs-number>3 idle=<SPAN class=hljs-number>0 flags=N db=<SPAN class=hljs-number>0 sub=<SPAN class=hljs-number>0 psub=<SPAN class=hljs-number>0 multi=-<SPAN class=hljs-number>1 qbuf=<SPAN class=hljs-number>0 qbuf-free=<SPAN class=hljs-number>32768 obl=<SPAN class=hljs-number>0 oll=<SPAN class=hljs-number>0 omem=<SPAN class=hljs-number>0 events=r <SPAN class=hljs-keyword>cmd<SPAN class=bash>=client <SPAN class=hljs-comment>#杀掉某一个会话 <SPAN class=hljs-number>127.0.<SPAN class=hljs-number>0.1:<SPAN class=hljs-number>6379> CLIENT KILL <SPAN class=hljs-number>127.0.<SPAN class=hljs-number>0.1:<SPAN class=hljs-number>35687</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>


3.config

1
#重置统计状态信息 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>CONFIG <SPAN class=hljs-selector-tag>RESETSTAT #查看所有配置信息 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>CONFIG <SPAN class=hljs-selector-tag>GET * #查看某个配置信息 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>CONFIG <SPAN class=hljs-selector-tag>GET <SPAN class=hljs-selector-tag>maxmemory 1) "<SPAN class=hljs-selector-tag>maxmemory" 2) "0" #动态修改配置信息 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>CONFIG <SPAN class=hljs-selector-tag>SET <SPAN class=hljs-selector-tag>maxmemory 60<SPAN class=hljs-selector-tag>G <SPAN class=hljs-selector-tag>OK #再次查看修改后的配置信息 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>CONFIG <SPAN class=hljs-selector-tag>GET <SPAN class=hljs-selector-tag>maxmemory 1) "<SPAN class=hljs-selector-tag>maxmemory" 2) "60000000000"</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>


4.dbsize

1
<SPAN class=hljs-comment>#查看当前库内有多少个key <SPAN class=hljs-meta>127.0.0.1:6379> DBSIZE (integer) <SPAN class=hljs-number>17 <SPAN class=hljs-comment>#验证key的数量 <SPAN class=hljs-meta>127.0.0.1:6379> KEYS * <SPAN class=hljs-number>1) <SPAN class=hljs-string>"lidao_fans" <SPAN class=hljs-number>2) <SPAN class=hljs-string>"ticket" <SPAN class=hljs-number>3) <SPAN class=hljs-string>"myhash" <SPAN class=hljs-number>4) <SPAN class=hljs-string>"teacher1" <SPAN class=hljs-number>5) <SPAN class=hljs-string>"name" <SPAN class=hljs-number>6) <SPAN class=hljs-string>"zls_fans" <SPAN class=hljs-number>7) <SPAN class=hljs-string>"bgx_fans" <SPAN class=hljs-number>8) <SPAN class=hljs-string>"mykey" <SPAN class=hljs-number>9) <SPAN class=hljs-string>"bgx" <SPAN class=hljs-number>10) <SPAN class=hljs-string>"diffkey" <SPAN class=hljs-number>11) <SPAN class=hljs-string>"alex" <SPAN class=hljs-number>12) <SPAN class=hljs-string>"KEY" <SPAN class=hljs-number>13) <SPAN class=hljs-string>"teacher" <SPAN class=hljs-number>14) <SPAN class=hljs-string>"key3" <SPAN class=hljs-number>15) <SPAN class=hljs-string>"unionkey" <SPAN class=hljs-number>16) <SPAN class=hljs-string>"zls" <SPAN class=hljs-number>17) <SPAN class=hljs-string>"wechat"</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>


5.select


在Redis中也是有库这个概念的,不过不同于MySQL,Redis的库是默认的,并不是我们手动去创建的,在Redis中一共有16(0-15)个库。在MySQL中进入某一个库,我们需要使用use dbname,在Redis中,只需要select即可。默认情况下,我们是在0库中进行操作,每个库之间都是隔离的。

1
<SPAN class=hljs-comment>#在0库中创建一个key <SPAN class=hljs-meta>127.0.0.1:6379> set name zls OK <SPAN class=hljs-comment>#查看0库中的所有key <SPAN class=hljs-meta>127.0.0.1:6379> KEYS * <SPAN class=hljs-number>1) <SPAN class=hljs-string>"name" <SPAN class=hljs-comment>#进1库中 <SPAN class=hljs-meta>127.0.0.1:6379> SELECT <SPAN class=hljs-number>1 OK <SPAN class=hljs-comment>#查看所有key <SPAN class=hljs-meta>127.0.0.1:6379[1]> KEYS * (empty list or set) /<SPAN class=hljs-regexp>/由此可见,每个库之间都是隔离的</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>


6.flushdb、flushall

1
#删库跑路专用命令(删除所有库) 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>FLUSHALL <SPAN class=hljs-selector-tag>OK #验证一下是否真的删库了 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>DBSIZE (<SPAN class=hljs-selector-tag>integer) 0 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>KEYS * (<SPAN class=hljs-selector-tag>empty <SPAN class=hljs-selector-tag>list <SPAN class=hljs-selector-tag>or <SPAN class=hljs-selector-tag>set) #删除单个库中数据 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>FLUSHDB <SPAN class=hljs-selector-tag>OK</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>


7.monitor


开启两个窗口进行命令实时监控

1
#在第一个窗口开启监控 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>MONITOR <SPAN class=hljs-selector-tag>OK #在第二个窗口输入命令 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>SELECT 2 <SPAN class=hljs-selector-tag>OK 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379<SPAN class=hljs-selector-attr>[2]> <SPAN class=hljs-selector-tag>set <SPAN class=hljs-selector-tag>name <SPAN class=hljs-selector-tag>bgx <SPAN class=hljs-selector-tag>OK 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379<SPAN class=hljs-selector-attr>[2]> <SPAN class=hljs-selector-tag>info #在第一个窗口会实时显示执行的命令 127<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.0<SPAN class=hljs-selector-class>.1<SPAN class=hljs-selector-pseudo>:6379> <SPAN class=hljs-selector-tag>MONITOR <SPAN class=hljs-selector-tag>OK 1540392396<SPAN class=hljs-selector-class>.690268 <SPAN class=hljs-selector-attr>[0 127.0.0.1:35689] "<SPAN class=hljs-selector-tag>SELECT" "2" 1540392409<SPAN class=hljs-selector-class>.883011 <SPAN class=hljs-selector-attr>[2 127.0.0.1:35689] "<SPAN class=hljs-selector-tag>set" "<SPAN class=hljs-selector-tag>name" "<SPAN class=hljs-selector-tag>bgx" 1540392543<SPAN class=hljs-selector-class>.892889 <SPAN class=hljs-selector-attr>[2 127.0.0.1:35689] "<SPAN class=hljs-selector-tag>info"</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>

实验结果如下
?



8.shutdown

1
<SPAN class=hljs-comment>#关闭Redis服务 <SPAN class=hljs-meta>127.0.0.1:6379> SHUTDOWN <SPAN class=hljs-keyword>not connected></SPAN></SPAN></SPAN>