成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

redis從入門到精通

sutaking / 1412人閱讀

摘要:上圖演示了對(duì)這個(gè)進(jìn)行位操作,引用最大的一個(gè)特點(diǎn),就是它是一種變長(zhǎng)的編碼方式。使用的位操作可以用來統(tǒng)計(jì)在線人數(shù)。。的位操作過大,就會(huì)填充。位操作假設(shè)有這樣一個(gè)需求,要將大寫的字符始終轉(zhuǎn)換成小寫的字符,可以使用來操作。

解壓后的安裝

[root@server1 redis-3.0.5]# make

指定安裝目錄:

[root@server1 redis-3.0.5]# make PREFIX=/usr/local/redis install
進(jìn)入/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

啟動(dòng):

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

出現(xiàn):

               _._                                                  
           _.-``__ ""-._                                             
      _.-``    `.  `_.  ""-._           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

這只是前臺(tái)啟動(dòng),關(guān)閉終端自動(dòng)停止。

新建一個(gè)窗口,進(jìn)入終端命令:

[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進(jìn)程在后臺(tái)運(yùn)行

./redis-server& redis.conf

另一種方式就是修改后臺(tái)文件:

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

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

高版本會(huì)遇到的奇怪問題:

http://blog.csdn.net/qq_25797...

基本命令的使用:
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 * 命令查找當(dāng)前庫(kù)下面所有的key值。keys 后面可以跟上一個(gè)正則表達(dá)式。

當(dāng)key不存在時(shí):

127.0.0.1:6379> keys age
(empty list or set)
隨機(jī)的獲取一個(gè)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> 

如果試圖修改一個(gè)不存在的key,將會(huì)報(bào)出錯(cuò)誤:

127.0.0.1:6379> rename name nickname
(error) ERR no such key

但是有一種情況,如果說改名后的新的key名已經(jīng)存在,那么原來的key該怎么辦呢?

127.0.0.1:6379> rename sex  age
OK
127.0.0.1:6379> get age
"1"
127.0.0.1:6379> 

請(qǐng)注意,age原來是24.現(xiàn)在是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,修改失?。ú蛔魅魏尾僮鳎⒎祷?

redis的數(shù)據(jù)庫(kù)

cat redis.conf
可以查看到 redis在初始化的時(shí)候?yàn)槲覀兂跏蓟?6個(gè)數(shù)據(jù)庫(kù)。redis默認(rèn)使用0號(hào)數(shù)據(jù)庫(kù)。并告知使用select 命令來選擇數(shù)據(jù)庫(kù):

# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT  where
# dbid is a number between 0 and "databases"-1
databases 16

假設(shè)超過了數(shù)據(jù)庫(kù)的索引,就會(huì)報(bào)出非法的DB索引:

127.0.0.1:6379> select 23
(error) ERR invalid DB index
127.0.0.1:6379> 
move:將key移動(dòng)到別的數(shù)據(jù)庫(kù)
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> 

此時(shí)選擇1號(hào)數(shù)據(jù)庫(kù):

127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "sex"
127.0.0.1:6379[1]> 
expire設(shè)置有效期

memcache有有效期,即使設(shè)置為永不失效,也只能保存30天。redis本身是當(dāng)做存儲(chǔ)的,所以沒有有效期,即永遠(yuǎn)不失效。

1.ttl查詢有效期,默認(rèn)返回秒單位計(jì)時(shí)

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表示永久有效

如果查詢一個(gè)不在的key的生命周期,將會(huì)返回-2(2.8以后)

127.0.0.1:6379> ttl gender
(integer) -2

expire設(shè)置有效期,是用秒作為單位的。

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命令:重復(fù)設(shè)置key怎么辦

對(duì)相同的key多次設(shè)置值,會(huì)直接覆蓋:

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 來保證如果已經(jīng)有這個(gè)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> 

此外還有一個(gè)xx選項(xiàng)。

append :追加 setrange 與 getrange getset:先得到舊的值,再設(shè)置新值
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> 

如果是一個(gè)字符串呢?

