redis從入門到精通

解壓後的安裝

[root@server1 redis-3.0.5]# makejavascript

指定安裝目錄:java

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

[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

_._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           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複製代碼

這只是前臺啓動,關閉終端自動中止。數據庫

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

[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安全

另外一種方式就是修改後臺文件:app

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

[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

相關文章
相關標籤/搜索