Redis緩存的安裝及基本數據類型命令的使用

Redis基礎

  Redis 是一個開源的、遵循 BSD 協議的、基於內存的而且目前比較流行的鍵值數據庫(key-value database),是一個非關係型數據庫, redis 提供將內存通過網絡遠程共享的一種服務,提供類似功能的還有memcache,但相比 memcache, redis 還提供了易擴展、高性能、 具備數據持久性等功能。
  Redis 在高併發、低延遲環境要求比較高的環境使用量非常廣泛, 目前 redis 在 DB-Engine 月排行榜https://db-engines.com/en/ranking 中一直比較靠前,而且一直是鍵值型存儲類的首位。

Redis對比Memcached

  1. 支持數據的持久化:可以將內存中的數據保持在磁盤中,重啓 redis 服務或者服務器之後可以從備份文件中恢復數據到內存繼續使用。
  2. 支持更多的數據類型:支持 string(字符串)、 hash(哈希數據)、 list(列表)、 set(集合)、 zet(有序集合)
  3. 支持數據的備份:可以實現類似於數據的 master-slave 模式的數據備份,另外也支持使用快照+AOF。
  4. 支持更大的 value 數據: memcache 單個 key value 最大隻支持 1MB,而 redis 最大支持 512MB。
  5. Redis 是單線程, 而 memcache 是多線程, 所以單機情況下沒有 memcache 併發高, 但 redis 支持分佈式集羣以實現更高的併發, 單 Redis 實例可以實現數萬併發。
  6. 支持集羣橫向擴展:基於 redis cluster 的橫向擴展,可以實現分佈式集羣,大幅提升性能和數據安全性。
  7. 都是基於 C 語言開發。

Redis典型應用場景

Session 共享:常見於 web 集羣中的 Tomcat 或者 PHP 中多 web 服務器 session 共享
消息隊列: ELK 的日誌緩存、 部分業務的訂閱發佈系統
計數器: 訪問排行榜、商品瀏覽數等和次數相關的數值統計場景
緩存: 數據查詢、 電商網站商品信息、 新聞內容
微博/微信社交場合: 共同好友、 點贊評論等

Redis的安裝

yum安裝Redis

在centos系統上需要基於epel源進行安裝

[root@centos7-5 ~]#yum install -y redis

啓動Redis服務並設置開機自啓
[root@centos7-5 ~]# systemctl start redis && systemctl enable redis
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.

查看Redis版本
[root@centos7-5 ~]#redis-server -v
Redis server v=3.2.12 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=7897e7d0e13773f

連接Redis並查看版本信息
[root@centos7-5 ~]#redis-cli
127.0.0.1:6379> info Server
# Server
redis_version:3.2.12
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7897e7d0e13773f
redis_mode:standalone
os:Linux 3.10.0-957.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:9524
run_id:7a985888a7f121aece265bc47aab2c611dd92e17
tcp_port:6379
uptime_in_seconds:24
uptime_in_days:0
hz:10
lru_clock:61125
executable:/usr/bin/redis-server
config_file:/etc/redis.conf

編譯安裝Redis

官網下載Redis至服務器
[root@centos7-6 ~]#wget http://download.redis.io/releases/redis-4.0.14.tar.gz

解壓
[root@centos7-6 ~]#tar -xf redis-4.0.14.tar.gz 
[root@centos7-6 ~]#cd redis-4.0.14/

安裝依賴軟件包
[root@centos7-6 redis-4.0.14]#yum install -y vim lrzsz tree screen psmisc lsof tcpdump wget ntpdate gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools iotop bc zip unzip zlib-devel bash-completion nfs-utils automake libxml2 libxml2-devel libxslt libxslt-devel perl perl-ExtUtils-Embed

安裝Redis
[root@centos7-6 redis-4.0.14]#make PREFIX=/apps/redis install

創建redis配置文件
[root@centos7-6 redis-4.0.14]#mkdir /apps/redis/etc
[root@centos7-6 redis-4.0.14]#cp redis.conf /apps/redis/etc/