127.0.0.1:6379> incr  status
(error) ERR value is not an integer or out of range
127.0.0.1:6379> 

redis:秒殺系統(tǒng)的設(shè)計(jì)與實(shí)踐

一次增加或減少指定的數(shù)字
127.0.0.1:6379> incrby  age 5
(integer) 25
127.0.0.1:6379> 
一次增加或減少指定的浮點(diǎn)型數(shù)字
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> 

上圖演示了對(duì)char這個(gè)key 進(jìn)行位操作,

引用:

UTF-8最大的一個(gè)特點(diǎn),就是它是一種變長(zhǎng)的編碼方式。它可以使用1~4個(gè)字節(jié)表示一個(gè)符號(hào),根據(jù)不同的符號(hào)而變化字節(jié)長(zhǎng)度,當(dāng)字符在ASCII碼的范圍時(shí),就用一個(gè)字節(jié)表示,保留了ASCII字符一個(gè)字節(jié)的編碼做為它的一部分,注意的是unicode一個(gè)中文字符占2個(gè)字節(jié),而UTF-8一個(gè)中文字符占3個(gè)字節(jié)

redis存儲(chǔ)是UTF-8.之所以能夠位操作,就是因?yàn)榕cacii碼保持了統(tǒng)一。不然就不是offset2了。

使用redis的位操作可以用來統(tǒng)計(jì)在線人數(shù)。。等等。。。
https://www.zhihu.com/questio...

redis的位操作offset過大,就會(huì)填充0。與本身存儲(chǔ)的大小無關(guān)。

127.0.0.1:6379> set name "你好"
OK
127.0.0.1:6379> get name
"xe4xbdxa0xe5xa5xbd"
127.0.0.1:6379> setbit name 5 0
(integer) 1
127.0.0.1:6379> get name
"xe0xbdxa0xe5xa5xbd"
127.0.0.1:6379> 

你好,總共是兩個(gè)漢字,6個(gè)字節(jié)。

redis所有的存儲(chǔ)都是string,set int 1 實(shí)際上是 存儲(chǔ)了1這個(gè)字符串(ascii編碼)

實(shí)際上,可以直接設(shè)置位,比如:
127.0.0.1:6379> setbit lower 2 1
lower并不存在,設(shè)置完畢以后就是 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,因?yàn)?的ascii碼就是00110000。

bitop:位操作

假設(shè)有這樣一個(gè)需求,要將大寫的字符始終轉(zhuǎn)換成小寫的字符,可以使用bittop來操作。
由于小寫字母的整數(shù)值始終比大寫字母多32,可以使用OR操作來直接位運(yùn)算:

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中的第一個(gè)參數(shù)or可以是 and,or,not, xor
第二個(gè)參數(shù)是結(jié)果存放于哪個(gè)key
第三,四個(gè)參數(shù)表示 操作的兩個(gè)key

鏈表

lpush 鏈表名(key) 值
像這個(gè)鏈表左端推入,
rpush 鏈表名(key) 值
從這個(gè)鏈表左端插入。

127.0.0.1:6379> lpush list a //從list這個(gè)鏈表左端插入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 查看鏈表內(nèi)容。從左邊則是0開始,右邊是-1開始,因?yàn)槭孪日娌恢梨湵韨€(gè)數(shù)
所以要查看所有的內(nèi)容,可以:
lrange list 0 -1

lpush與rpush也支持一次性插入多個(gè)值:

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 根據(jù)參數(shù) COUNT 的值,移除列表中與參數(shù) VALUE 相等的元素。

COUNT 的值可以是以下幾種:

count > 0 : 從表頭開始向表尾搜索,移除與 VALUE 相等的元素,數(shù)量為 COUNT 。
count < 0 : 從表尾開始向表頭搜索,移除與 VALUE 相等的元素,數(shù)量為 COUNT 的絕對(duì)值。
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

列出集群當(dāng)前已知的所有節(jié)點(diǎn)(node),以及這些節(jié)點(diǎn)的相關(guān)信息。

cluster nodes

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/61782.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<