redis 命令:html
常規操做命令 01 exits key //測試指定key是否存在,返回1表示存在,0不存在 02 del key1 key2 ....keyN //刪除給定key,返回刪除key的數目,0表示給定key都不存在 03 type key //返回給定key的value類型。返回 none 表示不存在key,string字符類型,list 鏈表類型 set 無序集合類型... 04 keys pattern //返回匹配指定模式的全部key,下面給個例子 05 randomkey //返回從當前數據庫中隨機選擇的一個key,若是當前數據庫是空的,返回空串 06 rename oldkey newkey //原子的重命名一個key,若是newkey存在,將會被覆蓋,返回1表示成功,0失敗。多是oldkey不存在或者和newkey相同 07 renamenx oldkey newkey //同上,可是若是newkey存在返回失敗 08 dbsize //返回當前數據庫的key數量 09 expire key seconds //爲key指定過時時間,單位是秒。返回1成功,0表示key已經設置過過時時間或者不存在 10 ttl key //返回設置過過時時間的key的剩餘過時秒數 -1表示key不存在或者沒有設置過過時時間 11 select db-index //經過索引選擇數據庫,默認鏈接的數據庫全部是0,默認數據庫數是16個。返回1表示成功,0失敗 12 move key db-index //將key從當前數據庫移動到指定數據庫。返回1成功。0 若是key不存在,或者已經在指定數據庫中 13 flushdb //刪除當前數據庫中全部key,此方法不會失敗。慎用 14 flushall //刪除全部數據庫中的全部key,此方法不會失敗。更加慎用 string 類型數據操做命令 01 set key value //設置key對應的值爲string類型的value,返回1表示成功,0失敗 02 setnx key value //同上,若是key已經存在,返回0 。nx 是not exist的意思 03 get key //獲取key對應的string值,若是key不存在返回nil 04 getset key value //原子的設置key的值,並返回key的舊值。若是key不存在返回nil 05 mget key1 key2 ... keyN //一次獲取多個key的值,若是對應key不存在,則對應返回nil。下面是個實驗,首先清空當前數據庫,而後設置k1,k2.獲取時k3對應返回nil 06 mset key1 value1 ... keyN valueN //一次設置多個key的值,成功返回1表示全部的值都設置了,失敗返回0表示沒有任何值被設置 07 msetnx key1 value1 ... keyN valueN //同上,可是不會覆蓋已經存在的key 08 incr key //對key的值作加加操做,並返回新的值。注意incr一個不是int的value會返回錯誤,incr一個不存在的key,則設置key爲1 09 decr key //同上,可是作的是減減操做,decr一個不存在key,則設置key爲-1 10 incrby key integer //同incr,加指定值 ,key不存在時候會設置key,並認爲原來的value是 0 11 decrby key integer //同decr,減指定值。decrby徹底是爲了可讀性,咱們徹底能夠經過incrby一個負值來實現一樣效果,反之同樣。 12 append key value //給指定key的字符串值追加value,返回新字符串值的長度。下面給個例子 13 substr key start end //返回截取過的key的字符串值,注意並不修改key的值。下標是從0開始的,接着上面例子 list 類型數據操做命令 01 lpush key string //在key對應list的頭部添加字符串元素,返回1表示成功,0表示key存在且不是list類型 02 rpush key string //同上,在尾部添加 03 llen key //返回key對應list的長度,key不存在返回0,若是key對應類型不是list返回錯誤 04 lrange key start end //返回指定區間內的元素,下標從0開始,負值表示從後面計算,-1表示倒數第一個元素 ,key不存在返回空列表 05 ltrim key start end //截取list,保留指定區間內元素,成功返回1,key不存在返回錯誤 06 lset key index value //設置list中指定下標的元素值,成功返回1,key或者下標不存在返回錯誤 07 lrem key count value //從key對應list中刪除count個和value相同的元素。count爲0時候刪除所有 08 lpop key //從list的頭部刪除元素,並返回刪除元素。若是key對應list不存在或者是空返回nil,若是key對應值不是list返回錯誤 09 rpop //同上,可是從尾部刪除 10 blpop key1...keyN timeout //從左到右掃描返回對第一個非空list進行lpop操做並返回,好比blpop list1 list2 list3 0 ,若是list不存在list2,list3都是非空則對list2作lpop並返回從list2中刪除的元素。若是全部的list都是空或不存在,則會阻塞timeout秒,timeout爲0表示一直阻塞。當阻塞時,若是有client對key1...keyN中的任意key進行push操做,則第一在這個key上被阻塞的client會當即返回。若是超時發生,則返回nil。有點像unix的select或者poll 11 brpop //同blpop,一個是從頭部刪除一個是從尾部刪除 12 rpoplpush srckey destkey //從srckey對應list的尾部移除元素並添加到destkey對應list的頭部,最後返回被移除的元素值,整個操做是原子的.若是srckey是空或者不存在返回nil set 類型數據操做命令 01 sadd key member //添加一個string元素到,key對應的set集合中,成功返回1,若是元素以及在集合中返回0,key對應的set不存在返回錯誤 02 srem key member //從key對應set中移除給定元素,成功返回1,若是member在集合中不存在或者key不存在返回0,若是key對應的不是set類型的值返回錯誤 03 spop key //刪除並返回key對應set中隨機的一個元素,若是set是空或者key不存在返回nil 04 srandmember key //同spop,隨機取set中的一個元素,可是不刪除元素 05 smove srckey dstkey member //從srckey對應set中移除member並添加到dstkey對應set中,整個操做是原子的。成功返回1,若是member在srckey中不存在返回0,若是key不是set類型返回錯誤 06 scard key //返回set的元素個數,若是set是空或者key不存在返回0 07 sismember key member //判斷member是否在set中,存在返回1,0表示不存在或者key不存在 08 sinter key1 key2...keyN //返回全部給定key的交集 09 sinterstore dstkey key1...keyN //同sinter,可是會同時將交集存到dstkey下 10 sunion key1 key2...keyN //返回全部給定key的並集 11 sunionstore dstkey key1...keyN //同sunion,並同時保存並集到dstkey下 12 sdiff key1 key2...keyN //返回全部給定key的差集 13 sdiffstore dstkey key1...keyN //同sdiff,並同時保存差集到dstkey下 14 smembers key //返回key對應set的全部元素,結果是無序的 sorted set 類型數據操做命令 01 zadd key score member //添加元素到集合,元素在集合中存在則更新對應score 02 zrem key member //刪除指定元素,1表示成功,若是元素不存在返回0 03 zincrby key incr member //增長對應member的score值,而後移動元素並保持skip list保持有序。返回更新後的score值 04 zrank key member //返回指定元素在集合中的排名(下標),集合中元素是按score從小到大排序的 05 zrevrank key member //同上,可是集合中元素是按score從大到小排序 06 zrange key start end //相似lrange操做從集合中去指定區間的元素。返回的是有序結果 07 zrevrange key start end //同上,返回結果是按score逆序的 08 zrangebyscore key min max //返回集合中score在給定區間的元素 09 zcount key min max //返回集合中score在給定區間的數量 10 zcard key //返回集合中元素個數 11 zscore key element //返回給定元素對應的score 12 zremrangebyrank key min max //刪除集合中排名在給定區間的元素 13 zremrangebyscore key min max //刪除集合中score在給定區間的元素 hash 類型數據操做命令 01 hset key field value //設置hash field爲指定值,若是key不存在,則先建立 02 hget key field //獲取指定的hash field 03 hmget key filed1....fieldN //獲取所有指定的hash filed 04 hmset key filed1 value1 ... filedN valueN //同時設置hash的多個field 05 hincrby key field integer //將指定的hash filed 加上給定值 06 hexists key field //測試指定field是否存在 07 hdel key field //刪除指定的hash field 08 hlen key //返回指定hash的field數量 09 hkeys key //返回hash的全部field 10 hvals key //返回hash的全部value 11 hgetall //返回hash的全部filed和value
redis 中存數據時,到底何時用 hset 相比於 set 存數據時又有什麼不同?redis
set 就是普通的已key-value 方式存儲數據,能夠設置過時時間。時間複雜度爲 O(1),沒多執行一個 set 在redis 中就會多一個 key ,數據庫
hset 則是以hash 散列表的形式存儲。超時時間只能設置在 大 key 上,單個 filed 則不能夠設置超時 時間複雜度我百度了不少文章都說是 O(1) 可是我下面給出的參考文章說時間上的時間複雜度實際上是 O(N) N 值是單個hash 上的 filed 個數,因此 hash 上單個不適合存儲大量的 filed 而且若是 filed 多了比較消耗cpu,但同時以 散列表存儲則比較節省內存。緩存
因此在實際的使用過程當中應該使用 set 存儲單個大文本非結構化數據 hset 則存儲結構化數據,一個 hash 存儲一條數據,一個 filed 則存儲 一條數據中的一個屬性,value 則是屬性對應的值。app
例如 數據庫中有一張表 user 包含 id,name,age,sex 4個屬性,而且有400w條數據,dom
id,name,age,sex測試
一、1,張三,16,1spa
二、2,李四,22,1unix
三、3,王五,28,0code
四、4,趙六,32,1
...
若是要整表緩存到 redis 中則使用 hash ,一條數據一個hash 一個hash 裏則包含4個filed。
hset user_1 id 1 name 張三 age 16 sex 1
hset user_2 id 2 name 李四 age 16 sex 1
...
這樣存儲,若是用戶的某個屬性值改變,還能夠單個修改。
例如 吧張三的年齡改成30 則可使用命令: hset user_1 age 30
在好比若是要緩存應用整個首頁 html ,或則某個商品的詳情介紹(通常來講商品的詳情介紹是makdown語法的富文本信息,或 html 格式的富文本信息) 則使用 則可使用 set
又或則 應用中的 某個熱點數據,均可以使用 set 存儲一大段數據。
最後但願又大神可以具體講講 爲啥 hset 比較節省內存,和比較消耗cpu,set 爲啥又比較佔用內存。
參考文章:https://stackoverflow.com/questions/12779372/hset-vs-set-memory-usage