指定配置文件,啓動redis
[root@centos7-6 redis-4.0.14]#/apps/redis/bin/redis-server /apps/redis/etc/redis.conf 
# 啓動警告
13303:M 12 Jun 20:42:10.037 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
13303:M 12 Jun 20:42:10.037 # Server initialized
13303:M 12 Jun 20:42:10.038 # 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.
13303:M 12 Jun 20:42:10.038 # 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.

解決啓動時的警告信息

[root@centos7-6 redis-4.0.14]#vim /etc/sysctl.conf
net.core.somaxconn = 512    # backlog 參數控制的是三次握手的時候 server 端收到 client ack 確認號之後的隊列值。
vm.overcommit_memory = 1    
# 0、表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,並把錯誤返回給應用進程。
# 1、表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。
# 2、表示內核允許分配超過所有物理內存和交換空間總和的內存

[root@centos7-6 redis-4.0.14]#sysctl -p
net.core.somaxconn = 512
vm.overcommit_memory = 1

# 開啓大頁內存動態分配,需要關閉讓 redis 負責內存管理。
[root@centos7-6 redis-4.0.14]#echo never > /sys/kernel/mm/transparent_hugepage/enabled

此時再次啓動Redis則不會出現警告信息

編寫Redis服務啓動腳本

[root@centos7-6 ~]#vim /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
#ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target

創建Redis用戶和數據目錄以及可執行程序的軟連接

[root@centos7-6 ~]#useradd redis -s /sbin/nologin
[root@centos7-6 ~]#mkdir /apps/redis/{data,logs,run} 
[root@centos7-6 ~]#chown redis.redis /apps/redis/ -R
[root@centos7-6 ~]#ln -sv /apps/redis/bin/redis-* /usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’ # Redis性能測試工具
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’ # AOF文件檢查工具
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’ # RDB文件檢查工具
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’ # Redis客戶端工具
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’   # 哨兵,軟連接到server
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’   # Redis服務端

Redis啓動驗證

[root@centos7-6 ~]#systemctl daemon-reload 
[root@centos7-6 ~]#systemctl start redis.service 
[root@centos7-6 ~]#ss -ntl
State       Recv-Q Send-Q            Local Address:Port                           Peer Address:Port              
LISTEN      0      511                   127.0.0.1:6379                                      *:*  

[root@centos7-6 ~]#redis-cli 
127.0.0.1:6379> info Server
# Server
redis_version:4.0.14
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:3e5aec6afe61b942
....

Redis的連接方式

本機非密碼連接

# redis-cli

跨主機非密碼連接

# redis-cli -h HOSTNAME/IP -p PORT

跨主機密碼鏈接

# redis-cli -h HOSTNAME/IP -p PORT -a PASSWORD

python連接

#!/bin/env python
import redis
import time
pool = redis.ConnectionPool(host="192.168.36.116",
port=6379,password="")
r = redis.Redis(connection_pool=pool)
for i in range(100):
    r.set("k%d" % i,"v%d" % i)
    time.sleep(1)
    data=r.get("k%d" % i)
    print(data)

Redis配置文件

