高可用Redis(一):通用命令,數據結構和內部編碼,單線程架構

1.通用API

1.1 keys命令和dbsize命令

keys *              遍歷全部key
keys [pattern]      遍歷模式下全部的key
dbsize              計算Redis中全部key的總數

例子:php

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> set php good
OK
127.0.0.1:6379> set python best
OK
127.0.0.1:6379> keys *          # 查看Redis中全部的key
1) "hello"
2) "python"
3) "php"
127.0.0.1:6379> dbsize          # 查看Redis中key的總數
(integer) 3
127.0.0.1:6379> keys p*         # 查看Redis中以p開頭的全部的key
1) "python"
2) "php"
127.0.0.1:6379> set perl aaa
OK
127.0.0.1:6379> set c++ bbb
OK
127.0.0.1:6379> keys p*          # 查看Redis中全部的key
1) "python"
2) "php"
3) "perl"
127.0.0.1:6379> dbsize          # 查看Redis中key的總數
(integer) 5
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 k4 v4
OK
127.0.0.1:6379> dbsize          # 查看Redis中key的總數
(integer) 9

注意事項:python

!.keys命令的時間複雜度爲O(n)
2.在生產環境中,使用keys命令取出全部key並無什麼意義,並且Redis是單線程應用,若是Redis中存的key不少,使用keys命令會阻塞其餘命令執行,因此keys命令通常不在生產環境中使用
3.dbsize命令的時間複雜度是O(1)
4.Redis內置一個計數器,能夠實時更新Redis中key的總數,因此dbsize命令能夠在線上使用

1.2 exists命令和del命令

exists key              判斷一個key是否存在
del key [key...]        刪除指定的key-value

例子:c++

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> exists k1       # 判斷k1是否存在
(integer) 1     
127.0.0.1:6379> exists k2       # 判斷k2是否存在
(integer) 1
127.0.0.1:6379> del k1          # 刪除k1這個鍵值對
(integer) 1
127.0.0.1:6379> exists k1       # 判斷k1是否存在,0表示不存在 
(integer) 0
127.0.0.1:6379> exists k2       # 判斷k2是否存在,1表示key存在
(integer) 1
127.0.0.1:6379> set a1 b1 
OK
127.0.0.1:6379> set a2 b2
OK
127.0.0.1:6379> del a1 a2       # 刪除a1和a2鍵值對
(integer) 2

注意事項:redis

del命令和exists命令的時間複雜度爲O(1)

1.3 expire命令,ttl命令和persist命令

expire key seconds      設置key的過時時間,多少seconds後過時
ttl key                 查看key剩餘的過時時間
persist key             去掉key的過時時間

例子:編程

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> expire hello 20
(integer) 1             # 設置hello這個key的過時時間爲20秒
127.0.0.1:6379> ttl hello
(integer) 17            # 還有17秒過時
127.0.0.1:6379> ttl hello
(integer) 11            # 還有11秒過時
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> ttl hello
(integer) 5             # 還有5秒過時
127.0.0.1:6379> ttl hello
(integer) -2            # -2表示key已經不存在了 
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> expire hello 20
(integer) 1             # 設置hello這個key的過時時間爲20秒
127.0.0.1:6379> ttl hello
(integer) 15            # 還有15秒過時
127.0.0.1:6379> persist hello
(integer) 1             # 刪除hello的過時時間
127.0.0.1:6379> ttl hello 
(integer) -1            # -1表示key存在,而且沒有過時時間
127.0.0.1:6379> get hello
"world"

注意事項:api

expire命令和ttl命令,persist命令的時間複雜度都是O(1)

1.4 type命令

type key        # 返回key的類型

例子:數據結構

127.0.0.1:6379> set a b
OK
127.0.0.1:6379> type a
string
127.0.0.1:6379> sadd myset 1 2 3
(integer) 3
127.0.0.1:6379> type myset
set
127.0.0.1:6379> type abc        # 查看一個不存在的key時,返回None,表示key不存在
none

注意事項:多線程

type的返回結果有6種:string,hash,list,set,zset,none
type命令的時間複雜度爲O(1)

2.數據結構和內部編碼

Redis每種數據結構及對應的內部編碼以下圖所示架構

3.單線程架構

Redis內部使用單線程架構。異步

好比一條公路,這條公路只有一條車道。全部從這條車道上行駛的車,都必須按先來後到的順序依次行駛

Redis一個瞬間只能執行一條命令,不能執行兩條命令

3.1 Redis單線程爲何這麼快

1.純內存
Redis把全部的數據都保存在內存中,而內存的響應速度是很是快的

2.非阻塞IO
Redis使用epoll異步非阻塞模型
Redis自身實現了事件處理

3.避免線程切換和競態消耗
在使用多線程編程中,線程之間的切換也會消耗一部分CPU資源,
若是不合理的實現多線程編程,可能比單線程還要慢

注意事項:

一次只運行一條命令
拒絕長(慢)命令
    keys 
    flushall
    flushdb
    slow lua script
    mutil/exec
    operate
相關文章
相關標籤/搜索