一)Redis初始
* 定義
Redis是一款使用C語音編寫的開源的,支持網絡,基于內存,可持久性的鍵值對存儲數據庫(是基于鍵值對的NoSQL數據庫)
* 特性
開源
支持多種數據結構
高性能
基于鍵值的存儲服務系統
可持久化
特性1: 速度快
由于redis是單線程模型,使用C語言編寫,數據存在內存中,所以redis的速度快
特性2:持久化
redis所有的數據保存在內存中,數據的更新將異步地保存到磁盤上
特性3: 數據結構

特性4: 支持多語言客戶端
如java、php、python、ruby、nodejs等
特性5: 功能豐富
如發布訂閱、lua腳本、事務
特性6: 復制功能

特性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"
~~~