bind 0.0.0.0 #監聽地址, 可以用空格隔開後多個監聽 IP
protected-mode yes #redis3.2 之後加入的新特性, 在沒有設置 bind IP 和密碼的時候只允許訪問127.0.0.1:6379
port 6379 #監聽端口
tcp-backlog 511 #三次握手的時候 server 端收到 client ack 確認號之後的隊列值。
timeout 0 #客戶端和 Redis 服務端的連接超時時間,默認是 0,表示永不超時。
tcp-keepalive 300 #tcp 會話保持時間
daemonize no #認情況下 redis 不是作爲守護進程運行的,如果你想讓它在後臺運行,你就把它改成yes,當 redis 作爲守護進程運行的時候,它會寫一個 pid 到 /var/run/redis.pid 文件裏面
supervised no #和操作系統相關參數, 可以設置通過 upstart 和 systemd 管理 Redis 守護進程, centos 7以後都使用 systemd
pidfile /var/run/redis_6379.pid #pid 文件路徑
loglevel notice #日誌級別logfile "" #日誌路徑
databases 16 #設置 db 庫數量,默認 16 個庫
always-show-logo yes #在啓動 redis 時是否顯示 log
save 900 1 #在 900 秒內有一個鍵內容發生更改就出就快照機制
save 300 10
save 60 10000
stop-writes-on-bgsave-error no #快照出錯時是否禁止 redis 寫入操作
rdbcompression yes #持久化到 RDB 文件時,是否壓縮, "yes"爲壓縮, "no"則反之
rdbchecksum yes #是否開啓 RC64 校驗,默認是開啓
dbfilename dump.rdb #快照文件名
dir ./ #快照文件保存路徑
replica-serve-stale-data yes #當從庫同主庫失去連接或者複製正在進行,從機庫有兩種運行方式: 1) 如果 replica-serve-stale-data 設置爲 yes(默認設置),從庫會繼續響應客戶端的讀請求。 2) 如果 replicaserve-stale-data 設置爲 no,除去指定的命令之外的任何請求都會返回一個錯誤"SYNC with master in progress"。
replica-read-only yes #是否設置從庫只讀
repl-diskless-sync no #是否使用 socket 方式複製數據, 目前 redis 複製提供兩種方式, disk 和 socket, 如果新的 slave 連上來或者重連的 slave 無法部分同步,就會執行全量同步, master 會生成 rdb 文件, 有2 種方式: disk 方式是 master 創建一個新的進程把 rdb 文件保存到磁盤,再把磁盤上的 rdb 文件傳遞給 slave, socket 是 master 創建一個新的進程,直接把 rdb 文件以 socket 的方式發給 slave, disk 方式的時候,當一個 rdb 保存的過程中,多個 slave 都能共享這個 rdb 文件, socket 的方式就是一個個 slave順序複製, 只有在磁盤速度緩慢但是網絡相對較快的情況下才使用 socket 方式, 否則使用默認的 disk方式
repl-diskless-sync-delay 30 #diskless 複製的延遲時間, 設置 0 爲關閉, 一旦複製開始還沒有結束之前,master 節點不會再接收新 slave 的複製請求, 直到下一次開始
repl-ping-slave-period 10 #slave 根據 master 指定的時間進行週期性的 PING 監測
repl-timeout 60 #複製鏈接超時時間,需要大於 repl-ping-slave-period, 否則會經常報超時
repl-disable-tcp-nodelay no #在 socket 模式下是否在 slave 套接字發送 SYNC 之後禁用 TCP_NODELAY,如果你選擇“yes”Redis 將使用更少的 TCP 包和帶寬來向 slaves 發送數據。但是這將使數據傳輸到 slave 上有延遲, Linux 內核的默認配置會達到 40 毫秒, 如果你選擇了 "no" 數據傳輸到 salve 的延遲將會減少但要使用更多的帶寬
repl-backlog-size 1mb #複製緩衝區大小, 只有在 slave 連接之後才分配內存。
repl-backlog-ttl 3600 #多次時間 master 沒有 slave 連接,就清空 backlog 緩衝區。
replica-priority 100 #當 master 不可用, Sentinel 會根據 slave 的優先級選舉一個 master。最低的優先級的 slave,當選 master。而配置成 0,永遠不會被選舉。requirepass foobared #設置 redis 連接密碼
rename-command #重命名一些高危命令
maxclients 10000 #最大連接客戶端
maxmemory #最大內存,單位爲 bytes 字節,8G 內存的計算方式 8(G)*1024(MB)*1024(KB)*1024(Kbyte),需要注意的是 slave 的輸出緩衝區是不計算在 maxmemory 內。
appendonly no #是否開啓 AOF 日誌記錄, 默認 redis 使用的是 rdb 方式持久化,這種方式在許多應用中已經足夠用了。但是 redis 如果中途宕機,會導致可能有幾分鐘的數據丟失,根據 save 來策略進行持久化,Append Only File 是另一種持久化方式,可以提供更好的持久化特性。 Redis 會把每次寫入的數據在接收後都寫入 appendonly.aof 文件,每次啓動時 Redis 都會先把這個文件的數據讀入內存裏,先忽略 RDB 文件。
appendfilename "appendonly.aof" #AOF 文件名
appendfsync everysec #aof 持久化策略的配置,no 表示不執行 fsync,由操作系統保證數據同步到磁盤,always 表示每次寫入都執行 fsync,以保證數據同步到磁盤,everysec 表示每秒執行一次 fsync,可能會導致丟失這 1s 數據。
no-appendfsync-on-rewrite no #在 aof rewrite 期間,是否對 aof 新記錄的 append 暫緩使用文件同步策略,主要考慮磁盤 IO 開支和請求阻塞時間。默認爲 no,表示"不暫緩",新的 aof 記錄仍然會被立即同步,Linux 的默認 fsync 策略是 30 秒,如果爲 yes 可能丟失 30 秒數據, 但由於 yes 性能較好而且會避免出現阻塞因此比較推薦。
auto-aof-rewrite-percentage 100 # 當 Aof log 增長超過指定百分比例時,重寫 log file, 設置爲 0 表示不自動重寫 Aof 日誌,重寫是爲了使 aof 體積保持最小,而確保保存最完整的數據。
auto-aof-rewrite-min-size 64mb #觸發 aof rewrite 的最小文件大小
aof-load-truncated yes #是否加載由於其他原因導致的末尾異常的 AOF 文件(主進程被 kill/斷電等)
aof-use-rdb-preamble yes #redis4.0 新增 RDB-AOF 混合持久化格式,在開啓了這個功能之後, AOF 重寫產生的文件將同時包含 RDB 格式的內容和 AOF 格式的內容,其中 RDB 格式的內容用於記錄已有的數據,而 AOF 格式的內存則用於記錄最近發生了變化的數據,這樣 Redis 就可以同時兼有 RDB 持久化和AOF 持久化的優點(既能夠快速地生成重寫文件,也能夠在出現問題時,快速地載入數據)。
lua-time-limit 5000 #lua 腳本的最大執行時間, 單位爲毫秒
cluster-enabled yes #是否開啓集羣模式,默認是單機模式
cluster-config-file nodes-6379.conf #由 node 節點自動生成的集羣配置文件
cluster-node-timeout 15000 #集羣中 node 節點連接超時時間
cluster-replica-validity-factor 10 #在執行故障轉移的時候可能有些節點和 master 斷開一段時間數據比較舊, 這些節點就不適用於選舉爲 master, 超過這個時間的就不會被進行故障轉移
cluster-migration-barrier 1 #一個主節點擁有的至少正常工作的從節點, 即如果主節點的 slave 節點故障後會將多餘的從節點分配到當前主節點成爲其新的從節點。
cluster-require-full-coverage no #集羣槽位覆蓋, 如果一個主庫宕機且沒有備庫就會出現集羣槽位不全, 那麼 yes 情況下 redis 集羣槽位驗證不全就不再對外提供服務,而 no 則可以繼續使用但是會出現查詢數據查不到的情況(因爲有數據丟失)。
#Slow log 是 Redis 用來記錄查詢執行時間的日誌系統, slow log 保存在內存裏面,讀寫速度非常快,因此你可以放心地使用它,不必擔心因爲開啓 slow log 而損害 Redis 的速度。
slowlog-log-slower-than 10000 #以微秒爲單位的慢日誌記錄, 爲負數會禁用慢日誌, 爲 0 會記錄每個命令操作。
slowlog-max-len 128 #記錄多少條慢日誌保存在隊列,超出後會刪除最早的, 以此滾動刪除

