redis從入門到精通

徐家三少發表於2017-01-19

解壓後的安裝

[root@server1 redis-3.0.5]# make

指定安裝目錄:

[root@server1 redis-3.0.5]# make PREFIX=/usr/local/redis install
進入/usr/local/redis裡面:

[root@server1 redis]# ls
bin
[root@server1 redis]# cd bin
[root@server1 bin]# ls
redis-benchmark  redis-check-aof  redis-check-dump  redis-cli  
redis-sentinel  redis-server複製程式碼
[root@server1 bin]# cp /root/redis-3.0.5/redis.conf  redis.conf複製程式碼

啟動:

[root@server1 bin]# ./redis-server redis.conf複製程式碼

出現:

               _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.0.5 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 23880
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

23880:M 12 Mar 22:33:16.711 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
23880:M 12 Mar 22:33:16.711 # Server started, Redis version 3.0.5
23880:M 12 Mar 22:33:16.711 # 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.
23880:M 12 Mar 22:33:16.711 # 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.
23880:M 12 Mar 22:33:16.712 * The server is now ready to accept connections on port 6379複製程式碼

這只是前臺啟動,關閉終端自動停止。

新建一個視窗,進入終端命令:

[root@server1 ~]# cd /usr/local/redis
[root@server1 redis]# ls
bin
[root@server1 redis]# cd bin
[root@server1 bin]# ls
redis-benchmark  redis-check-dump  redis.conf      redis-server
redis-check-aof  redis-cli         redis-sentinel
[root@server1 bin]#  ./redis-cli
127.0.0.1:6379> 
127.0.0.1:6379> set title adcd
OK
127.0.0.1:6379> get title
"adcd"
127.0.0.1:6379> set title 2
OK
127.0.0.1:6379> get title
"2"
127.0.0.1:6379>複製程式碼

讓redis程式在後臺執行

./redis-server& redis.conf

另一種方式就是修改後臺檔案:

[root@server1 bin]# vim redis.conf
daemonize no變成 yes
然後:

[root@server1 bin]# ./redis-server redis.conf

高版本會遇到的奇怪問題:

blog.csdn.net/qq_25797077…

基本命令的使用:


127.0.0.1:6379> set title 1234
OK
127.0.0.1:6379> set name jerry
OK
127.0.0.1:6379> keys *
1) "title"
2) "name"
127.0.0.1:6379>複製程式碼

keys * 命令查詢當前庫下面所有的key值。keys 後面可以跟上一個正規表示式。

當key不存在時:

127.0.0.1:6379> keys age
(empty list or set)複製程式碼

隨機的獲取一個key

randomkey


127.0.0.1:6379> randomkey
"name"
127.0.0.1:6379> randomkey
"name"
127.0.0.1:6379> randomkey
"title"
127.0.0.1:6379> randomkey
"title"
127.0.0.1:6379> randomkey
"name"
127.0.0.1:6379> randomkey
"title"
127.0.0.1:6379> randomkey
"name"
127.0.0.1:6379> randomkey
"sex"複製程式碼

判斷key是否存在

exists key +key名字
1表示存在,0表示不存在

127.0.0.1:6379> exists key name
(integer) 1
127.0.0.1:6379> exists key birthday
(integer) 0
127.0.0.1:6379>複製程式碼

刪除key

del key1 key2 ...

127.0.0.1:6379> del  title
(integer) 1
127.0.0.1:6379> keys *
1) "sex"
2) "name"
127.0.0.1:6379> 
127.0.0.1:6379> del sex name
(integer) 2
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>複製程式碼

改變key的名字


127.0.0.1:6379> set name jerry
OK
127.0.0.1:6379> set age 24
OK
127.0.0.1:6379> set sex 1
OK
127.0.0.1:6379> keys *
1) "sex"
2) "age"
3) "name"
127.0.0.1:6379> rename name nickname
OK
127.0.0.1:6379> keys *
1) "nickname"
2) "sex"
3) "age"
127.0.0.1:6379>複製程式碼

如果試圖修改一個不存在的key,將會報出錯誤:


127.0.0.1:6379> rename name nickname
(error) ERR no such key複製程式碼

但是有一種情況,如果說改名後的新的key名已經存在,那麼原來的key該怎麼辦呢?


127.0.0.1:6379> rename sex  age
OK
127.0.0.1:6379> get age
"1"
127.0.0.1:6379>複製程式碼

請注意,age原來是24.現在是1.

使用renamenx安全的替換key:

127.0.0.1:6379> set name  jerry
OK
127.0.0.1:6379> set age 24
OK
127.0.0.1:6379> set sex 1
OK複製程式碼

