1. Redis介紹
Redis是一個開源的使用ANSI C語言編寫、基於內存的Key-Value數據庫。
它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。
Redis支持主從同步,數據可以從主服務器向任意數量的從服務器上同步,由於完全實現了發布/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發布記錄。
相比memcached,Rdeis有以下優點:
1. redis原生支持的數據類型更多。
2. redis具有持久化機制,可以定期將內存中的數據持久化到硬盤上。
3. redis支持master-slave模式的數據備份。
4. 性能。Redis作者的說法是平均到單個核上的性能,在單條數據不大的情況下Redis更好。
為什么這么說呢,理由就是Redis是單線程運行的。因為是單線程運行,所以和Memcached的多線程相比,整體性能肯定會偏低。因為是單線程運行,所以IO是串行化的,網絡IO和內存IO,因此當單條數據太大時,由於需要等待一個命令的所有IO完成才能進行后續的命令,所以性能會受影響。
2. 安裝Redis
2.1 Redis的安裝十分簡單,用yum或apt-get可以直接安裝
# yum install epel-release (centos 7可以直接安裝epel源) # yum install redis
2.2 啟動/停止Redis
# redis-server /etc/redis.conf # systemctl start redis # systemctl stop redis
3. 使用Redis
3.1 Redis-cli命令行操作KV
連接到Redis
# redis-cli -p port # redis-cli
ping
127.0.0.1:6379> ping
PONG
設置鍵值
127.0.0.1:6379> set testkey "hello" OK
查詢鍵
127.0.0.1:6379> get testkey "hello"
刪除鍵
127.0.0.1:6379> del testkey (integer) 1
設定有效期限
127.0.0.1:6379> setex test 10 111 OK
用EXPIRE key s 設定過期時間 毫秒用PEXPIRE
127.0.0.1:6379> EXPIRE test11 300 (integer) 1
用TTL key 查看過期時間 毫秒用PTTL
127.0.0.1:6379> TTL test11 (integer) 288
用PERSIST key 取消過期時間
127.0.0.1:6379> PERSIST test11 (integer) 1
3.2 高級功能
3.2.1 自增,自減等,INCR、DECR、INCRBY、SORT
127.0.0.1:6379> set counter 100 OK 127.0.0.1:6379> incr counter (integer) 101 127.0.0.1:6379> incr counter (integer) 102 127.0.0.1:6379> decr counter (integer) 101
3.2.2 事務
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set test11 111111 QUEUED 127.0.0.1:6379> set test12 121212 QUEUED 127.0.0.1:6379> incr counter QUEUED 127.0.0.1:6379> EXEC 1) OK 2) OK 3) (integer) 102
3.2.3 HyperLogLogs
Redis 在 2.8.9 版本添加了 HyperLogLog 算法。
3.2.4 發布/訂閱 功能
Redis 發布訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。Redis 客戶端可以訂閱任意數量的頻道。
在一個客戶端訂閱頻道 redisChat
127.0.0.1:6379> SUBSCRIBE redisChat Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "redisChat" 3) (integer) 1
在另一個客戶端,發送消息到頻道 redisChat,訂閱者就能接收到消息
發布端:
127.0.0.1:6379> PUBLISH redisChat "redis haha" (integer) 1
訂閱端:
127.0.0.1:6379> SUBSCRIBE redisChat Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "redisChat" 3) (integer) 1 1) "message" 2) "redisChat" 3) "redis haha"
3.3查看Redis狀態
127.0.0.1:6379> info
info輸出的信息很多,可以指定輸出的部分
127.0.0.1:6379> info stats
127.0.0.1:6379> info memory
used_memory : 由 Redis 分配器分配的內存總量,以字節(byte)為單位。
used_memory_rss : 從操作系統的角度,返回 Redis 已分配的內存總量(俗稱常駐集大小)。這個值和 top 、 ps等命令的輸出一致。
rss > used ,且兩者的值相差較大時,表示存在(內部或外部的)內存碎片。
內存碎片的比率可以通過 mem_fragmentation_ratio 的值看出。
used > rss 時,表示 Redis 的部分內存被操作系統換出到交換空間了,在這種情況下,操作可能會產生明顯的延遲。
used_memory_peak : 峰值,設定的最大內存要大於峰值
3.4 其他命令
查看記錄數
127.0.0.1:6379> dbsize
查看所有KEY
127.0.0.1:6379> KEYS *
列出所有客戶端連接
127.0.0.1:6379> CLIENT LIST
關閉ip:port的客戶端
127.0.0.1:6379> CLIENT KILL 127.0.0.1:11902
清空所有數據庫的所有key
127.0.0.1:6379> FLUSHALL
清空當前數據庫中所有key
127.0.0.1:6379> FLUSHDB
返回最后一次成功保存數據到磁盤的時間,以UNIX時間戳格式表示
127.0.0.1:6379> LASTSAVE
返回當前服務器時間,以UNIX時間戳格式表示
127.0.0.1:6379> TIME
連接到其他數據庫(默認數據庫是0)
127.0.0.1:6379> SELECT 1 OK
將當前數據庫的 key 移動到指定的數據庫
127.0.0.1:6379> MOVE test2 1 (integer) 1
4. 設定文件
4.1 /etc/redis.conf
daemonize no 是否以后台daemon方式運行 timeout 0 請求超時時間 maxclients 10000 最大連接數 maxmemory <bytes> 最大內存 maxmemory-policy volatile-lru 達到最大內存時的LRU驅逐策略 maxmemory-samples 3 隨機抽取n個key執行LRU hash-max-ziplist-entries 512 Map內部不超過多少個成員時會采用線性緊湊格式存儲 hash-max-ziplist-value 64 Map內成員值長度不超過多少字節會采用線性緊湊格式存儲 類似的還有,list-max-ziplist-entries 512,list-max-ziplist-value 64等等 slowlog-log-slower-than 10000 slow log計入時間,microseconds(1000000) slowlog-max-len 128 slow log計入條數
4.2 查看最大連接數
127.0.0.1:6379> config get maxclients 1) "maxclients" 2) "10000"
運行過程中調整參數
127.0.0.1:6379> config set maxclients 10001
4.3 查看slow log
127.0.0.1:6379> SLOWLOG get 127.0.0.1:6379> SLOWLOG get 10 1) 1) (integer) 0 2) (integer) 1448413479 3) (integer) 124211 4) 1) "FLUSHALL"
確認slow log條數設定
127.0.0.1:6379> SLOWLOG len
清空slow log
127.0.0.1:6379> SLOWLOG reset
5. 數據持久化
5.1 快照(snapshot)
5.1.1 在設定文件中設置快照
save <seconds> <changes> 開啟快照,並設定保存快照到硬盤的頻率 rdbcompression yes/no 保存快照的時候,是否壓縮 dbfilename dump.rdb 指定快照的文件名(Append Only File也保存在此) dir /var/lib/redis/ 指定快照存放的場所
5.1.2 手動創建快照
在命令行執行save或bgsave命令
127.0.0.1:6379> SAVE OK
5.2 日志備份(Append Only File)
類似於mysql的binlog,將操作都記錄在log里。快照達不到要求保存的精度時,和快照結合使用,不建議單獨使用。默認間隔是1秒,可以修改。
5.2.1 在設定文件中設置AOF
appendonly yes 開啟Append Only File appendfilename "appendonly.aof" 指定日志文件名 appendfsync always/everysec/no 指定寫日志的頻率 no-appendfsync-on-rewrite no 當有bgsave等其他進程執行fsync()時,AOF和appendfsync none動作一樣
5.3 還原
要恢復Redis的數據只需移動 Redis 的備份文件(dump.rdb,appendonly.aof)到 Redis 目錄,然后啟動服務器。
為了得到你的 Redis 目錄,使用命令如下所示:
127.0.0.1:6379> config get dir 1) "dir" 2) "/var/lib/redis"
6. 后記
本文簡單介紹了Redis的安裝及使用,接下來介紹主從同步,負荷分散。