Redis數據持久化

  redis 雖然是一個內存級別的緩存程序,即 redis 是使用內存進行數據的緩存的,但是其可以將內存的數據按照一定的策略保存到硬盤上,從而實現數據持久保存的目的, redis 支持兩種不同方式的數據持久化保存機制,分別是 RDB 和 AOF

RDB模式

  RDB: 基於時間的快照, 只保留當前最新的一次快照, 特點是執行速度比較快,缺點是可能會丟失從上次快照到當前快照未完成之間的數據。
  RDB 實現的具體過程 Redis 從主進程先 fork 出一個子進程,使用寫時複製機制,子進程將內存的數據保存爲一個臨時文件,比如 dump.rdb.temp,當數據保存完成之後再將上一次保存的 RDB 文件替換掉,然後關閉子進程,這樣可以保存每一次做 RDB 快照的時候保存的數據都是完整的,因爲直接替換 RDB文件的時候可能會出現突然斷電等問題而導致 RDB 文件還沒有保存完整就突然關機停止保存而導致數據丟失的情況,可以手動將每次生成的 RDB 文件進程備份,這樣可以最大化保存歷史數據。

RDB模式的優缺點

優點:

  1. RDB 快照保存了某個時間點的數據,可以通過腳本執行 bgsave(非阻塞)或者 save(阻塞)命令自定義時間點備份,可以保留多個備份,當出現問題可以恢復到不同時間點的版本。
  2. 可以最大化 IO 的性能,因爲父進程在保存 RDB 文件的時候唯一要做的是 fork 出一個子進程,然後的
  3. 操作都會有這個子進程操作,父進程無需任何的 IO 操作RDB 在大量數據比如幾個 G 的數據,恢復的速度比 AOF 的快

