1. 程式人生 > 其它 >三角形最小路徑

三角形最小路徑

Redis支援五種資料型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)。

Redis是單程序,單執行緒,單例項的,所以,所有操作都是原子性的。

Redis keys

Redis key值是二進位制安全的,這意味著可以用任何二進位制序列作為key值,從形如”foo”的簡單字串到一個JPEG檔案的內容都可以。空字串也是有效key值。

Redis keys命令:

命令描述
del key該命令用於在 key 存在時刪除 key
dump key序列化給定 key ,並返回被序列化的值
exists key檢查給定 key 是否存在
expire key seconds為給定 key 設定過期時間,以秒計
expireat key timestampexpireat的作用和expire類似,都用於為 key 設定過期時間。 不同在於 expireat 命令接受的時間引數是 UNIX 時間戳(unix timestamp)。
pexpire key milliseconds設定 key 的過期時間以毫秒計
pexpireat key milliseconds-timestamp設定 key 過期時間的時間戳(unix timestamp) 以毫秒計
keys pattern查詢所有符合給定模式( pattern)的 key
move key db將當前資料庫的 key 移動到給定的資料庫 db 當中
persist key移除 key 的過期時間,key 將持久保持
pttl key以毫秒為單位返回 key 的剩餘的過期時間
ttl key以秒為單位,返回給定 key 的剩餘生存時間(TTL, time to live)
randomkey從當前資料庫中隨機返回一個 key
rename key newkey修改 key 的名稱
renamenx key newkey僅當 newkey 不存在時,將 key 改名為 newkey
scan cursor [match pattern] [count count]迭代資料庫中的資料庫鍵
type key返回 key 所儲存的值的型別

String

string 是 redis 最基本的型別,你可以理解成與 Memcached 一模一樣的型別,一個 key 對應一個 value。

string 型別是二進位制安全的。意思是 redis 的 string 可以包含任何資料。比如jpg圖片或者序列化的物件。

string 型別是 Redis 最基本的資料型別,string 型別的值最大能儲存 512MB。

Redis 字串資料型別的相關命令用於管理 redis 字串值,基本語法如下:

redis 127.0.0.1:6379> COMMAND KEY_NAME

set 設定值,get查詢值

127.0.0.1:6379> set bo 1
OK
127.0.0.1:6379> get bo
"1"

數值操作

  • incr key:將 key 中儲存的數字值增一
  • incrby key increment:將 key 所儲存的值加上給定的增量值(increment)
  • incrbyfloat key increment:將 key 所儲存的值加上給定的浮點增量值(increment)
  • decr key:將 key 中儲存的數字值減一
  • decrby key decrement:key 所儲存的值減去給定的減量值(decrement)
127.0.0.1:6379> set bo 1
OK
127.0.0.1:6379> get bo
"1"
127.0.0.1:6379> incr bo
(integer) 2
127.0.0.1:6379> decr bo
(integer) 1
127.0.0.1:6379> incrby bo 100
(integer) 101
127.0.0.1:6379> decrby bo 100
(integer) 1
127.0.0.1:6379> incrbyfloat bo 100.5
"101.5"

getset:為key設定新值並且返回原值

應用場景:例如:你的系統每當有新使用者訪問時就用命令操作一個Redis key。你希望每小時對這個資訊收集一次。你就可以這個key並給其賦值0並讀取原值。

127.0.0.1:6379> set bo 100
OK
127.0.0.1:6379> getset bo 0
"100"
127.0.0.1:6379> get bo
"0"

mset mget:一次儲存或獲取多個key對應的值

127.0.0.1:6379> mset key1 1 key2 2 key3 3
OK
127.0.0.1:6379> mget key1 key2 key3
1) "1"
2) "2"
3) "3"

常用命令:

命令描述
set key value設定指定 key 的值
get key value獲取指定 key 的值
getrange key start end返回 key 中字串值的子字元
getset key value將給定 key 的值設為 value ,並返回 key 的舊值(old value)
getbit key offset對 key 所儲存的字串值,獲取指定偏移量上的位(bit)
mget key1 key2 …獲取所有(一個或多個)給定 key 的值
setbit key offset value對 key 所儲存的字串值,設定或清除指定偏移量上的位(bit)
setex key seconds value將值 value 關聯到 key ,並將 key 的過期時間設為 seconds (以秒為單位)
setnx key value只有在 key 不存在時設定 key 的值
setrange key offset value用 value 引數覆寫給定 key 所儲存的字串值,從偏移量 offset 開始
strlen key返回 key 所儲存的字串值的長度
mset key1 value key2 value …同時設定一個或多個 key-value 對
msetnx key1 value key2 value …同時設定一個或多個 key-value 對,當且僅當所有給定 key 都不存在
psetex key milliseconds value這個命令和 SETEX 命令相似,但它以毫秒為單位設定 key 的生存時間,而不是像 SETEX 命令那樣,以秒為單位
incr key這個命令和 SETEX 命令相似,但它以毫秒為單位設定 key 的生存時間,而不是像 SETEX 命令那樣,以秒為單位
incrby key increment將 key 所儲存的值加上給定的增量值(increment)
incrbyfloat key increment將 key 所儲存的值加上給定的浮點增量值(increment)
decr key將 key 中儲存的數字值減一
decrby key decrementkey 所儲存的值減去給定的減量值(decrement)
append key value如果 key 已經存在並且是一個字串, APPEND 命令將指定的 value 追加到該 key 原來值(value)的末尾

bitmap

Redis從2.2.0版本開始新增了setbit,getbit,bitcount等幾個bitmap相關命令。雖然是新命令,但是並沒有新增新的資料型別,因為setbit等命令只不過是在set上的擴充套件。

就是通過一個bit位來表示某個元素對應的值或者狀態,其中的key就是對應元素本身。我們知道8個bit可以組成一個Byte,所以bitmap本身會極大的節省儲存空間。

常用命令:

命令描述
setbit key offset value給一個指定key的值得第offset位 賦值為value(0 or 1)
getbit key offset返回一個指定key的第offset位二進位制資訊
bitcount key [start end]返回一個指定key從start到end的二進位制資訊
bitpos key tartgetbit [start end]計算點陣圖指定範圍第一個偏移量對應的的值等於targetBit的位置,找不到返回-1,start與end沒有設定,則取全部, targetBit只能取0或者1
bitop op destKey key1 [key2…]做多個BitMap的and(交集)、or(並集)、not(非)、xor(異或)操作並將結果儲存在destKey中

使用場景一:使用者簽到

很多網站都提供了簽到功能,並且需要展示最近一個月的簽到情況,那麼我們就可以用bitmap實現:

使用者bo這個月第一天簽到,第十天簽到,第二十天簽到!

然後用bitcount統計出來當月簽到幾天:

127.0.0.1:6379> setbit bo 1 1
(integer) 0
127.0.0.1:6379> setbit bo 10 1
(integer) 0
127.0.0.1:6379> setbit bo 20 1
(integer) 0
127.0.0.1:6379> bitcount bo 0 -1
(integer) 3

使用場景二:統計活躍使用者

使用時間作為cacheKey,然後使用者ID為offset,如果當日活躍過就設定為1。

20200101 使用者1和使用者2活躍

20200102 使用者2和使用者3活躍

127.0.0.1:6379> setbit 20200101 1 1
(integer) 0
127.0.0.1:6379> setbit 20200101 2 1
(integer) 0
127.0.0.1:6379> setbit 20200102 2 1
(integer) 0
127.0.0.1:6379> setbit 20200102 3 1
(integer) 0

現在我們要計算1號和2號都活躍過的使用者個數怎麼辦?

我們可以使用bitop op destKey key1 [key2…]做交集

127.0.0.1:6379> bitop and destkey 20200101 20200102
(integer) 1
127.0.0.1:6379> bitcount destkey 0 -1
(integer) 1

Hash

Redis hash 是一個 string 型別的 field(欄位) 和 value(值) 的對映表,hash 特別適合用於儲存物件。

Redis 中每個 hash 可以儲存 232 - 1 鍵值對(40多億)。

例項:

127.0.0.1:6379> hmset user name bobo age 18 sex man
OK
127.0.0.1:6379> hget user name
"bobo"
127.0.0.1:6379> hgetall user
1) "name"
2) "bobo"
3) "age"
4) "18"
5) "sex"
6) "man"

常用命令:

命令描述
hdel key field1 [field2 …]刪除一個或多個雜湊表字段
hexists key field檢視雜湊表 key 中,指定的欄位是否存在
hget key field獲取儲存在雜湊表中指定欄位的值
hgetall key獲取在雜湊表中指定 key 的所有欄位和值
hincrby key field increament為雜湊表 key 中的指定欄位的整數值加上增量 increment
hincrbyfloat key field increment為雜湊表 key 中的指定欄位的浮點數值加上增量 increment
hkeys key獲取所有雜湊表中的欄位
hlen key獲取雜湊表中欄位的數量
hmget key field1 [field2…]獲取所有給定欄位的值
hmset key field1 value1 [field2 value2…]同時將多個 field-value (域-值)對設定到雜湊表 key 中
hset key field value將雜湊表 key 中的欄位 field 的值設為 value
hsetnx key field value只有在欄位 field 不存在時,設定雜湊表字段的值
hvals key獲取雜湊表中所有值
hscan key cursor [match pattern] [count count]迭代雜湊表中的鍵值對

list

Redis列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素到列表的頭部(左邊)或者尾部(右邊)

一個列表最多可以包含 232 - 1 個元素 (4294967295, 每個列表超過40億個元素)。

一般意義上講,列表就是有序元素的序列:10,20,1,2,3就是一個列表。但用陣列實現的List和用Linked List實現的List,在屬性方面大不相同。

Redis lists基於Linked Lists實現。這意味著即使在一個list中有數百萬個元素,在頭部或尾部新增一個元素的操作,其時間複雜度也是常數級別的。用LPUSH 命令在十個元素的list頭部新增新元素,和在千萬元素list頭部新增新元素的速度相同。

那麼,壞訊息是什麼?在陣列實現的list中利用索引訪問元素的速度極快,而同樣的操作在linked list實現的list上沒有那麼快。

Redis Lists用linked list實現的原因是:對於資料庫系統來說,至關重要的特性是:能非常快的在很大的列表上新增元素。另一個重要因素是,正如你將要看到的:Redis lists能在常數時間取得常數長度。

如果快速訪問集合元素很重要,建議使用可排序集合(sorted sets)。可排序集合我們會隨後介紹。

list中新增元素

LPUSH命令可向list的左邊(頭部)新增一個新元素,而RPUSH命令可向list的右邊(尾部)新增一個新元素。最後LRANGE命令可從list中取出一定範圍的元素:

127.0.0.1:6379> rpush mylist A
(integer) 1
127.0.0.1:6379> rpush mylist B
(integer) 2
127.0.0.1:6379> lpush mylist first
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"

list中刪除元素

還有一個重要的命令是pop,它從list中刪除元素並同時返回刪除的值。可以在左邊或右邊操作。

127.0.0.1:6379> rpush mylist a b c
(integer) 3
127.0.0.1:6379> rpop mylist
"c"
127.0.0.1:6379> lpop mylist
"a"
127.0.0.1:6379> lpop mylist
"b"
127.0.0.1:6379> rpop mylist
(nil)

常用命令

命令描述
blpop key1 [key2…] timeout移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
brpop key1 [key2…] timeout移出並獲取列表的最後一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止
brpoplpush source destination timeout從列表中彈出一個值,將彈出的元素插入到另外一個列表中並返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
lindex key index通過索引獲取列表中的元素
linsert key before|after pivot value在列表的元素前或者後插入元素
llen key獲取列表長度
lpop key移出並獲取列表的第一個元素
lpush key value1 [value2…]將一個或多個值插入到列表頭部
lpushx key value將一個值插入到已存在的列表頭部
lrange key start stop獲取列表指定範圍內的元素
lrem key count value移除列表元素
lset key index value通過索引設定列表元素的值
ltrim key start stop對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除
rpop key移除列表的最後一個元素,返回值為移除的元素
rpoplpush source destination移除列表的最後一個元素,並將該元素新增到另一個列表並返回
rpush key value1 [value2…]在列表中新增一個或多個值
rpushhx key value為已存在的列表新增值

