🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
一)Redis初始 * 定义 Redis是一款使用C语音编写的开源的,支持网络,基于内存,可持久性的键值对存储数据库(是基于键值对的NoSQL数据库) * 特性 开源 支持多种数据结构 高性能 基于键值的存储服务系统 可持久化 特性1: 速度快 由于redis是单线程模型,使用C语言编写,数据存在内存中,所以redis的速度快 特性2:持久化 redis所有的数据保存在内存中,数据的更新将异步地保存到磁盘上 特性3: 数据结构 ![](https://box.kancloud.cn/7d0a68bebb2196f3b7f3ddee102488b0_633x280.png) 特性4: 支持多语言客户端 如java、php、python、ruby、nodejs等 特性5: 功能丰富 如发布订阅、lua脚本、事务 特性6: 复制功能 ![](https://box.kancloud.cn/f04dcbf79cfd7b83bb0a7415ce445a46_588x447.png) 特性7: 高可用 redis-sentinel支持高可用 分布式redis-cluster支持 二) Redis的典型使用场景 * 数据缓存系统 * 消息队列系统 * 排行榜 * 社交网络 三)事务 Redis通过MULTI、EXEC、DISCARD和WATCH命令来实现事务 事务可以一次执行多个命令,事务是一个原子操作,事务中的命令要不全部被执行,要么全部都不执行,事务中的所有命令都会序列号,按顺序执行,事务执行过程中,不会被其他发送来的请求所打断 EXEC命令:负责触发并执行事务中的所有命令 * 如果客户端在使用 MULTI 开启了一个事务之后,却因为断线而没有成功执行 EXEC ,那么事务中的所有命令都不会被执行。 * 另一方面,如果客户端成功在开启事务之后执行 EXEC ,那么事务中的所有命令都会被执行。 MULTI 命令用于开启一个事务,它总是返回 OK 。 通过调用 DISCARD , 客户端可以清空事务队列, 并放弃执行事务。 通过exec执行,回复元素的先后顺序和命令发送的先后顺序一致。 ~~~ 192.168.20.144:6379> MULTI (开启事务) OK 192.168.20.144:6379> set mystring01 a QUEUED 192.168.20.144:6379> lpush mylist02 a b QUEUED 192.168.20.144:6379> rpush mylist03 c 1 2 aa QUEUED 192.168.20.144:6379> lrange mylist 0 -1 QUEUED 192.168.20.144:6379> exec (执行) 1) OK 2) (integer) 2 3) (integer) 4 4) 1) "1" 2) "10" 3) "x" 4) "b" 5) "a" ~~~ 事务中的错误 * 事务在执行exec之前,入队的命令可能会出错(比如命令语法错误,参数错误等),或者其他更严重的错误(如内存不足) * 命令可能在exec调用之后失败,事务中的命令处理了错误类型的键 * 如果命令入队时返回 QUEUED ,那么入队成功 命令入队列中发生错误 ~~~ 192.168.20.144:6379> MULTI OK 192.168.20.144:6379> get ip QUEUED 192.168.20.144:6379> set port 6080 QUEUED 192.168.20.144:6379> sett (error) ERR unknown command 'sett' 192.168.20.144:6379> exec (error) EXECABORT Transaction discarded because of previous errors. ~~~ 事务在执行中发生的错误 ~~~ 192.168.20.144:6379> clear 192.168.20.144:6379> MULTI OK 192.168.20.144:6379> set ip 192.168.20.144 QUEUED 192.168.20.144:6379> get ip QUEUED 192.168.20.144:6379> set port 8000 QUEUED 192.168.20.144:6379> get ports QUEUED 192.168.20.144:6379> lpush mylist05 aa bb cc QUEUED 192.168.20.144:6379> LRANGE mylist05 0 -1 QUEUED 192.168.20.144:6379> exec 1) OK 2) "192.168.20.144" 3) OK 4) (nil) 5) (integer) 3 6) 1) "cc" 2) "bb" 3) "aa" (当执行事务期间,遇到一个错误,不仅不会回滚,还会跳过该错误,具体执行后续的事务) ~~~ * WATCH 乐观锁,在exec命令执行之前,可以监视指定数量的键,如果监视的某任意键数据被修改,则服务器拒绝执行事务 ~~~ [admin@huancun01 ~]$ sudo redis-cli -h 192.168.20.144 -p 6379 -a Aa123456 192.168.20.144:6379> WATCH ip OK 192.168.20.144:6379> MULTI OK 192.168.20.144:6379> set ip 192.168.20.144 QUEUED 192.168.20.144:6379> get ip QUEUED 192.168.20.144:6379> set port 8000 QUEUED 192.168.20.144:6379> get port QUEUED (监控的键IP发生改变,执行exec就会错误,事务不会被运行) 192.168.20.144:6379> exec (nil) ~~~ 四)Connection相关命令 192.168.20.144:6379> ping PONG 192.168.20.144:6379> select 0 OK (select挑选指定的名称空间) 192.168.20.144:6379> quit (退出) 五)Server相关命令 ~~~ 192.168.20.144:6379> CLIENT list id=8 addr=192.168.20.144:51120 fd=5 name= age=940 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client 192.168.20.144:6379> CLIENT setname localconn OK 192.168.20.144:6379> CLIENT GETNAME "localconn" 192.168.20.144:6379> CONFIG GET port 1) "port" 2) "6379" 192.168.20.144:6379> config get bind 1) "bind" 2) "192.168.20.144" 192.168.20.144:6379> info # Server redis_version:3.2.10 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:c8b45a0ec7dc67c6 redis_mode:standalone os:Linux 3.10.0-514.el7.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.8.5 process_id:2856 run_id:2ac38a433d69ced4778a1cb93922c83ecc511c2a tcp_port:6379 uptime_in_seconds:22017 uptime_in_days:0 hz:10 lru_clock:9512727 executable:/usr/bin/redis-server config_file:/etc/redis.conf # Clients connected_clients:1 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 # Memory used_memory:819272 used_memory_human:800.07K used_memory_rss:2813952 used_memory_rss_human:2.68M used_memory_peak:839936 used_memory_peak_human:820.25K total_system_memory:512450560 total_system_memory_human:488.71M used_memory_lua:37888 used_memory_lua_human:37.00K maxmemory:128000000 maxmemory_human:122.07M maxmemory_policy:noeviction mem_fragmentation_ratio:3.43 mem_allocator:jemalloc-3.6.0 # Persistence loading:0 rdb_changes_since_last_save:0 rdb_bgsave_in_progress:0 rdb_last_save_time:1519461919 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:0 rdb_current_bgsave_time_sec:-1 aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok # Stats total_connections_received:7 total_commands_processed:230 instantaneous_ops_per_sec:0 total_net_input_bytes:8433 total_net_output_bytes:63678 instantaneous_input_kbps:0.00 instantaneous_output_kbps:0.00 rejected_connections:0 sync_full:0 sync_partial_ok:0 sync_partial_err:0 expired_keys:2 evicted_keys:0 keyspace_hits:91 keyspace_misses:7 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:1328 migrate_cached_sockets:0 # Replication role:master 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 used_cpu_sys:25.20 used_cpu_user:0.84 used_cpu_sys_children:0.05 used_cpu_user_children:0.00 # Cluster cluster_enabled:0 # Keyspace db0:keys=23,expires=0,avg_ttl=0 ~~~ 七)发布与订阅(pub/sub) SUBSCRIBE 、 UNSUBSCRIBE 和 PUBLISH 三个命令实现了发布与订阅信息泛型 ~~~ 192.168.20.144:6379> help SUBSCRIBE SUBSCRIBE channel [channel ...] summary: Listen for messages published to the given channels since: 2.0.0 group: pubsub ~~~ 案例: ~~~ 192.168.20.144:6379> SUBSCRIBE news (发布) Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "news" 3) (integer) 1 1) "message" 2) "news" 3) "hello" 1) "message" 2) "news" 3) "redis" 192.168.20.144:6379> PUBLISH news hello (订阅) (integer) 1 192.168.20.144:6379> PUBLISH new redis (integer) 0 192.168.20.144:6379> PUBLISH news redis (integer) 1 模式订阅 192.168.20.144:6379> PSUBSCRIBE "news.i[to]" Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "news.i[to]" 3) (integer) 1 1) "pmessage" 2) "news.i[to]" 3) "news.it" 4) "aaa" 1) "pmessage" 2) "news.i[to]" 3) "news.it" 4) "bb" 1) "pmessage" 2) "news.i[to]" 3) "news.it" 4) "cc" 1) "pmessage" 2) "news.i[to]" 3) "news.io" 4) "cc" ~~~