缺點:

  1. 不能時時的保存數據,會丟失自上一次執行 RDB 備份到當前的內存數據
  2. 數據量非常大的時候,從父進程 fork 的時候需要一點時間,可能是毫秒或者秒

AOF模式

  AOF:按照操作順序依次將操作添加到指定的日誌文件當中,特點是數據安全性相對較高, 缺點是即使有些操作是重複的也會全部記錄。
  AOF 和 RDB 一樣使用了寫時複製機制, AOF 默認爲每秒鐘 fsync 一次,即將執行的命令保存到 AOF 文件當中,這樣即使 redis 服務器發生故障的話頂多也就丟失 1 秒鐘之內的數據,也可以設置不同的 fsync策略,或者設置每次執行命令的時候執行 fsync, fsync 會在後臺執行線程,所以主線程可以繼續處理用戶的正常請求而不受到寫入 AOF 文件的 IO 影響。

AOF模式優缺點

AOF 的文件大小要大於 RDB 格式的文件
根據所使用的 fsync 策略(fsync 是同步內存中 redis 所有已經修改的文件到存儲設備),默認是appendfsync everysec 即每秒執行一次 fsync

Redis數據類型

字符串(string)

  字符串是所有編程語言中最常見的和最常用的數據類型,而且也是 redis 最基本的數據類型之一,而且 redis 中所有的 key 的類型都是字符串。

添加一個KEY

127.0.0.1:6379> SET key1 value1 # 添加一個key
OK
127.0.0.1:6379> GET key1    # 獲取一個key的內容
"value1"
127.0.0.1:6379> TYPE key1   # 查看key的類型
string
127.0.0.1:6379> SET name Darius ex 3    # 對key設置自動過期時間
OK
127.0.0.1:6379> KEYS *  # 查看所有key
1) "name"
2) "key1"
127.0.0.1:6379> KEYS *  # 超過設定的過期時間,自動取消預先設定的key
1) "key1"

刪除一個key

127.0.0.1:6379> DEL key1
(integer) 1 # 刪除一個key
127.0.0.1:6379> KEYS *
(empty list or set) # 空key

批量設置多個key

127.0.0.1:6379> MSET key1 value1 key2 value2    # 格式:一個key對應自己的key值
OK

批量獲取多個key

127.0.0.1:6379> MGET key1 key2
1) "value1"
2) "value2"

追加數據

127.0.0.1:6379> APPEND key1 append
(integer) 12
127.0.0.1:6379> GET key1
"value1append"

數值遞增

127.0.0.1:6379> SET num 10
OK
127.0.0.1:6379> INCR num
(integer) 11
127.0.0.1:6379> GET num
"11"
127.0.0.1:6379> INCR num
(integer) 12
127.0.0.1:6379> GET num
"12"

數值遞減

127.0.0.1:6379> SET num 10
OK
127.0.0.1:6379> GET num
"10"
127.0.0.1:6379> DECR num
(integer) 9
127.0.0.1:6379> GET num
"9"
127.0.0.1:6379> DECR num
(integer) 8
127.0.0.1:6379> GET num
"8"
注:寫入信息報錯
(error) MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.

# 此問題是由於快照出錯時是否禁止 redis 寫入操作,不能;進行持久化引起的。需要修改配置文件中stop-writes-on-bgsave-error 爲no,重新啓動redis即可

