一:Redis是一個開源的key-value存儲系統。與Memcached相似,Redis將大部分數據存儲在內存中,支持的數據類型包括:字符串、哈希表、鏈表、集合、有序集合以及基於這些數據類型的相關操做。Redis使用C語言開發,在大多數像Linux、BSD和Solaris等POSIX系統上無需任何外部依賴就可使用。Redis支持的客戶端語言也很是豐富,經常使用的計算機語言如C、C#、C++、Object-C、PHP、Python、 Java、Perl、Lua、Erlang等均有可用的客戶端來訪問Redis服務器。當前Redis的應用已經很是普遍,國內像新浪、淘寶,國外像 Flickr、Github等均在使用Redis的緩存服務。 Redis的安裝很是方便,只需從http://redis.io/download獲取源碼,而後make && make install便可。默認狀況下,Redis的服務器啓動程序和客戶端程序會安裝到/usr/local/bin目錄下。在啓動Redis服務器時,咱們須要爲其指定一個配置文件,缺省狀況下配置文件在Redis的源碼目錄下,文件名爲redis.conf。node
1.1:二進制安裝redis:git
# cd /usr/local/src/ wget http://download.redis.io/releases/redis-3.2.9.tar.gz tar -zxvf redis-3.2.9.tar.gz cd redis-3.2.9 ln -sv /usr/local/src/redis-3.2.9 /usr/local/redis make # cp utils/redis_init_script /etc/init.d/redis #啓動腳本 # chmod a+x /etc/init.d/redis
1.2:啓動腳本默認的配置內容:redis
#!/bin/sh # # Simple Redis init.d script conceived to work on Linux systems # as it does use of the /proc filesystem. REDISPORT=6379 EXEC=/usr/local/redis/src/redis-server CLIEXEC=/usr/local/redis/src/redis-cli PIDFILE=/var/run/redis_${REDISPORT}.pid CONF="/etc/redis/${REDISPORT}.conf" case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $CLIEXEC -p $REDISPORT shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; *) echo "Please use start or stop as first argument" ;; esac
添加環境變量:算法
# vim /etc/profile export REDIS_HOME=/usr/local/redis export PATH=$REDIS_HOME/src:$PATH
1.3:準備配置文件:數據庫
# mkdir /etc/redis # cp redis.conf /etc/redis/6379.conf
1.4:啓動redis服務:vim
# /etc/init.d/redis start Starting Redis server... 9164:M 10 Jul 17:54:47.959 * Increased maximum number of open files to 10032 (it was originally set to 1024). _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.2.9 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 9164 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 9164:M 10 Jul 17:54:47.962 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 9164:M 10 Jul 17:54:47.962 # Server started, Redis version 3.2.9 9164:M 10 Jul 17:54:47.962 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 9164:M 10 Jul 17:54:47.962 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. 9164:M 10 Jul 17:54:47.963 * The server is now ready to accept connections on port 6379
1.4:配置文件信息:
#daemonize no 默認狀況下, redis 不是在後臺運行的,若是須要在後臺運行,把該項的值更改成 yes
daemonize yes
# 當 redis 在後臺運行的時候, Redis 默認會把 pid 文件放在 /var/run/redis.pid ,你能夠配置到其餘地址。
# 當運行多個 redis 服務時,須要指定不一樣的 pid 文件和端口
pidfile /var/run/redis_6379.pid
# 指定 redis 運行的端口,默認是 6379
port 6379
# 在高併發的環境中,爲避免慢客戶端的鏈接問題,須要設置一個高速後臺日誌
tcp-backlog 511
# 指定 redis 只接收來自於該 IP 地址的請求,若是不進行設置,那麼將處理全部請求
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1
# 設置客戶端鏈接時的超時時間,單位爲秒。當客戶端在這段時間內沒有發出任何指令,那麼關閉該鏈接
# 0 是關閉此設置
timeout 0
# TCP keepalive
# 在 Linux 上,指定值(秒)用於發送 ACKs 的時間。注意關閉鏈接須要雙倍的時間。默認爲 0 。
tcp-keepalive 0
# 指定日誌記錄級別,生產環境推薦 notice
# Redis 總共支持四個級別: debug 、 verbose 、 notice 、 warning ,默認爲 verbose
# debug 記錄不少信息,用於開發和測試
# varbose 有用的信息,不像 debug 會記錄那麼多
# notice 普通的 verbose ,經常使用於生產環境
# warning 只有很是重要或者嚴重的信息會記錄到日誌
loglevel notice
# 配置 log 文件地址
# 默認值爲 stdout ,標準輸出,若後臺模式會輸出到 /dev/null 。
logfile /var/log/redis/redis.log
# 可用數據庫數
# 默認值爲 16 ,默認數據庫爲 0 ,數據庫範圍在 0- ( database-1 )之間
databases 16
################################ 快照#################################
# 保存數據到磁盤,格式以下 :
# save
# 指出在多長時間內,有多少次更新操做,就將數據同步到數據文件 rdb 。
# 至關於條件觸發抓取快照,這個能夠多個條件配合
# 好比默認配置文件中的設置,就設置了三個條件
# save 900 1 900 秒內至少有 1 個 key 被改變
# save 300 10 300 秒內至少有 300 個 key 被改變
# save 60 10000 60 秒內至少有 10000 個 key 被改變
# save 900 1
# save 300 10
# save 60 10000
# 後臺存儲錯誤中止寫。
stop-writes-on-bgsave-error yes
# 存儲至本地數據庫時(持久化到 rdb 文件)是否壓縮數據,默認爲 yes
rdbcompression yes
# RDB 文件的是否直接偶像 chcksum
rdbchecksum yes
# 本地持久化數據庫文件名,默認值爲 dump.rdb
dbfilename dump.rdb
# 工做目錄
# 數據庫鏡像備份的文件放置的路徑。
# 這裏的路徑跟文件名要分開配置是由於 redis 在進行備份時,先會將當前數據庫的狀態寫入到一個臨時文件中,等備份完成,
# 再把該該臨時文件替換爲上面所指定的文件,而這裏的臨時文件和上面所配置的備份文件都會放在這個指定的路徑當中。
# AOF 文件也會存放在這個目錄下面
# 注意這裏必須制定一個目錄而不是文件
dir /var/lib/redis-server/
################################# 複製 #################################
# 主從複製 . 設置該數據庫爲其餘數據庫的從數據庫 .
# 設置當本機爲 slav 服務時,設置 master 服務的 IP 地址及端口,在 Redis 啓動時,它會自動從 master 進行數據同步
# slaveof
# 當 master 服務設置了密碼保護時 ( 用 requirepass 制定的密碼 )
# slave 服務鏈接 master 的密碼
# masterauth
# 當從庫同主機失去鏈接或者複製正在進行,從機庫有兩種運行方式:
# 1) 若是 slave-serve-stale-data 設置爲 yes( 默認設置 ) ,從庫會繼續響應客戶端的請求
# 2) 若是 slave-serve-stale-data 是指爲 no ,出去 INFO 和 SLAVOF 命令以外的任何請求都會返回一個
# 錯誤 "SYNC with master in progress"
slave-serve-stale-data yes
# 配置 slave 實例是否接受寫。寫 slave 對存儲短暫數據(在同 master 數據同步後能夠很容易地被刪除)是有用的,但未配置的狀況下,客戶端寫可能會發送問題。
# 從 Redis2.6 後,默認 slave 爲 read-only
slaveread-only yes
# 從庫會按照一個時間間隔向主庫發送 PINGs. 能夠經過 repl-ping-slave-period 設置這個時間間隔,默認是 10 秒
# repl-ping-slave-period 10
# repl-timeout 設置主庫批量數據傳輸時間或者 ping 回覆時間間隔,默認值是 60 秒
# 必定要確保 repl-timeout 大於 repl-ping-slave-period
# repl-timeout 60
# 在 slave socket 的 SYNC 後禁用 TCP_NODELAY
# 若是選擇「 yes 」 ,Redis 將使用一個較小的數字 TCP 數據包和更少的帶寬將數據發送到 slave , 可是這可能致使數據發送到 slave 端會有延遲 , 若是是 Linux kernel 的默認配置,會達到 40 毫秒 .
# 若是選擇 "no" ,則發送數據到 slave 端的延遲會下降,但將使用更多的帶寬用於複製 .
repl-disable-tcp-nodelay no
# 設置複製的後臺日誌大小。
# 複製的後臺日誌越大, slave 斷開鏈接及後來可能執行部分複製花的時間就越長。
# 後臺日誌在至少有一個 slave 鏈接時,僅僅分配一次。
# repl-backlog-size 1mb
# 在 master 再也不鏈接 slave 後,後臺日誌將被釋放。下面的配置定義從最後一個 slave 斷開鏈接後須要釋放的時間(秒)。
# 0 意味着從不釋放後臺日誌
# repl-backlog-ttl 3600
# 若是 master 不能再正常工做,那麼會在多個 slave 中,選擇優先值最小的一個 slave 提高爲 master ,優先值爲 0 表示不能提高爲 master 。
slave-priority 100
# 若是少於 N 個 slave 鏈接,且延遲時間 <=M 秒,則 master 可配置中止接受寫操做。
# 例如須要至少 3 個 slave 鏈接,且延遲 <=10 秒的配置:
# min-slaves-to-write 3
# min-slaves-max-lag 10
# 設置 0 爲禁用
# 默認 min-slaves-to-write 爲 0 (禁用), min-slaves-max-lag 爲 10
################################## 安全 ###################################
# 設置客戶端鏈接後進行任何其餘指定前須要使用的密碼。
# 警告:由於 redis 速度至關快,因此在一臺比較好的服務器下,一個外部的用戶能夠在一秒鐘進行 150K 次的密碼嘗試,這意味着你須要指定很是很是強大的密碼來防止暴力破解
# requirepass foobared
# 命令重命名 .
# 在一個共享環境下能夠重命名相對危險的命令。好比把 CONFIG 重名爲一個不容易猜想的字符。
# 舉例 :
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
# 若是想刪除一個命令,直接把它重命名爲一個空字符 "" 便可,以下:
# rename-command CONFIG ""
################################### 約束###################################
#設置同一時間最大客戶端鏈接數,默認無限制,
#Redis 能夠同時打開的客戶端鏈接數爲 Redis 進程能夠打開的最大文件描述符數,
#若是設置 maxclients 0 ,表示不做限制。
#當客戶端鏈接數到達限制時, Redis 會關閉新的鏈接並向客戶端返回 max number of clients reached 錯誤信息
# maxclients 10000
# 指定 Redis 最大內存限制, Redis 在啓動時會把數據加載到內存中,達到最大內存後, Redis 會按照清除策略嘗試清除已到期的 Key
# 若是 Redis 依照策略清除後沒法提供足夠空間,或者策略設置爲 」noeviction」 ,則使用更多空間的命令將會報錯,例如 SET, LPUSH 等。但仍然能夠進行讀取操做
# 注意: Redis 新的 vm 機制,會把 Key 存放內存, Value 會存放在 swap 區
# 該選項對 LRU 策略頗有用。
# maxmemory 的設置比較適合於把 redis 看成於相似 memcached 的緩存來使用,而不適合當作一個真實的 DB 。
# 當把 Redis 當作一個真實的數據庫使用的時候,內存使用將是一個很大的開銷
# maxmemory
# 當內存達到最大值的時候 Redis 會選擇刪除哪些數據?有五種方式可供選擇
# volatile-lru -> 利用 LRU 算法移除設置過過時時間的 key (LRU: 最近使用 Least RecentlyUsed )
# allkeys-lru -> 利用 LRU 算法移除任何 key
# volatile-random -> 移除設置過過時時間的隨機 key
# allkeys->random -> remove a randomkey, any key
# volatile-ttl -> 移除即將過時的 key(minor TTL)
# noeviction -> 不移除任何能夠,只是返回一個寫錯誤
# 注意:對於上面的策略,若是沒有合適的 key 能夠移除,當寫的時候 Redis 會返回一個錯誤
# 默認是 : volatile-lru
# maxmemory-policy volatile-lru
# LRU 和 minimal TTL 算法都不是精準的算法,可是相對精確的算法 ( 爲了節省內存 ) ,隨意你能夠選擇樣本大小進行檢測。
# Redis 默認的灰選擇 3 個樣本進行檢測,你能夠經過 maxmemory-samples 進行設置
# maxmemory-samples 3
############################## AOF###############################
# 默認狀況下, redis 會在後臺異步的把數據庫鏡像備份到磁盤,可是該備份是很是耗時的,並且備份也不能很頻繁,若是發生諸如拉閘限電、拔插頭等情況,那麼將形成比較大範圍的數據丟失。
# 因此 redis 提供了另一種更加高效的數據庫備份及災難恢復方式。
# 開啓 append only 模式以後, redis 會把所接收到的每一次寫操做請求都追加到 appendonly.aof 文件中,當 redis 從新啓動時,會從該文件恢復出以前的狀態。
# 可是這樣會形成 appendonly.aof 文件過大,因此 redis 還支持了 BGREWRITEAOF 指令,對 appendonly.aof 進行從新整理。
# 你能夠同時開啓 asynchronous dumps 和 AOF
appendonly no
# AOF 文件名稱 ( 默認 : "appendonly.aof")
# appendfilename appendonly.aof
# Redis 支持三種同步 AOF 文件的策略 :
# no: 不進行同步,系統去操做 . Faster.
# always: always 表示每次有寫操做都進行同步 . Slow, Safest.
# everysec: 表示對寫操做進行累積,每秒同步一次 . Compromise.
# 默認是 "everysec" ,按照速度和安全折中這是最好的。
# 若是想讓 Redis 能更高效的運行,你也能夠設置爲 "no" ,讓操做系統決定何時去執行
# 或者相反想讓數據更安全你也能夠設置爲 "always"
# 若是不肯定就用 "everysec".
# appendfsync always
appendfsync everysec
# appendfsync no
# AOF 策略設置爲 always 或者 everysec 時,後臺處理進程 ( 後臺保存或者 AOF 日誌重寫 ) 會執行大量的 I/O 操做
# 在某些 Linux 配置中會阻止過長的 fsync() 請求。注意如今沒有任何修復,即便 fsync 在另一個線程進行處理
# 爲了減緩這個問題,能夠設置下面這個參數 no-appendfsync-on-rewrite
no-appendfsync-on-rewrite no
# AOF 自動重寫
# 當 AOF 文件增加到必定大小的時候 Redis 可以調用 BGREWRITEAOF 對日誌文件進行重寫
# 它是這樣工做的: Redis 會記住上次進行些日誌後文件的大小 ( 若是從開機以來還沒進行太重寫,那日子大小在開機的時候肯定 )
# 基礎大小會同如今的大小進行比較。若是如今的大小比基礎大小大制定的百分比,重寫功能將啓動
# 同時須要指定一個最小大小用於 AOF 重寫,這個用於阻止即便文件很小可是增加幅度很大也去重寫 AOF 文件的狀況
# 設置 percentage 爲 0 就關閉這個特性
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
################################ LUASCRIPTING #############################
# 一個 Lua 腳本最長的執行時間爲 5000 毫秒( 5 秒),若是爲 0 或負數表示無限執行時間。
lua-time-limit 5000
################################LOW LOG################################
# Redis Slow Log 記錄超過特定執行時間的命令。執行時間不包括 I/O 計算好比鏈接客戶端,返回結果等,只是命令執行時間
# 能夠經過個參數設置 slow log :一個是告訴 Redis 執行超過多少時間被記錄的參數 slowlog-log-slower-than( 微妙 ) ,
# 另外一個是 slow log 的長度。當一個新命令被記錄的時候最先的命令將被從隊列中移除
# 下面的時間以微妙爲單位,所以 1000000 表明一秒。
# 注意指定一個負數將關閉慢日誌,而設置爲 0 將強制每一個命令都會記錄
slowlog-log-slower-than 10000
# 對日誌長度沒有限制,只是要注意它會消耗內存
# 能夠經過 SLOWLOG RESET 回收被慢日誌消耗的內存
# 推薦使用默認值 128 ,當慢日誌超過 128 時,最早進入隊列的記錄會被踢出
slowlog-max-len 128
################################ 事件通知 #############################
# 當事件發生時, Redis 能夠通知 Pub/Sub 客戶端。
# 能夠在下表中選擇 Redis 要通知的事件類型。事件類型由單個字符來標識:
# K Keyspace 事件,以 _keyspace@_ 的前綴方式發佈
# E Keyevent 事件,以 _keysevent@_ 的前綴方式發佈
# g 通用事件(不指定類型),像 DEL, EXPIRE, RENAME, …
# $ String 命令
# s Set 命令
# h Hash 命令
# z 有序集合命令
# x 過時事件(每次 key 過時時生成)
# e 清除事件(當 key 在內存被清除時生成)
# A g$lshzxe 的別稱,所以 」AKE」 意味着全部的事件
# notify-keyspace-events 帶一個由 0 到多個字符組成的字符串參數。空字符串意思是通知被禁用。
# 例子:啓用 list 和通用事件:
# notify-keyspace-events Elg
# 默認所用的通知被禁用,由於用戶一般不須要改特性,而且該特性會有性能損耗。
# 注意若是你不指定至少 K 或 E 之一,不會發送任何事件。
notify-keyspace-events 「」
############################## 高級配置 ###############################
# 當 hash 中包含超過指定元素個數而且最大的元素沒有超過臨界時,
# hash 將以一種特殊的編碼方式(大大減小內存使用)來存儲,這裏能夠設置這兩個臨界值
# Redis Hash 對應 Value 內部實際就是一個 HashMap ,實際這裏會有 2 種不一樣實現,
# 這個 Hash 的成員比較少時 Redis 爲了節省內存會採用相似一維數組的方式來緊湊存儲,而不會採用真正的 HashMap 結構,對應的 valueredisObject 的 encoding 爲 zipmap,
# 當成員數量增大時會自動轉成真正的 HashMap, 此時 encoding 爲 ht 。
hash-max-zipmap-entries 512
hash-max-zipmap-value 64
# 和 Hash 同樣,多個小的 list 以特定的方式編碼來節省空間。
# list 數據類型節點值大小小於多少字節會採用緊湊存儲格式。
list-max-ziplist-entries 512
list-max-ziplist-value 64
# set 數據類型內部數據若是所有是數值型,且包含多少節點如下會採用緊湊格式存儲。
set-max-intset-entries 512
# 和 hashe 和 list 同樣 , 排序的 set 在指定的長度內以指定編碼方式存儲以節省空間
# zsort 數據類型節點值大小小於多少字節會採用緊湊存儲格式。
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# Redis 將在每 100 毫秒時使用 1 毫秒的 CPU 時間來對 redis 的 hash 表進行從新 hash ,能夠下降內存的使用
# 當你的使用場景中,有很是嚴格的實時性須要,不可以接受 Redis 時不時的對請求有 2 毫秒的延遲的話,把這項配置爲 no 。
# 若是沒有這麼嚴格的實時性要求,能夠設置爲 yes ,以便可以儘量快的釋放內存
activerehashing yes
# 客戶端的輸出緩衝區的限制,由於某種緣由客戶端從服務器讀取數據的速度不夠快,
# 可用於強制斷開鏈接(一個常見的緣由是一個發佈 / 訂閱客戶端消費消息的速度沒法遇上生產它們的速度)。
# 能夠三種不一樣客戶端的方式進行設置:
# normal -> 正常客戶端
# slave -> slave 和 MONITOR 客戶端
# pubsub -> 至少訂閱了一個 pubsub channel 或 pattern 的客戶端
# 每一個 client-output-buffer-limit 語法 :
# client-output-buffer-limit
# 一旦達到硬限制客戶端會當即斷開,或者達到軟限制並保持達成的指定秒數(連續)。
# 例如,若是硬限制爲 32 兆字節和軟限制爲 16 兆字節 /10 秒,客戶端將會當即斷開
# 若是輸出緩衝區的大小達到 32 兆字節,客戶端達到 16 兆字節和連續超過了限制 10 秒,也將斷開鏈接。
# 默認 normal 客戶端不作限制,由於他們在一個請求後未要求時(以推的方式)不接收數據,
# 只有異步客戶端可能會出現請求數據的速度比它能夠讀取的速度快的場景。
# 把硬限制和軟限制都設置爲 0 來禁用該特性
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb60
client-output-buffer-limit pubsub 32mb 8mb60
# Redis 調用內部函數來執行許多後臺任務,如關閉客戶端超時的鏈接,清除過時的 Key ,等等。
# 不是全部的任務都以相同的頻率執行,但 Redis 依照指定的「 Hz 」值來執行檢查任務。
# 默認狀況下,「 Hz 」的被設定爲 10 。
# 提升該值將在 Redis 空閒時使用更多的 CPU 時,但同時當有多個 key 同時到期會使 Redis 的反應更靈敏,以及超時能夠更精確地處理。
# 範圍是 1 到 500 之間,可是值超過 100 一般不是一個好主意。
# 大多數用戶應該使用 10 這個預設值,只有在很是低的延遲的狀況下有必要提升最大到 100 。
hz 10
# 當一個子節點重寫 AOF 文件時,若是啓用下面的選項,則文件每生成 32M 數據進行同步。
aof-rewrite-incremental-fsync yes
二:redis數據類型的基本操做:
2.1:字符串:
2.1.1:設置和獲取key的值:
# redis-cli -h 127.0.0.1
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> set key2 value2
OK
127.0.0.1:6379> get key1 #不能一次獲取多個key的值
"value1"api
2.1.2:顯示全部的key:
127.0.0.1:6379> KEYS *
1) "key2"
2) "key1"數組
2.1.3:判斷key是否存在:
127.0.0.1:6379> EXISTS key1
(integer) 1 # 1表示存在
127.0.0.1:6379> EXISTS key10
(integer) 0 # 0表示不存在promise
2.1.4:刪除指定的key:
127.0.0.1:6379> del key1 key3
(integer) 2 #1爲刪除了幾個key的數量,沒有的key刪除不報錯緩存
2.1.5:獲取key的類型:
127.0.0.1:6379> LPUSH l1 "1,2,3" (integer) 1 127.0.0.1:6379> KEYS l1 1) "l1" 127.0.0.1:6379> type l1 list 127.0.0.1:6379> type key2 string
2.1.6:INCR:若是key不存在就建立並設置value默認爲1並遞增,DECR爲遞減
127.0.0.1:6379> INCR num (integer) 1 127.0.0.1:6379> INCR num (integer) 2 127.0.0.1:6379> INCR num (integer) 3 127.0.0.1:6379> INCR num (integer) 4 127.0.0.1:6379> INCR num (integer) 5 127.0.0.1:6379> DECR num (integer) 4 127.0.0.1:6379> DECR num (integer) 3 127.0.0.1:6379> DECR num (integer) 2 127.0.0.1:6379> DECR num (integer) 1 127.0.0.1:6379> DECR num (integer) 0 127.0.0.1:6379> DECR num (integer) -1
2.1.7:INCRBY遞增和DECRBY遞減:
127.0.0.1:6379> get num "4" 127.0.0.1:6379> DECRBY num 10 (integer) -6 127.0.0.1:6379> DECRBY num 10 (integer) -16 127.0.0.1:6379> get num "-16" 127.0.0.1:6379> INCRBY num 5 (integer) -11 127.0.0.1:6379> INCRBY num 5 (integer) -6
2.1.8:設置浮點數INCRBYFLOAT :
127.0.0.1:6379> INCRBYFLOAT num1 3.1415926 "3.1415926" 127.0.0.1:6379> INCRBYFLOAT num2 -0.45 "-0.45" 127.0.0.1:6379> get num1 "3.1415926" 127.0.0.1:6379> get num2 "-0.45"
2.1.9:MSET批量建立和MGET批量獲取key:
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 OK 127.0.0.1:6379> MGET k1 k2 k3 1) "v1" 2) "v2" 3) "v3"
2.1.10:獲取key字符串的長度:
127.0.0.1:6379> set a 12345 OK 127.0.0.1:6379> STRLEN a (integer) 5
2.2:HASH哈希表(散列數據類型):
2.2.1:HSET:命令用於爲哈希表中的字段賦值,若是哈希表不存在,一個新的哈希表被建立並進行 HSET 操做,若是字段已經存在於哈希表中,舊值將被覆蓋
2.2.2:HGET:獲取key:
127.0.0.1:6379> HSET phone name iphone (integer) 1 127.0.0.1:6379> HSET phone color white (integer) 1 127.0.0.1:6379> HSET phone price 5000 (integer) 1 127.0.0.1:6379> HGET phone name "iphone" 127.0.0.1:6379> HGET phone color "white" 127.0.0.1:6379> HGET phone price "5000" 2.2.3:HGETALL:獲取key的全部值 127.0.0.1:6379> HGETALL phone 1) "name" 2) "iphone" 3) "color" 4) "white" 5) "price" 6) "5000"
2.2.4:HMSET、HMGET、HMGETALL:批量建立、批量獲取並獲取全部的key:
127.0.0.1:6379> HMSET phone name huawei_honor8 color black storage 64G # 批量設置key
OK
127.0.0.1:6379> HMGET phone name storage # 批量獲取key
1) "huawei_honor8"
2) "64G"
127.0.0.1:6379> HGETALL phone # 獲取全部的key
1) "name"
2) "huawei_honor8"
3) "color"
4) "black"
5) "price"
6) "5000"
7) "storage"
8) "64G"
2.2.5:刪除指定的key:
127.0.0.1:6379> HGETALL phone #查看當前全部的key和值
1) "name"
2) "huawei_honor8"
3) "color"
4) "black"
5) "price"
6) "5000"
7) "storage"
8) "64G"
127.0.0.1:6379> HDEL phone storage # 刪除指定的key
(integer) 1
127.0.0.1:6379> HGETALL phone # 再次查看當前全部的key
1) "name"
2) "huawei_honor8"
3) "color"
4) "black"
5) "price"
6) "5000"
2.3: 列表:不一樣的數據類型的命令是不通用的,如list與string的命令是不能通用的,除了set命令以外
2.3.1:從列表頭部添加數據LPUSH和從列表尾部添加數據RPUSH,列表不存在會建立:
127.0.0.1:6379> LPUSH list1 1
(integer) 1
127.0.0.1:6379> LPUSH list1 2
(integer) 2
127.0.0.1:6379> LPUSH list1 a
(integer) 3
127.0.0.1:6379> RPUSH list1 b
(integer) 4
2.3.2:獲取列表的長度:
127.0.0.1:6379> LLEN list1
(integer) 4
2.3.3:LPOP 與 RPOP:從頭部和尾部彈出列表中的值:
127.0.0.1:6379> LPUSH list2 1
(integer) 1
127.0.0.1:6379> LPUSH list2 2
(integer) 2
127.0.0.1:6379> LPUSH list2 3
(integer) 3
127.0.0.1:6379> LPUSH list2 4 v
(integer) 5
127.0.0.1:6379> LPOP list2
"v"
127.0.0.1:6379> RPOP list1
"1"
2.3.4:LINDEX,返回列表中下表爲INDEX的元素值:
127.0.0.1:6379> LINDEX list2 1
"3"
127.0.0.1:6379> LINDEX list2 2
"2"
2.3.5:LRANGE,返回指定下表位置的元素,0爲第一個,1爲第二個,-1爲最後一個。。。,即獲取到列表中的全部數據了:
127.0.0.1:6379> LRANGE list2 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
2.4:(set)集合數據類型的操做:集合默認是無序的,列表是有序的,有序是隻按照添加的循序保持位置,而不是數值的從小到大的排序:
2.4.1:SADD:建立並給集合賦值,會自動將值去重:
127.0.0.1:6379> SADD set1 s1 s2 s3 s4
(integer) 4
127.0.0.1:6379> SADD set2 s1 s2 s3 s4 s5
(integer) 5
127.0.0.1:6379> SADD set3 s1 s2 s3 s4 s5 s6
(integer) 6
127.0.0.1:6379> SADD set4 s1 s2 s3 s4 s5 s6 s3 # 若是有重複的值就會只保留一個
(integer) 6
2.4.2:獲取一個集合中的全部的值:
127.0.0.1:6379> SMEMBERS set2
1) "s4"
2) "s3"
3) "s2"
4) "s1"
5) "s5"
127.0.0.1:6379> SMEMBERS set1
1) "s4"
2) "s3"
3) "s2"
4) "s1"
2.4.3:SISMEMBER:判斷一個值是否是在集合當中,在返回1,不然返回0
127.0.0.1:6379> SISMEMBER set1 s0
(integer) 0 # 不在集合中
127.0.0.1:6379> SISMEMBER set1 s3
(integer) 1 # 在集合中
2.4.4:SDIFF:求兩個set的差集,以屬於A而不屬於B的元素爲元素的集合成爲A與B的差(集),即以第一個set的爲基準對比第二個,且第一個set有的而第二個set沒有的部分:
192.168.10.15:6379> SMEMBERS set1
1) "s4"
2) "s1"
3) "s3"
4) "s2"
192.168.10.15:6379> SMEMBERS set2
1) "s4"
2) "s3"
3) "s5"
4) "s1"
5) "s2"
127.0.0.1:6379> SDIFF set1 set2 # 若是第一個在前面就對比不到
(empty list or set)
127.0.0.1:6379> SDIFF set2 set1 # 第二個在前面就能夠對出第二個的s5在第一個裏面沒有
1) "s5"
2.4.5:SINTER:返回集合的交集,屬於A且屬於B的元素爲元素的集合成爲A與B的交(集) ,即集合同時包含的數值:
127.0.0.1:6379> SMEMBERS set1
1) "s4"
2) "s3"
3) "s2"
4) "s1"
127.0.0.1:6379> SMEMBERS set4
1) "s2"
2) "s1"
3) "s4"
4) "s3"
5) "s5"
6) "s6"
127.0.0.1:6379> SINTER set1 set4 # 交集只保留雙方都有的值
1) "s4"
2) "s3"
3) "s2"
4) "s1"
2.4.6:SUNION,返回集合的並集,屬於A或屬於B的元素爲元素的集合成爲A與B的並(集) ,每一個數據的保留一份,即自動去掉重複的:
127.0.0.1:6379> SUNION set1 set4
1) "s4"
2) "s3"
3) "s1" #在多個集合屢次出現的值只統計一次
4) "s5"
5) "s2"
6) "s6"
2.5:有序隊列:經過給key設置分數保持值得index位置固定,集合是無序的:
2.5.1:ZADD 根據分數建立有序隊列,ZSCORE獲取到值的分數:
127.0.0.1:6379> ZADD number 1 a 2 b 3 c 4 d # 按照分數設置有序隊列
(integer) 4
127.0.0.1:6379> ZSCORE number c # 獲取值得分數
"3"
2.5.2: 根據值的分數排序獲取值:
127.0.0.1:6379> ZRANGE number 0 -1 #0和-1爲取值的下標範圍,超出值隊列的總長度並不報錯
1) "a"
2) "b"
3) "c"
4) "d"
2.6:info 命令,查看redis服務器的運行狀態:
127.0.0.1:6379> info # Server redis_version:3.2.9 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:3a11faa19c76ca1d 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:9164 run_id:4980c0e52073860e058750304f6ccddc28b19dd6 tcp_port:6379 uptime_in_seconds:12384 uptime_in_days:0 hz:10 lru_clock:6520647 executable:/usr/local/redis/src/redis-server config_file:/etc/redis/6379.conf # Clients connected_clients:1 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 # Memory used_memory:824712 used_memory_human:805.38K used_memory_rss:8245248 used_memory_rss_human:7.86M used_memory_peak:824712 used_memory_peak_human:805.38K total_system_memory:3958329344 total_system_memory_human:3.69G used_memory_lua:37888 used_memory_lua_human:37.00K maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction mem_fragmentation_ratio:10.00 mem_allocator:jemalloc-4.0.3 # Persistence loading:0 rdb_changes_since_last_save:0 rdb_bgsave_in_progress:0 rdb_last_save_time:1499692781 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:2 total_commands_processed:118 instantaneous_ops_per_sec:0 total_net_input_bytes:4240 total_net_output_bytes:12054709 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:0 evicted_keys:0 keyspace_hits:50 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:111284 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:14.96 used_cpu_user:3.88 used_cpu_sys_children:0.57 used_cpu_user_children:0.00 # Cluster cluster_enabled:0 # Keyspace db0:keys=18,expires=0,avg_ttl=0
2.7:config命令,用於查看當前配置、在不重啓服務器的狀況下修改配置:
127.0.0.1:6379> CONFIG GET maxmemory 1) "maxmemory" 2) "0" 127.0.0.1:6379> CONFIG SET maxmemory 512000000 OK 127.0.0.1:6379> CONFIG GET maxmemory 1) "maxmemory" 2) "512000000"
2.8:select切換數據庫,dbsize查看當前庫的key數量:
127.0.0.1:6379> KEYS * 1) "key10" 2) "set1" 3) "phone" 4) "set4" 5) "list1" 6) "k2" 7) "num" 8) "number" 9) "l1" 10) "set2" 11) "key2" 12) "num2" 13) "num1" 14) "a" 15) "list2" 16) "k3" 17) "k1" 18) "set3" 127.0.0.1:6379> SELECT 0 #select用於在各庫在之間進行切換 OK 127.0.0.1:6379> DBSIZE (integer) 18 127.0.0.1:6379> set name jack OK 127.0.0.1:6379> DBSIZE (integer) 19 # 當前有19個key 127.0.0.1:6379> keys * 1) "key10" 2) "set1" 3) "phone" 4) "set4" 5) "list1" 6) "k2" 7) "num" 8) "number" 9) "l1" 10) "set2" 11) "key2" 12) "num2" 13) "num1" 14) "a" 15) "list2" 16) "k3" 17) "k1" 18) "set3" 19) "name"