-------------------Redis基本數據類型-------------------
1、String 字符串
1、概念
1、String 是redis最基本的類型,value 不僅可以是 String,也可以是數字;使用 Strings 類型,可以完全實現目前 Memcached 的功能,並且效率更高。還可以享受 Redis 的定時持久化(可以選擇 RDB 模式或者 AOF 模式);string類型是二進制安全的。意思是redis的string可以包含任何數據,比如jpg圖片或者序列化的對象;string類型是Redis最基本的數據類型,一個鍵最大能存儲512MB。
2、命令
1、set:設置key對應的值為string類型的value。
>set "name" "hello"
2、setnx(set if not exists):將key設置值為value,如果key不存在,這種情況下等同set命名;當key值存在,什么也不做。
>setnx "name" "hello"
3、setex:設置key對應字符串value,並且設置key在給定的seconds時間之后超時過期。
>setex "color" 10 "red"
>get "color" --- red
十秒過后
>get "color" --- (nil)
4、setrange:覆蓋key對應的string的一部分,從指定的offset處開始,覆蓋value的長度。
>set "email" "redis@126.com" --- "ok"
>setrange "email" 6 "gmail.com" --- (integer) 14
>get "email" --- redis@gmail.com
5、mset:一次設置多個值,成功返回ok表示所有的值都設置了,失敗返回0表示沒有任何值被設置。
>mset "key1" "python" "key2" "c++" --- "ok"
>get "key1" --- "hello"
>get "key2" --- "world"
6、mget:一次獲取多個key的值,如果對應key不存在,則對應返回nil。
>mget "key1" "key2" "key3"
7、msetnx:對應給定的keys到他們相應的values上。只要有一個key已經存在,msetnx一個操作也不會執行。
>msetnx "key1" "hello" "key2" "world" --- (integer) 0
8、getset:設置key的值,並返回key的舊值。
>get "name" --- "hello"
>getset "name" "newName" --- "hello"
>get "name" --- "newName"
9、getrange key start end:獲取指定key的value值的字符串。是由start和end的位移決定的。
>get "name" --- "newName"
>getrange "name" 1 3 --- "ewN"
10、incr 對key的值加1 操作
>set "age" 18 --- "ok"
>incr "age" --- (integer) 19
>get "age" ---"19"
11、incrby:用incr類似,加指定值,key不存在的時候會設置key,並認為原來的value值為0。
>incrby age 5 ---(integer) 24
>incrby age1111 5 --- (integer) 5
>get age1111 --- "5"
12、decr:對key的值做的事漸減操作,decr一個不存在key,則設置key為1.
>get age --- "24"
>decr age --- "23"
13、decrby:同decr,減指定值,key不存在的時候會設置key,並認為原來的value值為1.
>get age --- "23"
>decrby age 10 --- "13"
14、append:給指定key的字符串值追加value,返回新字符串值的長度。例如我們向name的值追加一個"redis"字符串:
>set "name" "value" --- OK
>append "name" "_newValue" --- (integer) 14
>get "name" ---"value_newValue"
2、Hash 哈希
1、概念:
Redis hash 是一個string類型的field和value的映射表,hash特別適合用於存儲對象;Redis中每個hash可以存儲2的32次方-1個鍵值對(40多億)
2、命令:
1、hset:設置指定的hash field1。
>hset "myhash" "field1" "hello" --- (integer) 1
2、hsetnx:只在key指定的哈希集中不存在的字段時,設置字段的值。如果key指定的哈希集不存在,會創建一個新的哈希集並與 key 關聯。如果字段已存在,該操作無效果。
>hsetnx "myhash" "field1" "hello"。 --- (integer) 1
3、hmset:同時設置hash多個field。
>hmset "myhash" "field1" "hello" "field2" "world" ---OK
4、hget:獲取指定的hash值的field。
>hget "myhash" "field1" --- "hello"
5、hgetall:獲取所有的hash值的數據。
>hgetall "myhash" ---
1) "field1"
2) "hello"
3) "field2"
4) "world"
6、hmget:獲取hash值的多個field值。
>hmget "myhash" "field1" "field2" "field3" ---
1) "hello"
2) "world"
3) (nil)
7、hincrby:指定的hash field值,加上給定的值。
>hset "myhash" "field3" "0" --- (integer) 1
>hincrby "myhash" "field3" 1 --- (integer) 1
>hincrby "myhash" "field3" -8 --- (integer) -7
8、hexists:測試指定field是否存在。
>hexists "myhash" "field1" --- (integer) 1
>hexists "myhash" "field9" --- (integer) 0
9、hkeys:查看指定哈希中所有的key值。
>hkeys "myhash" ---
1) "field1"
2) "field2"
3) "field3"
10、hdel:從key指定的哈希集中移除指定的域。
>hdel "myhash" "field1" --- (integer) 1
11、hlen:返回指定hash的field數量。
>hlen "myhash" --- (integer) 2
12、hvals:返回指定hash中所有的value值。
>hvals "myhash" ---
1) "world"
2) "-7"
3、List 列表
1、概念:
列表類型可以存儲一個有序的字符串列表,常用的操作時向列表兩端添加元素,或者獲得列表的某一個片段;列表類型內部是使用雙向鏈表(double linked list)實現的,所以向列表兩端添加元素的時間復雜度為O(I),獲取越接近兩端的元素,速度就越快。
2、命令:
1、lpush:從左邊向list列表中插入數據。
>lpush "mylist" "100001"
>lpush "mylist" "100002"
>lpush "mylist" "100003" "100004"
2、rpush:從右邊向list列表中插入數據。
>rpush "mylist" "100005"
>rpush "mylist" "100006"
3、lpop:從列表左側將數據彈出。
>lpop "mylist" --- "100004"
4、rpop:從列表右側將數據彈出。
>rpop "mylist" --- "100006"
5、llen:獲取列表中元素的個數。
>llen "mylist":--- (integer) 4
6、lrange key start stpo:返回索引從start到stop之間的所有元素(包含兩端元素)。
>lrange "mylist" 0 -1 ---
1) "100003"
2) "100002"
3) "100001"
4) "100005"
7、lrem key count value:刪除列表中前count個值為value的元素,返回刪除的個數
1、count>0時 lrem 命令從列表左邊開始刪除前count個值為value的元素。
2、count<0時 lrem命令從列表右邊開始刪除前count個值為value的元素。
3、count=0時 lrem命令會刪除所有值為value的元素。
>lpush "mylist" 2 2 2 --- (integer) 7
>rpush "mylist" 2 2 --- (integer) 10
>lrem "mylist" 1 2 --- (integer) 1
>lrem "mylist" -2 2 --- (integer) 2
>lrem "mylist" 0 2 --- (integer) 2
8、lindex key index:根據索引下標獲取指定的列表元素。
>lindex "mylist" 1 --- "100002"
9、ltrim key start end:可以刪除指定索引范圍之外的所有元素,其指定列表范圍的方法和lrange命令相同。
>ltrim "mylist" 0 -2 --- OK
10、linsert key before|after privot value:首先會在列表中從左到右查找值為pivot的元素,然后根據第二個參數是before還是after來決定將value插入到該元素的前面還是后面,返回插入后列表元素的個數
>lrange "mylist" 0 -1 ---
1) "100003"
2) "100002"
3) "100001"
4) "100005"
>linsert "mylist" before "100003" "3"
>linsert "mylist" after "100003" "4"
1) "3"
2) "100003"
3) "4"
4) "100002"
11、rpoplpush source destination:將元素從一個列表轉到另一個列表。
>rpoplpush "mylist" "mylistnew" --- "100002"
>lrange "mylistnew" 0 -1
1) "100002"
4、Set 集合
1、概念:
在集合中的每個元素都是不同的,且沒有順序。一個集合類型(set)鍵可以存儲至多2的32次-1個字符串。集合類型的常用操作時向集合中加入或刪除元素、判斷某個元素是否存在等,由於集合類型在Redis內部是使用值為空的散列表(hash table)實現,所以這些操作的時間復雜度都是O(I)。最方便的是多個集合類型鍵之間還可以進行並集、交集、差集運算。
2、集合與列表的區別:
列表具有有序性,集合具有唯一性。
2、命令:
1、sadd:用來向集合中添加一個或多個元素,如果鍵不存在則會自動創建。因為在一個集合中不能有相同的元素,所以如果要加入的元素已經存在於集合中聚會忽略這個元素。
>sadd letters a ---
>sadd letters a b c ---
2、smembers key:命令會返回集合中的所有元素
>smembers letters
3、sismember key member:判斷一個元素是否在集合中是一個時間復雜度為O(I)的操作,無論集合中有多少個元素,sismember命令始終可以極快的返回結果。當值存在是sismembers 命令返回1 ,當值不存在或鍵不存在是返回0
>sismember letters a
>sismember letters d
4、集合間運算
1、sdiff key:對多個集合執行差集運算。
>sadd setA 1 2 3
>sadd setB 2 3 4
>sdiff setA setB
>sdiff SetB setA
2、sinter key:對多個集合執行交集運算。
>sinter setA setB
3、sunion key:對多個集合執行並集運算。
>sunion setA setB
5、scard key:獲取集合中元素個數。
>smembers letters
>scard letters
6、spop letters:從集合中彈出一個元素。
>spop letters
>smembers letters
5、zset(Sorted set:有序集合)
1、概念:
在集合類型的基礎上有序集合類型為集合中的每個元素都關聯了一個分數,這使得我們不僅可以完成插入,刪除和判斷元素是否存在等集合類型支持的操作,還能夠獲得分數最高(或最低)的前N個元素,獲得指定分數范圍內的元素等與分數有關的操作。雖然集合中每個元素不同,但是他們的分數可以相同。
2、有序集合與列表比較:
1、相似處:
1、二者都是有序的。
2、二者都可以獲得某一范圍的元素。
2、區別:
1、列表類型是通過鏈表實現,獲取靠近兩端的數據速度快,當元素增加后,訪問中間數據的速度會變慢。
2、有序集合類型是使用散列和跳躍表實現的,所以即使讀取位於中間部分的數據速度也很快(時間復雜度O(log(N)))。
3、列表中不能簡單的調整某個元素的位置,但是有序集合可以
4、有序集合要比列表類型更消耗內存。
2、命令:
1、zadd:用來向有序集合中加入一個元素和該元素的分數,如果該元素已經存在則會用心的分數替換原來的分數。zadd命令的返回值是新加入到集合中的元素的個數。
>zadd scoreboard 89 Tom 67 Peter 100 David --- (integer) 3
注:分數不僅是整數,還支持雙精度浮點數.
2、zscore key member:獲取元素的分數
>zscore scoreboard Tom --- "89"
3、zrange key start top:按照元素分數從小到大的順序返回索引從start到stop之間的所有元素
>zrange scoreboard 0 -1
1) "Peter"
2) "Tom"
3) "David"
4、zrevrange key start top:按照元素分數從大到小的順序放回索引從start到stop之間的所有元素
>zrevrange scoreboard 0 -1
1) "David"
2) "Tom"
3) "Peter"
5、zrangebyscore key min max:按照元素分數從小到大的順序返回分數在min和max之間的元素。
>zrangebyscore scoreboard 85 100
1) "Tom"
2) "David"
6、zincrby key increment member:增加一個元素的分數,返回值是更改后的分數。
>zincrby scoreboard 4 Tom --- "93"