Redis 是一個開源的使用C語言編寫,支持網絡,可基於內存可持久化的日誌型、高性能的Key-Value數據庫,並支持多語言的API調用。它一般被成爲數據結構服務器,由於Value值能夠是多種數據類型(字符串(String)、集合(set)、列表(list)、哈希(Map)、有序集合(sorted set))等類型。php
Redis的特色:html
Redis的優勢:java
2.1 下載Redis:python
下載Redis安裝包(下載地址:http://download.redis.io/releases/)c++
wget http://download.redis.io/releases/redis-4.0.8.tar.gz
2.2 安裝Redis:程序員
解壓、編譯(編譯的時候須要gcc的依賴 在安裝以前必定保證gcc是安裝好的,可使用yum -y install gcc 安裝)redis
[root@BrianZhu ~]# tar zxf redis-4.0.8.tar.gz [root@BrianZhu ~]# cd redis-4.0.8/ [root@BrianZhu redis-4.0.8]# make
2.3 啓動Redis:算法
二進制文件是編譯完成後在src目錄下,經過下面的命令啓動Redis服務:mongodb
[root@BrianZhu redis-4.0.8]# src/redis-server
看到下面的圖片表示啓動成功:數據庫
這裏的啓動方式,是讓Redis在前臺啓動,咱們不退出Redis終端就會一直這樣顯示,當咱們關掉終端Redis的進程也就退出了,爲了解決這個問題 咱們要把Redis放到後臺啓動,使用下面的方法:
[root@BrianZhu redis-4.0.8]# nohup src/redis-server &
檢查Redis啓動狀態:
[root@BrianZhu redis-4.0.8]# netstat -lntup | grep redis tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 47592/src/redis-ser tcp6 0 0 :::6379 :::* LISTEN 47592/src/redis-ser
注:redis-server默認啓動的端口是6379端口,默認沒有密碼
在啓動的時候Redis調用的是配置文件redis.conf文件(文件路徑在解壓後redis目錄下面)
[root@BrianZhu redis-4.0.8]# pwd /root/redis-4.0.8 [root@BrianZhu redis-4.0.8]# ll | grep redis.conf -rw-rw-r-- 1 root root 58353 Feb 3 00:39 redis.conf
若是咱們自定義的這個文件的路徑,也能夠指定這個文件的路徑進行啓動:
[root@BrianZhu redis-4.0.8]# nohup src/redis-server ~/redis-4.0.8/redis.conf &
2.4 啓動Redis客戶端而且驗證:
咱們可使用內置的客戶端命令redis-cli進行使用:
[root@BrianZhu redis-4.0.8]# src/redis-cli 127.0.0.1:6379> # 已經啓動Redis客戶端
驗證(一個簡單的使用):
[root@BrianZhu redis-4.0.8]# src/redis-cli 127.0.0.1:6379> ping PONG 127.0.0.1:6379> set var "Hello World" OK 127.0.0.1:6379> get var "Hello World" 127.0.0.1:6379>
退出客戶端終端:
[root@BrianZhu redis-4.0.8]# src/redis-cli 127.0.0.1:6379> quit [root@BrianZhu redis-4.0.8]# src/redis-cli 127.0.0.1:6379> exit
2.5 中止Redis:
咱們可使用內置的語法命令 redis-cli shutdown 來關閉Redis:
[root@BrianZhu redis-4.0.8]# src/redis-cli shutdown
具體操做以下:
[root@BrianZhu redis-4.0.8]# netstat -lntup | grep redis tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 47592/src/redis-ser tcp6 0 0 :::6379 :::* LISTEN 47592/src/redis-ser [root@BrianZhu redis-4.0.8]# src/redis-cli shutdown [1]+ Done nohup src/redis-server [root@BrianZhu redis-4.0.8]# netstat -lntup | grep redis [root@BrianZhu redis-4.0.8]#
注:若是是設置上密碼後,單純的使用redis-cli是關不掉的,必須加上IP、Port、Passwd
[root@BrianZhu redis-4.0.8]# src/redis-cli -h 192.168.31.1 -p 6379 -a 123456 shutdown
3.1設置Redis密碼:
redis沒有實現訪問控制這個功能,可是它提供了一個輕量級的認證方式,能夠編輯redis.conf配置來啓用認證。
有兩種設置密碼的方式:
[root@BrianZhu redis-4.0.8]# src/redis-cli 設置密碼 127.0.0.1:6379> config set requirepass test123 OK 查詢密碼: redis 127.0.0.1:6379> config get requirepass (error) ERR operation not permitted 密碼驗證: redis 127.0.0.1:6379> auth test123 OK 再次查詢: redis 127.0.0.1:6379> config get requirepass 1) "requirepass" 2) "test123"
注:若是配置文件中沒添加密碼 那麼redis重啓後,密碼失效;
3.2 遠程鏈接Redis:
遠程鏈接也是有兩種方式:
[root@BrianZhu redis-4.0.8]# src/redis-cli -p 6379 -a test123 127.0.0.1:6379> CONFIG GET requirepass 1) "requirepass" 2) "test123" 127.0.0.1:6379>
[root@BrianZhu redis-4.0.8]# src/redis-cli 127.0.0.1:6379> CONFIG GET requirepass (error) NOAUTH Authentication required. 127.0.0.1:6379> auth test123 OK 127.0.0.1:6379> CONFIG GET requirepass 1) "requirepass" 2) "test123" 127.0.0.1:6379>
注:AUTH命令跟其餘redis命令同樣,是沒有加密的;阻止不了攻擊者在網絡上竊取你的密碼;認證層的目標是提供多一層的保護。若是防火牆或者用來保護redis的系統防護外部攻擊失敗的話,外部用戶若是沒有經過密碼認證仍是沒法訪問redis的。
Redis支持五種數據類型:
經常使用字符串命令具體操做以下:
127.0.0.1:6379> set name "Brian Zhu" OK
127.0.0.1:6379> get name "Brian Zhu"
127.0.0.1:6379> GETRANGE name 0 6 "Brian Z" 127.0.0.1:6379> GETRANGE name 0 -1 "Brian Zhu"
127.0.0.1:6379> GETSET name "Brian" "Brian Zhu"
127.0.0.1:6379> GETBIT name 1 (integer) 1 127.0.0.1:6379> GETBIT name 3 (integer) 0 127.0.0.1:6379> GETBIT oo 1 # oo這個key不存在 (integer) 0 # 當偏移量 OFFSET 比字符串值的長度大,或者 key 不存在時,返回 0 。
127.0.0.1:6379> MGET name 1) "Brian" 127.0.0.1:6379> mget name keys 1) "Brian" 2) "hello world" 127.0.0.1:6379> mget name keys oo 1) "Brian" 2) "hello world" 3) (nil) # 沒有的變量返回nil
127.0.0.1:6379> SETBIT name 10086 1 (integer) 0 127.0.0.1:6379> GETBIT name 10086 (integer) 1 127.0.0.1:6379> GETBIT name 100 # 默認被初始爲0 (integer) 0
127.0.0.1:6379> SETEX test 60 brian OK 127.0.0.1:6379> TTL test (integer) 54 127.0.0.1:6379> GET test "brian" 127.0.0.1:6379> TTL test (integer) -2 127.0.0.1:6379> GET test (nil) # 設置時間過時,key對應的value也將過時
127.0.0.1:6379> EXISTS job # 查看job是否存在 (integer) 0 127.0.0.1:6379> SETNX job "hahaha" # 設置job (integer) 1 127.0.0.1:6379> SETNX job "nidaye" # 覆蓋job失敗 (integer) 0 127.0.0.1:6379> GET job # 查看job值仍是原來的值 "hahaha"
127.0.0.1:6379> GET job "hahaha" 127.0.0.1:6379> SETRANGE job 2 "nidaye" (integer) 8 127.0.0.1:6379> GET job "hanidaye"
127.0.0.1:6379> GET job "hanidaye" 127.0.0.1:6379> STRLEN job (integer) 8
127.0.0.1:6379> mset key1 brian key2 18 OK 127.0.0.1:6379> get key1 "brian" 127.0.0.1:6379> get key2 "18"
127.0.0.1:6379> MSETNX key1 brian key2 19 # key1 和key2存在建立失敗 (integer) 0 127.0.0.1:6379> MSETNX key3 jack key4 19 (integer) 1 127.0.0.1:6379> GET key3 "jack" 127.0.0.1:6379> GET key4 "19"
127.0.0.1:6379> PSETEX test1 10000 "100000000" OK 127.0.0.1:6379> PTTL test1 (integer) 8092 127.0.0.1:6379> GET test1 "100000000" 127.0.0.1:6379> PTTL test1 (integer) -2 127.0.0.1:6379> GET test1 (nil)
127.0.0.1:6379> SET number 100 OK 127.0.0.1:6379> INCR number (integer) 101 127.0.0.1:6379> get number "101"
127.0.0.1:6379> GET number "101" 127.0.0.1:6379> INCRBY number 100 (integer) 201 127.0.0.1:6379> GET number "201"
127.0.0.1:6379> GET number "201" 127.0.0.1:6379> INCRBYFLOAT number 100.9999 "301.99990000000000001" 127.0.0.1:6379> GET number "301.99990000000000001"
127.0.0.1:6379> GET number "100" 127.0.0.1:6379> DECR number (integer) 99 127.0.0.1:6379> GET number "99"
127.0.0.1:6379> GET number "99" 127.0.0.1:6379> DECRBY number 10 (integer) 89 127.0.0.1:6379> GET number "89"
127.0.0.1:6379> GET job "hanidaye" 127.0.0.1:6379> APPEND job "niyade" (integer) 14 127.0.0.1:6379> GET job "hanidayeniyade" 127.0.0.1:6379> APPEND ll poip (integer) 4 127.0.0.1:6379> GET ll "poip"
經常使用集合命令具體操做以下:
127.0.0.1:6379> SADD myset "hello" (integer) 1 127.0.0.1:6379> SADD myset "foo" (integer) 1 127.0.0.1:6379> SADD myset "hello" (integer) 0 127.0.0.1:6379> SMEMBERS myset 1) "foo" 2) "hello"
127.0.0.1:6379> SCARD myset (integer) 2
127.0.0.1:6379> SMEMBERS myset 1) "foo" 2) "hello" 127.0.0.1:6379> SMEMBERS brian 1) "foo" 2) "fo" 3) "nihao" 127.0.0.1:6379> SDIFF myset brian 1) "hello"
127.0.0.1:6379> SMEMBERS myset 1) "foo" 2) "hello" 127.0.0.1:6379> SMEMBERS brian 1) "foo" 2) "fo" 3) "nihao" 127.0.0.1:6379> SINTER myset brian 1) "foo"
127.0.0.1:6379> SDIFFSTORE myset2 brian myset (integer) 2 127.0.0.1:6379> SMEMBERS myset2 1) "fo" 2) "nihao"
127.0.0.1:6379> SINTERSTORE myset3 brian myset (integer) 1 127.0.0.1:6379> SMEMBERS myset3 1) "foo"
127.0.0.1:6379> SISMEMBER brian fo # 存在 (integer) 1 127.0.0.1:6379> SISMEMBER brian do # 不存在 (integer) 0
127.0.0.1:6379> SMEMBERS myset3 1) "foo" 127.0.0.1:6379> SMEMBERS myset 1) "foo" 2) "hello"
127.0.0.1:6379> SMOVE myset foo foo (integer) 1 127.0.0.1:6379> SMEMBERS myset 1) "hello" 127.0.0.1:6379> SMEMBERS foo 1) "foo"
127.0.0.1:6379> SMEMBERS brian 1) "foo" 2) "fo" 3) "nihao" 127.0.0.1:6379> SPOP brian "nihao" 127.0.0.1:6379> SMEMBERS brian 1) "foo" 2) "fo"
127.0.0.1:6379> SRANDMEMBER brian "foo" 127.0.0.1:6379> SRANDMEMBER brian "foo" 127.0.0.1:6379> SRANDMEMBER brian "fo"
127.0.0.1:6379> SMEMBERS brian 1) "fo" 2) "wwwwwww" 3) "a" 4) "hhahaha" 5) "foo" 6) "d" 7) "b" 8) "c" 127.0.0.1:6379> 127.0.0.1:6379> SREM brian wwwwwww d (integer) 2 127.0.0.1:6379> SMEMBERS brian 1) "fo" 2) "a" 3) "hhahaha" 4) "foo" 5) "b" 6) "c"
127.0.0.1:6379> SMEMBERS myset 1) "foo" 2) "a" 3) "c" 4) "hello" 127.0.0.1:6379> SMEMBERS brian 1) "fo" 2) "a" 3) "hhahaha" 4) "foo" 5) "b" 6) "c" 127.0.0.1:6379> SUNION brian myset 1) "fo" 2) "a" 3) "hello" 4) "hhahaha" 5) "foo" 6) "b" 7) "c"
127.0.0.1:6379> SUNIONSTORE mysets brian myset (integer) 7 127.0.0.1:6379> SMEMBERS mysets 1) "fo" 2) "a" 3) "hello" 4) "hhahaha" 5) "foo" 6) "b" 7) "c"
經常使用列表命令具體操做以下:
127.0.0.1:6379> LPUSH mylist "hello" (integer) 1 127.0.0.1:6379> LPUSH mylist "hello" "world" (integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1 1) "world" 2) "hello" 3) "hello" 127.0.0.1:6379> LRANGE mylist 0 3 1) "world" 2) "hello" 3) "hello" 127.0.0.1:6379> LRANGE mylist 0 4 1) "world" 2) "hello" 3) "hello" 127.0.0.1:6379> LRANGE mylist 0 1 1) "world" 2) "hello"
127.0.0.1:6379> LPUSHX mylist nihao (integer) 4 127.0.0.1:6379> LRANGE mylist 0 -1 1) "nihao" 2) "world" 3) "hello" 4) "hello"
127.0.0.1:6379> LREM mylist -2 hello (integer) 2 127.0.0.1:6379> LRANGE mylist 0 -1 1) "nihao" 2) "world"
127.0.0.1:6379> LRANGE mylist 0 -1 1) "nihao" 2) "world" 127.0.0.1:6379> LSET mylist 1 hahaha OK 127.0.0.1:6379> LRANGE mylist 0 -1 1) "nihao" 2) "hahaha"
127.0.0.1:6379> RPOP mylist "hahaha"
127.0.0.1:6379> RPOPLPUSH mylist mylist2 "dd" 127.0.0.1:6379> LRANGE mylist 0 -1 1) "nihao" 2) "aa" 3) "bb" 4) "cc" 127.0.0.1:6379> LRANGE mylist2 0 -1 1) "dd"
127.0.0.1:6379> RPUSH mylist "aa" "bb" "cc" "dd" (integer) 5 127.0.0.1:6379> LRANGE mylist 0 -1 1) "nihao" 2) "aa" 3) "bb" 4) "cc" 5) "dd"
127.0.0.1:6379> RPUSHX mylist2 "nihaoya" (integer) 2 127.0.0.1:6379> LRANGE mylist2 0 -1 1) "dd" 2) "nihaoya"
127.0.0.1:6379> LRANGE mylist 0 -1 1) "nihao" 2) "aa" 3) "bb" 4) "cc" 127.0.0.1:6379> LPOP mylist "nihao" 127.0.0.1:6379> LRANGE mylist 0 -1 1) "aa" 2) "bb" 3) "cc"
127.0.0.1:6379> LRANGE mylist 0 -1 1) "aa" 2) "bb" 3) "cc" 127.0.0.1:6379> LLEN mylist (integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1 1) "aa" 2) "bb" 3) "cc" 127.0.0.1:6379> LINDEX mylist 2 "cc"
經常使用哈希命令具體操做以下:
127.0.0.1:6379> HSET test2 name jack (integer) 1
127.0.0.1:6379> HGET test2 name "jack"
127.0.0.1:6379> HMSET names one brian two jack OK
127.0.0.1:6379> HMGET names one two 1) "brian" 2) "jack"
127.0.0.1:6379> HDEL names two (integer) 1 127.0.0.1:6379> HGET name two (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> HEXISTS names two # 不存在 (integer) 0 127.0.0.1:6379> HEXISTS names one # 存在 (integer) 1
127.0.0.1:6379> HGETALL names 1) "one" # 哈希表key 2) "brian" # key對應的值
127.0.0.1:6379> HSET ages one 100 (integer) 1 127.0.0.1:6379> HINCRBY ages one 10 (integer) 110 127.0.0.1:6379> HGET ages one "110"
127.0.0.1:6379> HGET ages one "110" 127.0.0.1:6379> HINCRBYFLOAT ages one 10.98 "120.98" 127.0.0.1:6379> HGET ages one "120.98"
127.0.0.1:6379> HMSET ages one 100 two aini three aini100 OK 127.0.0.1:6379> HKEYS ages 1) "one" 2) "two" 3) "three"
127.0.0.1:6379> HLEN ages (integer) 3
127.0.0.1:6379> HSETNX ages one "1000" # 存在沒法建立 (integer) 0 127.0.0.1:6379> HSETNX ages frou "youyouyou" # 不存在建立 (integer) 1 127.0.0.1:6379> HGET ages one "100" 127.0.0.1:6379> HGET ages frou "youyouyou"
127.0.0.1:6379> HVALS ages 1) "100" 2) "aini" 3) "aini100" 4) "youyouyou"
經常使用有序集合命令具體操做以下:
127.0.0.1:6379> ZADD myzset 1 "one" (integer) 1 127.0.0.1:6379> ZADD myzset 1 "uno" (integer) 1 127.0.0.1:6379> ZADD myzset 2 "two" 3 "three" (integer) 2 127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES 1) "one" 2) "1" 3) "uno" 4) "1" 5) "two" 6) "2" 7) "three" 8) "3"
127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES 1) "one" 2) "1" 3) "uno" 4) "1" 5) "two" 6) "2" 7) "three" 8) "3" 127.0.0.1:6379> ZCARD myzset (integer) 4
127.0.0.1:6379> ZADD myzset 1 "hello" (integer) 1 127.0.0.1:6379> ZADD myzset 1 "foo" (integer) 1 127.0.0.1:6379> ZADD myzset 2 "world" 3 "bar" (integer) 2 127.0.0.1:6379> ZCOUNT myzset 1 3 (integer) 8
127.0.0.1:6379> ZADD myzset1 1 "one" (integer) 1 127.0.0.1:6379> ZADD myzset1 2 "two" (integer) 1 127.0.0.1:6379> ZINCRBY myzset1 2 "one" "3" 127.0.0.1:6379> ZRANGE myzset1 0 -1 WITHSCORES 1) "two" 2) "2" 3) "one" 4) "3"
# 有序集 mid_test redis 127.0.0.1:6379> ZADD mid_test 70 "Li Lei" (integer) 1 redis 127.0.0.1:6379> ZADD mid_test 70 "Han Meimei" (integer) 1 redis 127.0.0.1:6379> ZADD mid_test 99.5 "Tom" (integer) 1 # 另外一個有序集 fin_test redis 127.0.0.1:6379> ZADD fin_test 88 "Li Lei" (integer) 1 redis 127.0.0.1:6379> ZADD fin_test 75 "Han Meimei" (integer) 1 redis 127.0.0.1:6379> ZADD fin_test 99.5 "Tom" (integer) 1 # 交集 redis 127.0.0.1:6379> ZINTERSTORE sum_point 2 mid_test fin_test (integer) 3 # 顯示有序集內全部成員及其分數值 redis 127.0.0.1:6379> ZRANGE sum_point 0 -1 WITHSCORES 1) "Han Meimei" 2) "145" 3) "Li Lei" 4) "158" 5) "Tom" 6) "199"
redis 127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e (integer) 5 redis 127.0.0.1:6379> ZADD myzset 0 f 0 g (integer) 2 redis 127.0.0.1:6379> ZLEXCOUNT myzset - + (integer) 7 redis 127.0.0.1:6379> ZLEXCOUNT myzset [b [f (integer) 5
redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 顯示整個有序集成員 1) "jack" 2) "3500" 3) "tom" 4) "5000" 5) "boss" 6) "10086" redis 127.0.0.1:6379> ZRANGE salary 1 2 WITHSCORES # 顯示有序集下標區間 1 至 2 的成員 1) "tom" 2) "5000" 3) "boss" 4) "10086" redis 127.0.0.1:6379> ZRANGE salary 0 200000 WITHSCORES # 測試 end 下標超出最大下標時的狀況 1) "jack" 2) "3500" 3) "tom" 4) "5000" 5) "boss" 6) "10086" redis > ZRANGE salary 200000 3000000 WITHSCORES # 測試當給定區間不存在於有序集時的狀況 (empty list or set)
redis 127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g (integer) 7 redis 127.0.0.1:6379> ZRANGEBYLEX myzset - [c 1) "a" 2) "b" 3) "c" redis 127.0.0.1:6379> ZRANGEBYLEX myzset - (c 1) "a" 2) "b" redis 127.0.0.1:6379> ZRANGEBYLEX myzset [aaa (g 1) "b" 2) "c" 3) "d" 4) "e" 5) "f"
redis 127.0.0.1:6379> ZADD salary 2500 jack # 測試數據 (integer) 0 redis 127.0.0.1:6379> ZADD salary 5000 tom (integer) 0 redis 127.0.0.1:6379> ZADD salary 12000 peter (integer) 0 redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf # 顯示整個有序集 1) "jack" 2) "tom" 3) "peter" redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf WITHSCORES # 顯示整個有序集及成員的 score 值 1) "jack" 2) "2500" 3) "tom" 4) "5000" 5) "peter" 6) "12000" redis 127.0.0.1:6379> ZRANGEBYSCORE salary -inf 5000 WITHSCORES # 顯示工資 <=5000 的全部成員 1) "jack" 2) "2500" 3) "tom" 4) "5000" redis 127.0.0.1:6379> ZRANGEBYSCORE salary (5000 400000 # 顯示工資大於 5000 小於等於 400000 的成員 1) "peter"
redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 顯示全部成員及其 score 值 1) "peter" 2) "3500" 3) "tom" 4) "4000" 5) "jack" 6) "5000" redis 127.0.0.1:6379> ZRANK salary tom # 顯示 tom 的薪水排名,第二 (integer) 1
# 測試數據 redis 127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES 1) "bing.com" 2) "8" 3) "baidu.com" 4) "9" 5) "google.com" 6) "10" # 移除單個元素 redis 127.0.0.1:6379> ZREM page_rank google.com (integer) 1 redis 127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES 1) "bing.com" 2) "8" 3) "baidu.com" 4) "9" # 移除多個元素 redis 127.0.0.1:6379> ZREM page_rank baidu.com bing.com (integer) 2 redis 127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES (empty list or set) # 移除不存在元素 redis 127.0.0.1:6379> ZREM page_rank non-exists-element (integer) 0
redis 127.0.0.1:6379> ZADD myzset 0 aaaa 0 b 0 c 0 d 0 e (integer) 5 redis 127.0.0.1:6379> ZADD myzset 0 foo 0 zap 0 zip 0 ALPHA 0 alpha (integer) 5 redis 127.0.0.1:6379> ZRANGE myzset 0 -1 1) "ALPHA" 2) "aaaa" 3) "alpha" 4) "b" 5) "c" 6) "d" 7) "e" 8) "foo" 9) "zap" 10) "zip" redis 127.0.0.1:6379> ZREMRANGEBYLEX myzset [alpha [omega (integer) 6 redis 127.0.0.1:6379> ZRANGE myzset 0 -1 1) "ALPHA" 2) "aaaa" 3) "zap" 4) "zip"
redis 127.0.0.1:6379> ZADD salary 2000 jack (integer) 1 redis 127.0.0.1:6379> ZADD salary 5000 tom (integer) 1 redis 127.0.0.1:6379> ZADD salary 3500 peter (integer) 1 redis 127.0.0.1:6379> ZREMRANGEBYRANK salary 0 1 # 移除下標 0 至 1 區間內的成員 (integer) 2 redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 有序集只剩下一個成員 1) "tom" 2) "5000"
redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 顯示有序集內全部成員及其 score 值 1) "tom" 2) "2000" 3) "peter" 4) "3500" 5) "jack" 6) "5000" redis 127.0.0.1:6379> ZREMRANGEBYSCORE salary 1500 3500 # 移除全部薪水在 1500 到 3500 內的員工 (integer) 2 redis> ZRANGE salary 0 -1 WITHSCORES # 剩下的有序集成員 1) "jack" 2) "5000"
redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 遞增排列 1) "peter" 2) "3500" 3) "tom" 4) "4000" 5) "jack" 6) "5000" redis 127.0.0.1:6379> ZREVRANGE salary 0 -1 WITHSCORES # 遞減排列 1) "jack" 2) "5000" 3) "tom" 4) "4000" 5) "peter" 6) "3500"
redis 127.0.0.1:6379> ZADD salary 10086 jack (integer) 1 redis > ZADD salary 5000 tom (integer) 1 redis 127.0.0.1:6379> ZADD salary 7500 peter (integer) 1 redis 127.0.0.1:6379> ZADD salary 3500 joe (integer) 1 redis 127.0.0.1:6379> ZREVRANGEBYSCORE salary +inf -inf # 逆序排列全部成員 1) "jack" 2) "peter" 3) "tom" 4) "joe" redis 127.0.0.1:6379> ZREVRANGEBYSCORE salary 10000 2000 # 逆序排列薪水介於 10000 和 2000 之間的成員 1) "peter" 2) "tom" 3) "joe"
redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 測試數據 1) "jack" 2) "2000" 3) "peter" 4) "3500" 5) "tom" 6) "5000" redis 127.0.0.1:6379> ZREVRANK salary peter # peter 的工資排第二 (integer) 1 redis 127.0.0.1:6379> ZREVRANK salary tom # tom 的工資最高 (integer) 0
redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES # 測試數據 1) "tom" 2) "2000" 3) "peter" 4) "3500" 5) "jack" 6) "5000" redis 127.0.0.1:6379> ZSCORE salary peter # 注意返回值是字符串 "3500"
redis 127.0.0.1:6379> ZRANGE programmer 0 -1 WITHSCORES 1) "peter" 2) "2000" 3) "jack" 4) "3500" 5) "tom" 6) "5000" redis 127.0.0.1:6379> ZRANGE manager 0 -1 WITHSCORES 1) "herry" 2) "2000" 3) "mary" 4) "3500" 5) "bob" 6) "4000" redis 127.0.0.1:6379> ZUNIONSTORE salary 2 programmer manager WEIGHTS 1 3 # 公司決定加薪。。。除了程序員。。。 (integer) 6 redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES 1) "peter" 2) "2000" 3) "jack" 4) "3500" 5) "tom" 6) "5000" 7) "herry" 8) "6000" 9) "mary" 10) "10500" 11) "bob" 12) "12000"
下圖展現了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關係:
當有新消息經過 PUBLISH 命令發送給頻道 channel1 時, 這個消息就會被髮送給訂閱它的三個客戶端:
具體實例:
建立訂閱頻道名爲 redisChat:
127.0.0.1:6379> SUBSCRIBE redisChat Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "redisChat" 3) (integer) 1
如今,咱們先從新開啓個 redis 客戶端,而後在同一個頻道 redisChat 發佈兩次消息,訂閱者就能接收到消息。
# 發佈的兩次消息 127.0.0.1:6379> PUBLISH redisChat "hello world" (integer) 1 127.0.0.1:6379> PUBLISH redisChat "Nice to meet you" (integer) 1 # 訂閱者接收到的信息 Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "redisChat" 3) (integer) 1 1) "message" 2) "redisChat" 3) "hello world" 1) "message" 2) "redisChat" 3) "Nice to meet you"
注:由於HyperLogLog只會根據輸入元素來計算基數,而不會存儲輸入元素自己,所以不會返回輸入的各個元素。
基數是什麼?
對於["abc", "abc", "2", "3"],基數是["abc", "2", "3"],個數是3.
具體實例以下:
127.0.0.1:6379> pfadd jsh redis (integer) 1 127.0.0.1:6379> pfadd jsh redis (integer) 0 127.0.0.1:6379> pfadd jsh mongodb (integer) 1 127.0.0.1:6379> pfadd jsh rabbitmq (integer) 1 127.0.0.1:6379> pfcount jsh (integer) 3 127.0.0.1:6379> pfadd jsh2 redis (integer) 1 127.0.0.1:6379> pfadd jsh2 a (integer) 1 127.0.0.1:6379> pfcount jsh2 (integer) 2 127.0.0.1:6379> pfmerge jsh jsh2 OK 127.0.0.1:6379> pfcount jsh (integer) 4 127.0.0.1:6379> pfcount jsh2 (integer) 2
注:
Redis 事務能夠一次執行多個命令, 而且帶有如下兩個重要的保證:
一個事務從開始到執行會經歷如下三個階段:
如下是一個事務的例子, 它先以 MULTI 開始一個事務, 而後將多個命令入隊到事務中, 最後由 EXEC 命令觸發事務, 一併執行事務中的全部命令:
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> SET qq-name "python love you" QUEUED 127.0.0.1:6379> GET qq-name QUEUED 127.0.0.1:6379> SADD tag "java" "php" "c++" QUEUED 127.0.0.1:6379> SMEMBERS tag QUEUED 127.0.0.1:6379> EXEC 1) OK 2) "python love you" 3) (integer) 3 4) 1) "c++" 2) "java" 3) "php"
單個 Redis 命令的執行是原子性的,但 Redis 沒有在事務上增長任何維持原子性的機制,因此 Redis 事務的執行並非原子性的。
事務能夠理解爲一個打包的批量執行腳本,但批量指令並不是原子化的操做,中間某條指令的失敗不會致使前面已作指令的回滾,也不會形成後續的指令不作。
好比:
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> SET a aaa QUEUED 127.0.0.1:6379> SET b bbb QUEUED 127.0.0.1:6379> SET c ccc QUEUED 127.0.0.1:6379> EXEC 1) OK 2) OK 3) OK
注:若是在 set b bbb 處失敗,set a 已成功不會回滾,set c 還會繼續執行。
redis 事務的相關命令:
Redis 腳本使用 Lua 解釋器來執行腳本。執行腳本的經常使用命令爲 EVAL。基本語法:
EVAL script numkeys key [key ...] arg [arg ...]
具體實例:
127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first seconde 1) "key1" 2) "key2" 3) "first" 4) "seconde"
9.1 備份數據:
Redis SAVE 命令用於建立當前數據庫的備份
語法:
127.0.0.1:6379> SAVE
具體實例:
127.0.0.1:6379> SAVE OK 127.0.0.1:6379>
注:該命令將在 redis 安裝目錄中建立dump.rdb文件
9.2 恢復數據:
若是須要恢復數據,只需將備份文件 (dump.rdb) 移動到 redis 安裝目錄並啓動服務便可。獲取 redis 目錄可使用 CONFIG 命令,以下所示:
127.0.0.1:6379> CONFIG GET dir 1) "dir" 2) "/root/redis-4.0.8" 127.0.0.1:6379>
以上命令 CONFIG GET dir 輸出的 redis 安裝目錄爲:/root/redis-4.0.8
9.3 後臺執行備份:
建立 redis 備份文件也可使用命令 BGSAVE,該命令在後臺執行。
127.0.0.1:6379> BGSAVE Background saving started 127.0.0.1:6379>
Redis中,一共有16個數據庫,分別是0~15,通常狀況下,進入數據庫默認編號是0
若是咱們要進入指定數據庫,能夠用select語句:
切換到編號爲6的數據庫:
127.0.0.1:6379> SELECT 6 OK 127.0.0.1:6379[6]>
查看數據庫中全部的鍵值:
# 由於編號6 中沒有數據 因此先臨時新建幾個 127.0.0.1:6379[6]> SET a 1 OK 127.0.0.1:6379[6]> SET b 2 OK 127.0.0.1:6379[6]> SET c 3 OK 127.0.0.1:6379[6]> KEYS * 1) "b" 2) "a" 3) "c"
返回當前數據庫中全部key的數目: dbsize
刪除當前數據庫中的全部key: flushdb
清空全部數據庫中的全部key: flushall
把當前數據庫中的key轉移到指定數據庫:move a aim_db,例:
127.0.0.1:6379[6]> set z qqq OK 127.0.0.1:6379[6]> MOVE z 0 (integer) 1 127.0.0.1:6379[6]> SELECT 0 OK 127.0.0.1:6379> GEt z "qqq"
分區是分割數據到多個Redis實例的處理過程,所以每一個實例只保存key的一個子集。
12.1 分區的優點:
12.2 分區的劣勢:
12.3 分區的類型:
Redis 有兩種類型分區。 假設有4個Redis實例 R0,R1,R2,R3,和相似user:1,user:2這樣的表示用戶的多個key,對既定的key有多種不一樣方式來選擇這個key存放在哪一個實例中。也就是說,有不一樣的系統來映射某個key到某個Redis服務。
最簡單的分區方式是按範圍分區,就是映射必定範圍的對象到特定的Redis實例。
好比,ID從0到10000的用戶會保存到實例R0,ID從10001到 20000的用戶會保存到R1,以此類推。
這種方式是可行的,而且在實際中使用,不足就是要有一個區間範圍到實例的映射表。這個表要被管理,同時還須要各 種對象的映射表,一般對Redis來講並不是是好的方法。
另一種分區方法是hash分區。這對任何key都適用,也無需是object_name:這種形式,像下面描述的同樣簡單:
Redis 性能測試是經過同時執行多個命令實現的。
語法:
redis-benchmark [option] [option value]
具體實例:
如下實例同時執行 10000 個請求來檢測性能:
[root@BrianZhu redis-4.0.8]# src/redis-benchmark -n 10000 -q PING_INLINE: 94339.62 requests per second PING_BULK: 92592.59 requests per second SET: 91743.12 requests per second GET: 90090.09 requests per second INCR: 97087.38 requests per second LPUSH: 96153.84 requests per second RPUSH: 96153.84 requests per second LPOP: 97087.38 requests per second RPOP: 97087.38 requests per second SADD: 96153.84 requests per second HSET: 93457.95 requests per second SPOP: 97087.38 requests per second LPUSH (needed to benchmark LRANGE): 94339.62 requests per second LRANGE_100 (first 100 elements): 95238.10 requests per second LRANGE_300 (first 300 elements): 95238.10 requests per second LRANGE_500 (first 450 elements): 96153.84 requests per second LRANGE_600 (first 600 elements): 78740.16 requests per second MSET (10 keys): 83333.34 requests per second
數據持久化是Redis不一樣於其餘緩存的一個特性,具備明顯的有點。但如不但願持久化數據,只做爲普通的緩存用,如memcache
方法:
將配置文件中關於save配置信息所有註釋,以下:
#save 900 1 #save 300 10 #save 60 10000
或執行操做命令:
CONFIG SET save ""
執行命令後,無需重啓便可生效
都到這裏了 確定命令都已經玩膩了吧 如今來新菜了 那就是Redis的可視化工具 它的名字叫:RedisDesktopManager 下載地址:https://redisdesktop.com/download
安裝鏈接就很簡單了 和windows的其餘軟件同樣 下一步 下一步就行了 軟件是全英文的 可是看懂也不須要太好的英文水平 其實我就是個英文盲 下面就貼幾張圖 結束吧