[root@centos7-6 ~]#grep 'stop-writes-on-bgsave-error' /apps/redis/etc/redis.conf 
stop-writes-on-bgsave-error no
[root@centos7-6 ~]#systemctl restart redis

返回字符串key長度

127.0.0.1:6379> STRLEN key1
(integer) 12

列表(list)

  列表是一個雙向可讀寫的管道, 其頭部是左側尾部是右側,一個列表最多可以包含 2^32-1 個元素即4294967295 個元素。

生成列表並插入數據

127.0.0.1:6379> LPUSH list1 darius tom jhon
(integer) 3
127.0.0.1:6379> TYPE list1
list

向列表追加數據

127.0.0.1:6379> LPUSH list1 a   # 左追加
(integer) 4
127.0.0.1:6379> RPUSH list1 b   # 右追加
(integer) 5

獲取列表長度

127.0.0.1:6379> LLEN list1
(integer) 5

移除列表數據

127.0.0.1:6379> RPOP list1  # 最後一個
"b"
127.0.0.1:6379> LPOP list1  # 第一個
"a"

集合

  Set 是 String 類型的無序集合。集合成員是唯一的,這就意味着集合中不能出現重複的數據。

生成集合key

127.0.0.1:6379> SADD set1 v1
(integer) 1
127.0.0.1:6379> SADD set2 v2 v4
(integer) 2
127.0.0.1:6379> TYPE set1
set
127.0.0.1:6379> TYPE set2
set

追加數值

127.0.0.1:6379> SADD set1 v2 v3 v4
(integer) 3
127.0.0.1:6379> SADD set1 v2    # 追加失敗,追加的時候不能追加已經存在的數值
(integer) 0

查看集合的所有數據

127.0.0.1:6379> SMEMBERS set1
1) "v4"
2) "v2"
3) "v3"
4) "v1"
127.0.0.1:6379> SMEMBERS set2
1) "v4"
2) "v2"

獲取集合的差集

# 差集: 已屬於 A 而不屬於 B 的元素稱爲 A 與 B 的差(集)
127.0.0.1:6379> SDIFF set1 set2
1) "v1"
2) "v3"

獲取集合的交集

# 交集: 已屬於 A 且屬於 B 的元素稱爲 A 與 B 的交(集)
127.0.0.1:6379> SINTER set1 set2
1) "v4"
2) "v2"

獲取集合的並集

# 並集:已屬於 A 或屬於 B 的元素爲稱爲 A 與 B 的並(集)
127.0.0.1:6379> SUNION set1 set2
1) "v2"
2) "v1"
3) "v3"
4) "v4"

sorted set(有序集合)

  Redis 有序集合和集合一樣也是 string 類型元素的集合,且不允許重複的成員,不同的是每個元素都會關聯一個 double(雙精度浮點型)類型的分數, redis 正是通過分數來爲集合中的成員進行從小到大的排序, 有序集合的成員是唯一的,但分數(score)卻可以重複,集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是 O(1), 集合中最大的成員數爲 2^32 - 1 (4294967295, 每個集合可存儲 40 多億個成員)。

生成有序集合

127.0.0.1:6379> ZADD zset1 1 v1
(integer) 1
127.0.0.1:6379> ZADD zset1 2 v2
(integer) 1
127.0.0.1:6379> ZADD zset1 3 v3
(integer) 1
127.0.0.1:6379> ZADD zset1 4 v4
(integer) 1
127.0.0.1:6379> TYPE zset1
zset

127.0.0.1:6379> ZREVRANGE zset1 0 -1 withscores # 顯示指定集合內所有key和key值情況
1) "v4"
2) "4"
3) "v3"
4) "3"
5) "v2"
6) "2"
7) "v1"
8) "1"

# 示例
127.0.0.1:6379> ZADD paihangbang 20 key1 10 key2 30 key3    # 添加集合
(integer) 3
127.0.0.1:6379> ZREVRANGE paihangbang 0 -1 WITHSCORES   # 顯示集合內所有key與key值,發現按照順序進行排列
1) "key3"
2) "30"
3) "key1"
4) "20"
5) "key2"
6) "10"