127.0.0.1:6379> renamenx sex age
如果修改成功,將返回1,修改失敗(不作任何操作)將返回0

redis的資料庫

cat redis.conf
可以檢視到 redis在初始化的時候為我們初始化了16個資料庫。redis預設使用0號資料庫。並告知使用select 命令來選擇資料庫:

# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16複製程式碼

假設超過了資料庫的索引,就會報出非法的DB索引:

127.0.0.1:6379> select 23
(error) ERR invalid DB index
127.0.0.1:6379>複製程式碼

move:將key移動到別的資料庫

127.0.0.1:6379> keys *
1) "nickname"
2) "sex"
3) "age"
127.0.0.1:6379> move sex 1
(integer) 1
127.0.0.1:6379> keys *
1) "nickname"
2) "age"
127.0.0.1:6379>複製程式碼

此時選擇1號資料庫:

127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "sex"
127.0.0.1:6379[1]>複製程式碼

expire設定有效期

memcache有有效期,即使設定為永不失效,也只能儲存30天。redis本身是當做儲存的,所以沒有有效期,即永遠不失效。

1.ttl查詢有效期,預設返回秒單位計時


127.0.0.1:6379> keys *
1) "nickname"
2) "age"
127.0.0.1:6379> ttl age
(integer) -1
127.0.0.1:6379> 
返回-1表示永久有效複製程式碼

如果查詢一個不在的key的生命週期,將會返回-2(2.8以後)

127.0.0.1:6379> ttl gender
(integer) -2複製程式碼
  1. expire設定有效期,是用秒作為單位的。
127.0.0.1:6379> expire age 10
(integer) 1
127.0.0.1:6379> get age
"24"
127.0.0.1:6379> get age
"24"
127.0.0.1:6379> get age
(nil)
127.0.0.1:6379>複製程式碼

3.pttl和pexpire:使用毫秒作為宣告週期

127.0.0.1:6379> pttl age
(integer) -1
127.0.0.1:6379> pexpire age 100000
(integer) 1
127.0.0.1:6379> pttl age
(integer) 97177
127.0.0.1:6379> pttl age
(integer) 94561
127.0.0.1:6379> pttl age
(integer) 93000
127.0.0.1:6379> pttl age
(integer) 91937
127.0.0.1:6379>複製程式碼

persist:讓 key重新永久有效

127.0.0.1:6379> set age 24
OK
127.0.0.1:6379> expire age 20
(integer) 1
127.0.0.1:6379> ttl age
(integer) 14
127.0.0.1:6379>  persist age
(integer) 1
127.0.0.1:6379> ttl age
(integer) -1
127.0.0.1:6379>複製程式碼

set命令:重複設定key怎麼辦

對相同的key多次設定值,會直接覆蓋:

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>  set  name  jerry
OK
127.0.0.1:6379> set name   herry
OK
127.0.0.1:6379> get name
"herry"
127.0.0.1:6379>複製程式碼

使用 set keyname value nx 來保證如果已經有這個key就不做任何操作,防止key被覆蓋:

127.0.0.1:6379> set site www.baodu.com
OK
127.0.0.1:6379> set site www.taobao.com  nx
(nil)
127.0.0.1:6379> get site
"www.baodu.com"
127.0.0.1:6379>複製程式碼

此外還有一個xx選項。

append :追加

setrange 與 getrange

getset:先得到舊的值,再設定新值

127.0.0.1:6379> set  status  sleep
OK
127.0.0.1:6379> getset status work
"sleep"
127.0.0.1:6379> get status
"work"
127.0.0.1:6379>複製程式碼

加一與減一:

incr 與 decr


127.0.0.1:6379> set  age 20
OK
127.0.0.1:6379> incr age
(integer) 21
127.0.0.1:6379> get age
"21"
127.0.0.1:6379> decr age
(integer) 20
127.0.0.1:6379>複製程式碼

如果是一個字串呢?

127.0.0.1:6379> incr  status
(error) ERR value is not an integer or out of range
127.0.0.1:6379>複製程式碼

redis:秒殺系統的設計與實踐

一次增加或減少指定的數字

127.0.0.1:6379> incrby  age 5
(integer) 25
127.0.0.1:6379>複製程式碼

###一次增加或減少指定的浮點型數字

127.0.0.1:6379> incrbyfloat  age 0.6
"25.6"複製程式碼

位操作

位操作就是在 0和1 位上來操作。

127.0.0.1:6379> set char A
OK
127.0.0.1:6379> setbit char 2 1
(integer) 0
127.0.0.1:6379> get char
"a"
127.0.0.1:6379>複製程式碼

上圖演示了對char這個key 進行位操作,

引用:

UTF-8最大的一個特點,就是它是一種變長的編碼方式。它可以使用1~4個位元組表示一個符號,根據不同的符號而變化位元組長度,當字元在ASCII碼的範圍時,就用一個位元組表示,保留了ASCII字元一個位元組的編碼做為它的一部分,注意的是unicode一箇中文字元佔2個位元組,而UTF-8一箇中文字元佔3個位元組

redis儲存是UTF-8.之所以能夠位操作,就是因為與acii碼保持了統一。不然就不是offset2了。

使用redis的位操作可以用來統計線上人數。。等等。。。
www.zhihu.com/question/20…

redis的位操作offset過大,就會填充0。與本身儲存的大小無關。

127.0.0.1:6379> set name "你好"
OK
127.0.0.1:6379> get name
"\xe4\xbd\xa0\xe5\xa5\xbd"
127.0.0.1:6379> setbit name 5 0
(integer) 1
127.0.0.1:6379> get name
"\xe0\xbd\xa0\xe5\xa5\xbd"
127.0.0.1:6379>複製程式碼

你好,總共是兩個漢字,6個位元組。

redis所有的儲存都是string,set int 1 實際上是 儲存了1這個字串(ascii編碼)

實際上,可以直接設定位,比如:
127.0.0.1:6379> setbit lower 2 1
lower並不存在,設定完畢以後就是 00100000

127.0.0.1:6379> setbit lower 2 1
(integer) 0
127.0.0.1:6379> get lower
" "
127.0.0.1:6379> setbit lower 3 1
(integer) 0
127.0.0.1:6379> get lower
"0"
127.0.0.1:6379>複製程式碼

列印出0,因為0的ascii碼就是00110000。

bitop:位操作

假設有這樣一個需求,要將大寫的字元始終轉換成小寫的字元,可以使用bittop來操作。
由於小寫字母的整數值始終比大寫字母多32,可以使用OR操作來直接位運算:

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> setbit lower 2 1
(integer) 0
127.0.0.1:6379> set char Q
OK
127.0.0.1:6379> bitop or char  char lower
(integer) 1
127.0.0.1:6379> get char
"q"
127.0.0.1:6379>複製程式碼

bitop中的第一個引數or可以是 andornot, xor
第二個引數是結果存放於哪個key
第三,四個參數列示 操作的兩個key

#連結串列
lpush 連結串列名(key) 值
像這個連結串列左端推入,
rpush 連結串列名(key) 值
從這個連結串列左端插入。

127.0.0.1:6379> lpush list a //從list這個連結串列左端插入a,如下以此類推
(integer) 1
127.0.0.1:6379> rpush list b
(integer) 2
127.0.0.1:6379> rpush list c
(integer) 3
127.0.0.1:6379> lpush list 0
(integer) 4
127.0.0.1:6379> lrange 0 4
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> lrange list 0 4
1) "0"
2) "a"
3) "b"
4) "c"
127.0.0.1:6379>複製程式碼

lrange list 0 4 檢視連結串列內容。從左邊則是0開始,右邊是-1開始,因為事先真不知道連結串列個數
所以要檢視所有的內容,可以:
lrange list 0 -1

lpush與rpush也支援一次性插入多個值:

127.0.0.1:6379> lpush anwser a b c d e f g
(integer) 7
127.0.0.1:6379> lrange  anwser 0 -1
1) "g"
2) "f"
3) "e"
4) "d"
5) "c"
6) "b"
7) "a"
127.0.0.1:6379>複製程式碼

從左邊插入自然是倒著的。

lpop與rpop:從連結串列左端或者連結串列右端彈出值

刪除指定的值

Redis Lrem 根據引數 COUNT 的值,移除列表中與引數 VALUE 相等的元素。

COUNT 的值可以是以下幾種:

count > 0 : 從表頭開始向表尾搜尋,移除與 VALUE 相等的元素,數量為 COUNT 。
count < 0 : 從表尾開始向表頭搜尋,移除與 VALUE 相等的元素,數量為 COUNT 的絕對值。
count = 0 : 移除表中所有與 VALUE 相等的值。複製程式碼
127.0.0.1:6379> rpush anwser a b b b c d e f g
(integer) 9
127.0.0.1:6379> rrme anwser 2 b
(error) ERR unknown command 'rrme'
127.0.0.1:6379> rrem anwser 2 b
(error) ERR unknown command 'rrem'
127.0.0.1:6379> lrem anwser 2 b
(integer) 2
127.0.0.1:6379> lrange  anwser 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
7) "g"
127.0.0.1:6379>複製程式碼

檢視叢集目前狀況

redis-cli -c -p 16001

列印叢集的資訊

cluster info

列出叢集當前已知的所有節點(node),以及這些節點的相關資訊。

cluster nodes

相關文章