set

Redis 的 Set 是 String 型別的無序集合。集合成員是唯一的,這就意味著集合中不能出現重複的資料。

Redis 中集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是 O(1)。

集合中最大的成員數為 232 - 1 (4294967295, 每個集合可儲存40多億個成員)。

新增查詢元素

127.0.0.1:6379> sadd myset 1 2 3
(integer) 3
127.0.0.1:6379> smembers myset
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> sismember myset 2
(integer) 1

常用命令

命令描述
sadd key member1 [member2…]向集合新增一個或多個成員
scard key獲取集合的成員數
sdiff key1 [key2…]返回第一個集合與其他集合之間的差異
sdiffstore destination key1 [key2…]返回給定所有集合的差集並存儲在 destination 中
sinter key1 [key2…]返回給定所有集合的交集
sinterstore destination key1 [key2…]返回給定所有集合的交集並存儲在 destination 中
sismember key member判斷 member 元素是否是集合 key 的成員
smember key返回集合中的所有成員
smove source destination member將 member 元素從 source 集合移動到 destination 集合
spop key移除並返回集合中的一個隨機元素
spandmember key [count]返回集合中一個或多個隨機數
srem key member1 [member2…]移除集合中一個或多個成員
sunion key1 [key2]返回所有給定集合的並集
sunionstore destination key1 [key2…]所有給定集合的並集儲存在 destination 集合中
sscan key cursor [match pattern] [count count]迭代集合中的元素

sorted set

Redis 有序集合和集合一樣也是 string 型別元素的集合,且不允許重複的成員。

不同的是每個元素都會關聯一個 double 型別的分數。redis 正是通過分數來為集合中的成員進行從小到大的排序。

有序集合的成員是唯一的,但分數(score)卻可以重複。

集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是 O(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可儲存40多億個成員)。

127.0.0.1:6379> zadd bo 1 one
(integer) 1
127.0.0.1:6379> zadd bo 3 two
(integer) 1
127.0.0.1:6379> zadd bo 6 three
(integer) 1
127.0.0.1:6379> zadd bo 2 four
(integer) 1
127.0.0.1:6379> zadd bo 5 five
(integer) 1
127.0.0.1:6379> zrange bo 0 -1
1) "one"
2) "four"
3) "two"
4) "five"
5) "three"

常用命令

命令描述
zadd key score1 member1 [score2 member2…]向有序集合新增一個或多個成員,或者更新已存在成員的分數
zcard key獲取有序集合的成員數
zcount key min max計算在有序集合中指定區間分數的成員數
zincrby key increment member有序集合中對指定成員的分數加上增量 increment
zinterstore destination numkeys key [key…]計算給定的一個或多個有序集的交集並將結果集儲存在新的有序集合 destination 中
zlexcount key min max在有序集合中計算指定字典區間內成員數量
zrange key start stop [withscores]通過索引區間返回有序集合指定區間內的成員
zrangebylex key min max [limit offset count]通過字典區間返回有序集合的成員
zrangebyscore key min max [withscores] [limit]通過分數返回有序集合指定區間內的成員
zrank key member返回有序集合中指定成員的索引
zren key member [member…]移除有序集合中的一個或多個成員
zremrangebylex key min max移除有序集合中給定的字典區間的所有成員
zremrangebyrank key start stop移除有序集合中給定的排名區間的所有成員
zremrangebyscore key min max移除有序集合中給定的分數區間的所有成員
zrevrange key start stop [withscores]返回有序集中指定區間內的成員,通過索引,分數從高到低
zrevrangebyscore key max min [withscores]返回有序集中指定分數區間內的成員,分數從高到低排序
zrevrank key member返回有序集合中指定成員的排名,有序整合員按分數值遞減(從大到小)排序
zscore key member返回有序集中,成員的分數值
zunionstore destination numbers key [key…]計算給定的一個或多個有序集的並集,並存儲在新的 key 中
zscan key cursor [match pattern] [count count]迭代有序集合中的元素(包括元素成員和元素分值)