批量添加多個數值

127.0.0.1:6379> ZADD paihangbang 20 key1 10 key2 30 key3    
(integer) 3

獲取集合的長度數

127.0.0.1:6379> ZCARD zset1
(integer) 4
127.0.0.1:6379> ZCARD paihangbang
(integer) 3

基於索引返回數值

127.0.0.1:6379> ZRANGE zset1 2 3
1) "v3"
2) "v4"
127.0.0.1:6379> ZRANGE zset1 0 2
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> ZRANGE zset1 1 3
1) "v2"
2) "v3"
3) "v4"

返回某個數值的索引

127.0.0.1:6379> ZRANK zset1 v2
(integer) 1
127.0.0.1:6379> ZRANK zset1 v1
(integer) 0

哈希(hash)

  hash 是一個 string 類型的 field 和 value 的映射表, hash 特別適合用於存儲對象,Redis 中每個 hash 可以存儲 232 - 1 鍵值對(40 多億)。

生成hash key

127.0.0.1:6379> HSET hset1 name darius age 18
(integer) 2
127.0.0.1:6379> TYPE hset1
hash

獲取hash key字段值

127.0.0.1:6379> HGET hset1 name
"darius"
127.0.0.1:6379> HGET hset1 age
"18"

刪除一個hash key字段

127.0.0.1:6379> HDEL hset1 age
(integer) 1

獲取所有hash表中的字段

127.0.0.1:6379> HSET hset1 name darius age 18
(integer) 1
127.0.0.1:6379> HKEYS hset1
1) "name"
2) "age"

Redis其他命令

CONFIG

  config 命令用於查看當前 redis 配置、以及不重啓更改 redis 配置等

# 更改最大內存
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "0"
127.0.0.1:6379> CONFIG SET maxmemory 8589934592
OK
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "8589934592"

# 設置連接密碼,這隻之後立即生效,但推出當前運行環境即失效,若想長久保存還需要寫入配置文件中
127.0.0.1:6379> CONFIG GET requirepass
1) "requirepass"
2) ""
127.0.0.1:6379> CONFIG SET requirepass 123456
OK
127.0.0.1:6379> CONFIG GET requirepass
(error) NOAUTH Authentication required. # 密碼生效,須輸入認證密碼方可查詢
127.0.0.1:6379> AUTH 123456 # 密碼認證
OK
127.0.0.1:6379> CONFIG GET requirepass
1) "requirepass"
2) "123456"

# 獲取當前配置
127.0.0.1:6379> CONFIG GET *
  1) "dbfilename"
  2) "dump.rdb"
  3) "requirepass"
  4) "123456"
  5) "masterauth"
  6) ""
  7) "cluster-announce-ip"
  8) ""
  9) "unixsocket"
 10) ""
 11) "logfile"
 12) ""
 13) "pidfile"
 14) "/var/run/redis_6379.pid"
....

info

  顯示當前節點 redis 運行狀態信息

127.0.0.1:6379> info
# Server
redis_version:4.0.14
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:3e5aec6afe61b942
redis_mode:standalone
os:Linux 3.10.0-957.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.5
process_id:7582
run_id:b122e141e18e7e2b129dc7dc093cf107e14f045a
tcp_port:6379
uptime_in_seconds:4082
....

SELECT

  切換數據庫

127.0.0.1:6379> SELECT 2
OK
127.0.0.1:6379[2]> 

KEYS

  查看當前庫下的所有 key

127.0.0.1:6379> KEYS *
1) "paihangbang"
2) "key2"
3) "hset1"
4) "set1"
5) "zset1"
6) "key1"
7) "num"
8) "set2"
9) "list1"

BGSAVE

  手動在後臺執行 RDB 持久化操作

127.0.0.1:6379> BGSAVE
Background saving started

DBSIZE

  返回當前庫下的所有 key 數量

127.0.0.1:6379> DBSIZE
(integer) 9

FLUSHDB

  強制清空當前庫中的所有 key

127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> KEYS *
(empty list or set)

FLUSHALL

  強制清空當前 redis 服務器所有數據庫中的所有 key, 即刪除所有數據

127.0.0.1:6379> FLUSHALL
OK
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章