redis的簡單介紹
redis支持的常用數據結構
- 字符串(String)
127.0.0.1:6379> SET name "toegg"
OK
127.0.0.1:6379> GET name
"toegg"
- 散列(Hash)
127.0.0.1:6379> HSET user name "toegg1"
(integer) 1
127.0.0.1:6379> HSET user age 18
(integer) 1
127.0.0.1:6379> HSET user sex 1
(integer) 1
127.0.0.1:6379> HKEYS user #獲取所有key
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> HVALS user #獲取所有val
1) "toegg1"
2) "18"
3) "1"
127.0.0.1:6379> HGETALL user #獲取所有 key=>val
1) "name"
2) "toegg1"
3) "age"
4) "18"
5) "sex"
6) "1"
127.0.0.1:6379> HGET user name
"toegg1"
- 列表(List)
127.0.0.1:6379> lpush list 1
(integer) 1
127.0.0.1:6379> lpush list 2
(integer) 2
127.0.0.1:6379> lpush list 3
(integer) 3
127.0.0.1:6379> lrange list 0 -1 #獲取列表所有元素
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> lpop list
"3"
127.0.0.1:6379> lrange list 0 -1
1) "2"
2) "1"
- 集合(Set)
127.0.0.1:6379> sadd set 1
(integer) 1
127.0.0.1:6379> sadd set 2
(integer) 1
127.0.0.1:6379> smembers set #獲取集合所有元素
1) "1"
2) "2"
127.0.0.1:6379> sadd set1 1
(integer) 1
127.0.0.1:6379> sadd set1 3
(integer) 1
127.0.0.1:6379> sadd set1 4
(integer) 1
127.0.0.1:6379> sinter set set1 #取兩個集合的交集
1) "1"
127.0.0.1:6379> sunion set set1 #取兩個集合的並集
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> sdiff set set1 #取兩個集合的差集
1) "2"
- 有序集合(Sorted Set | ZSet)
127.0.0.1:6379> zadd sets 1 key1
(integer) 1
127.0.0.1:6379> zadd sets 2 key2
(integer) 1
127.0.0.1:6379> zadd sets 3 key3
(integer) 1
127.0.0.1:6379> zrange sets 0 -1 #獲取所有元素
1) "key1"
2) "key2"
3) "key3"
127.0.0.1:6379> zrangebyscore sets 2 3 WITHSCORES #返回score爲2-3的元素,withscore保留score
1) "key2"
2) "2"
3) "key3"
4) "3"
127.0.0.1:6379> zrangebyscore sets 2 3 #返回score爲2-3的元素
1) "key2"
2) "key3"
redis爲什麼這麼快
- 完全基於內存,通過 key => val 鍵值對的形式來存儲數據的nosql數據庫,類似一個大hashMap,查找和操作複雜度爲O(1)
- 單線程,避免了上下文的切換,多進程或者多線程切換導致的cpu消耗,不用考慮各種鎖問題
- 使用IO多路複用epoll(採用事件驅動,讀,寫事件處理器)同時監聽多個socket上的事件,根據事件到對應處理器處理,複雜度O(1)。不是poll和select(採用無差別輪詢),複雜度 O(n)
redis和memcache的比較
- redis支持更復雜的數據結構,支持豐富的數據操作,需要緩存能夠支持更復雜的結構和操作,redis是不錯選擇
- redis3.0後支持cluster集羣模式,高可用,避免全盤奔潰,而memcache則不支持集羣模式
- 性能對比:由於 Redis 只使用單核,而 Memcached 可以使用多核,所以平均每一個核上 Redis 在存儲小數據時比 Memcached 性能更高。而在 100k 以上的數據中,Memcached 性能要高於 Redis
可使用Lazy懶加載redis**
緩存基於內存的操作雖然很快,但是也不是所有東西都丟到內存,畢竟內存大小也有限,成本也很高。再者可採用需要時才加載到內存,不用則不加載,則是懶加載方式
其中,讀和更新,大概如下流程。更新時候不是更新緩存,而是直接刪除緩存,就是爲了懶加載。有可能頻繁在更新,頻繁在改緩存,但是實際沒訪問打到該key,實際就浪費了,所以可用到才加載
Read: 讀緩存 -> 沒有就去讀db ->再寫緩存
Update: 更新數據 ->更新db -> 刪除緩存
當然,具體情況還得視項目和業務而定,比如一些商品定點搶購,有些設計是事先需要緩存商品存貨數量到內存,訪問打到的時候做相應的限流攔截。需要先把數據放到緩存。不是所有都採用Lazy方式。