一)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"
~~~