1. 程式人生 > >redis重要知識點

redis重要知識點

博客 ali sets 數據類型 score key 所有 nio offset

redis是一種高級的key:value存儲系統,其中value支持五種數據類型:

1.字符串(strings)
2.字符串列表(lists)
3.字符串集合(sets)
4.有序字符串集合(sorted sets)
5.哈希(hashes)

而關於key,有幾個點要提醒大家:

1.key不要太長,盡量不要超過1024字節,這不僅消耗內存,而且會降低查找的效率;
2.key也不要太短,太短的話,key的可讀性會降低;

另外,我們還可以通過字符串類型進行數值操作:

復制代碼代碼如下:

127.0.0.1:6379> set mynum "2"
OK
127.0.0.1:6379> get mynum "2" 127.0.0.1:6379> incr mynum (integer) 3 127.0.0.1:6379> get mynum "3" 看,在遇到數值操作時,redis會將字符串類型轉換成數值。 由於INCR等指令本身就具有原子操作的特性,所以我們完全可以利用redis的INCR、INCRBY、DECR、DECRBY等指令來實現原子計數的效果,假如, 在某種場景下有3個客戶端同時讀取了mynum的值(值為2),然後對其同時進行了加1的操作,那麽 ,最後mynum的值一定是5。不少網站都利用redis的這個特性來實現業務上的統計計數需求。 redis的另一個重要的數據結構叫做lists,翻譯成中文叫做“列表”。 首先要明確一點,redis中的lists在底層實現上並不是數組,而是鏈表,也就是說對於一個具有上百萬個元素的lists來說,在頭部和尾部插入一個新元素,其時間復雜度是常數級別的,比如用LPUSH在10個元素的lists頭部插入新元素,和在上千萬元素的lists頭部插入新元素的速度應該是相同的。 雖然lists有這樣的優勢,但同樣有其弊端,那就是,鏈表型lists的元素定位會比較慢,而數組型lists的元素定位就會快得多。 lists的常用操作包括LPUSH、RPUSH、LRANGE等。我們可以用LPUSH在lists的左側插入一個新元素,用RPUSH在lists的右側插入一個新元素,用LRANGE命令從lists中指定一個範圍來提取元素。我們來看幾個例子: 復制代碼代碼如下
: //新建一個list叫做mylist,並在列表頭部插入元素"1" 127.0.0.1:6379> lpush mylist "1" //返回當前mylist中的元素個數 (integer) 1 //在mylist右側插入元素"2" 127.0.0.1:6379> rpush mylist "2" (integer) 2 //在mylist左側插入元素"0" 127.0.0.1:6379> lpush mylist "0" (integer) 3 //列出mylist中從編號0到編號1的元素 127.0.0.1:6379> lrange mylist 0 1 1) "0" 2) "1" //
列出mylist中從編號0到倒數第一個元素 127.0.0.1:6379> lrange mylist 0 -1 1) "0" 2) "1" 3) "2" lists的應用相當廣泛,隨便舉幾個例子: 1.我們可以利用lists來實現一個消息隊列,而且可以確保先後順序,不必像MySQL那樣還需要通過ORDER BY來進行排序。 2.利用LRANGE還可以很方便的實現分頁的功能。 3.在博客系統中,每片博文的評論也可以存入一個單獨的list中。 【redis數據結構 – 集合】 redis的集合,是一種無序的集合,集合中的元素沒有先後順序。 集合相關的操作也很豐富,如添加新元素、刪除已有元素、取交集、取並集、取差集等。我們來看例子: 復制代碼代碼如下: //向集合myset中加入一個新元素"one" 127.0.0.1:6379> sadd myset "one" (integer) 1 127.0.0.1:6379> sadd myset "two" (integer) 1 //列出集合myset中的所有元素 127.0.0.1:6379> smembers myset 1) "one" 2) "two" //判斷元素1是否在集合myset中,返回1表示存在 127.0.0.1:6379> sismember myset "one" (integer) 1 //判斷元素3是否在集合myset中,返回0表示不存在 127.0.0.1:6379> sismember myset "three" (integer) 0 //新建一個新的集合yourset 127.0.0.1:6379> sadd yourset "1" (integer) 1 127.0.0.1:6379> sadd yourset "2" (integer) 1 127.0.0.1:6379> smembers yourset 1) "1" 2) "2" //對兩個集合求並集 127.0.0.1:6379> sunion myset yourset 1) "1" 2) "one" 3) "2" 4) "two" 對於集合的使用,也有一些常見的方式,比如,QQ有一個社交功能叫做“好友標簽”,大家可以給你的好友貼標簽,比如“大美女”、“土豪”、“歐巴”等等,這時就可以使用redis的集合來實現,把每一個用戶的標簽都存儲在一個集合之中。 【redis數據結構 – 有序集合】 redis不但提供了無需集合(sets),還很體貼的提供了有序集合(sorted sets)。有序集合中的每個元素都關聯一個序號(score),這便是排序的依據。 很多時候,我們都將redis中的有序集合叫做zsets,這是因為在redis中,有序集合相關的操作指令都是以z開頭的,比如zrange、zadd、zrevrange、zrangebyscore等等 老規矩,我們來看幾個生動的例子: //新增一個有序集合myzset,並加入一個元素baidu.com,給它賦予的序號是1: 復制代碼代碼如下: 127.0.0.1:6379> zadd myzset 1 baidu.com (integer) 1 //向myzset中新增一個元素360.com,賦予它的序號是3 127.0.0.1:6379> zadd myzset 3 360.com (integer) 1 //向myzset中新增一個元素google.com,賦予它的序號是2 127.0.0.1:6379> zadd myzset 2 google.com (integer) 1 //列出myzset的所有元素,同時列出其序號,可以看出myzset已經是有序的了。 127.0.0.1:6379> zrange myzset 0 -1 with scores 1) "baidu.com" 2) "1" 3) "google.com" 4) "2" 5) "360.com" 6) "3" //只列出myzset的元素 127.0.0.1:6379> zrange myzset 0 -1 1) "baidu.com" 2) "google.com" 3) "360.com" 127.0.0.1:6379> zrange myzset 0 -1 withscores 1) "souhu" 2) "2" 3) "alili" 4) "3" 5) "baidu" 6) "10" 127.0.0.1:6379> zrange myzset 0 -1 with scores (error) ERR syntax error 127.0.0.1:6379> zrange myzset 0 -1 withscores 1) "souhu" 2) "2" 3) "alili" 4) "3" 5) "baidu" 6) "10" 【redis數據結構 – 哈希】 最後要給大家介紹的是hashes,即哈希。哈希是從redis-2.0.0版本之後才有的數據結構。 hashes存的是字符串和字符串值之間的映射,比如一個用戶要存儲其全名、姓氏、年齡等等,就很適合使用哈希。 我們來看一個例子: 復制代碼代碼如下: //建立哈希,並賦值 127.0.0.1:6379> HMSET user:001 username antirez password P1pp0 age 34 OK //列出哈希的內容 127.0.0.1:6379> HGETALL user:001 1) "username" 2) "antirez" 3) "password" 4) "P1pp0" 5) "age" 6) "34" //更改哈希中的某一個值 127.0.0.1:6379> HSET user:001 password 12345 (integer) 0 //再次列出哈希的內容 127.0.0.1:6379> HGETALL user:001 1) "username" 2) "antirez" 3) "password" 4) "12345" 5) "age" 6) "34" 127.0.0.1:6379> hmset user username imp pwd 1234 age 15 OK 127.0.0.1:6379> hgetall user 1) "username" 2) "imp" 3) "pwd" 4) "1234" 5) "age" 6) "15" 127.0.0.1:6379> 創建分支 git brach -b imp 切換分支 git checkout master 切換到master分支 合並dev git merge dev 刪除分支 git brach -d imp //由於Direct方式的kafka和Spark Streaming的集成方式中采用的api是低級封裝的api(low lever api),此時消費者的offet,由自己保管,不再是zookeeper, // 同時還可以自己指定從哪個offet開始消費 ,指定消費的topic以及對應每個分區,開始消費的offset val fromOffsets:Map[TopicAndPartition, Long] = Map( TopicAndPartition("test1",0) -> 0, TopicAndPartition("test1",1) -> 100, TopicAndPartition("test1",2) -> 200, TopicAndPartition("test1",3) -> 300 )

redis重要知識點