網(wǎng)上有很多的教程,但是大多數(shù)都零零散散。入門redis的同學(xué)看起來很困難,所以這里總結(jié)了一些基礎(chǔ)知識。
1.redis是什么?
Redis 是完全開源免費的,遵守BSD協(xié)議,是一個高性能的key-value數(shù)據(jù)庫。
對的redis就是一個存鍵值對的數(shù)據(jù)庫,它不僅支持簡單的key-value類型的數(shù)據(jù),同時還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲?!疚伊?xí)慣于存簡單的key-value(value都是寫成需要數(shù)據(jù)結(jié)構(gòu)的對象)】。
2.redis使用場景
1.取最新N個數(shù)據(jù)的操作
2.排行榜應(yīng)用,取TOP N 操作
3.需要精確設(shè)定過期時間的應(yīng)用
4.計數(shù)器應(yīng)用
由于INCR等指令本身就具有原子操作的特性,所以我們完全可以利用redis的INCR、INCRBY、DECR、DECRBY等指令來實現(xiàn)原子計數(shù)的 效果,假如,在某種場景下有3個
客戶端同時讀取了mynum的值(值為2),然后對其同時進(jìn)行了加1的操作,那么,最后mynum的值一定是5。不少網(wǎng)站 都利用redis的這個特性來實現(xiàn)業(yè)務(wù)上的統(tǒng)計計數(shù)需求。
5.Uniq操作,獲取某段時間所有數(shù)據(jù)排重值
6.實時系統(tǒng),反垃圾系統(tǒng)
7.Pub/Sub構(gòu)建實時消息系統(tǒng)
8.構(gòu)建隊列系統(tǒng)
9.緩存
最多的是用做緩存。他的操作所讀是mysql的10倍不止。SET操作每秒鐘 110000 次,GET操作每秒鐘 81000 次。
3.redis數(shù)據(jù)結(jié)構(gòu)
上邊已經(jīng)說了redis是一種高級的key:value存儲系統(tǒng),其中value支持五種數(shù)據(jù)類型:
1.字符串(strings)
2.字符串列表(lists)
3.字符串集合(sets)
4.有序字符串集合(sorted sets)
5.哈希(hashes)
3.1.key
1.key不要太長,盡量不要超過1024字節(jié),這不僅消耗內(nèi)存,而且會降低查找的效率;
2.key也不要太短,太短的話,key的可讀性會降低;
3.在一個項目中,key最好使用統(tǒng)一的命名模式,例如power_loginname
3.2.字符串(strings)
strings類型是一個很基礎(chǔ)的數(shù)據(jù)類型,也是任何存儲系統(tǒng)都必備的數(shù)據(jù)類型.
操作如下:
set myredis 'kmonkeywyl'get myredis
注:在遇到非字符串類型比如int,redis會默認(rèn)轉(zhuǎn)為string.
3.3.字符串列表(lists)
redis中的lists在底層實現(xiàn)上并不是數(shù)組,而是鏈表.所以插入數(shù)據(jù)快,但定位性能操作較差。
lists的常用操作包括lpush、rpush、lpush,lrange等
操作如下:
//新建一個list叫做mylist,并在列表頭部插入元素"1"
lpush mylist "1"
//在mylist右側(cè)插入元素"2"
rpush mylist "2"
//在mylist左側(cè)插入元素"0"
lpush mylist "0"
//列出mylist中從編號0到編號1的元素
lrange mylist 0 1
//列出mylist中從編號0到倒數(shù)第一個元素
lrange mylist 0 -1
注:上邊應(yīng)用場景1,2,8都用到lists就會很方便,具體應(yīng)用場景(消息隊列,分頁,博客評論)
3.3.字符串集合(sets)
集合對于我們來說應(yīng)該不陌生,就是我們初中學(xué)的那個集合,針對于集合有幾個概念不知道你還熟悉不?取交集、取并集、取差,不熟悉的自己去熟悉去吧。
操作如下:
//向集合myset中加入新元素"wyl"
sadd myset "wyl"
(integer) 1
sadd myset "kmonkey"
(integer) 1
//列出集合myset中的所有元素
smembers myset
1) "wyl"
2) "kmonkey"
//判斷元素1是否在集合myset中,返回1表示存在
sismember myset "wyl"
(integer) 1
//判斷元素是否在集合myset中,返回0表示不存在
sismember myset "wangyanling"
(integer) 0
//新建一個新的集合yourset
sadd yourset "1"
(integer) 1
sadd yourset "2"
(integer) 1
smembers yourset
1) "1"
2) "2"
//對兩個集合求并集
sunion myset yourset
1) "1"
2) "wyl"
3) "2"
4) "kmonkey"
3.4.有序字符串集合(sorted sets)
和上邊的無須集合唯一的差別是有序的每個元素都有一個序號score,主要是便于排序
操作如下:
zadd myzset 1 baidu.com
(integer) 1
//向myzset中新增一個元素360.com,賦予它的序號是3
zadd myzset 3 360.com
(integer) 1
//向myzset中新增一個元素google.com,賦予它的序號是2
zadd myzset 2 google.com
(integer) 1
//列出myzset的所有元素,同時列出其序號,可以看出myzset已經(jīng)是有序的了。
zrange myzset 0 -1 with scores
1) "baidu.com"
2) "1"
3) "google.com"
4) "2"
5) "360.com"
6) "3"
//只列出myzset的元素
zrange myzset 0 -1
1) "baidu.com"
2) "google.com"
3) "360.com"
3.5.哈希(hashes)
這就和結(jié)構(gòu)數(shù)據(jù)庫類似了。我是不喜歡在redis中使用hashes的。
操作如下
//建立哈希,并賦值
HMSET user:001 username wylpassword 111 age 34
OK
//列出哈希的內(nèi)容
127.0.0.1:6379> HGETALL user:001
1) "username"
2) "wyl"
3) "password"
4) "111"
5) "age"
6) "34"
//更改哈希中的某一個值
HSET user:001 password 12345
(integer) 0
//再次列出哈希的內(nèi)容
127.0.0.1:6379> HGETALL user:001
1) "username"
2) "wyl"
3) "password"
4) "12345"
5) "age"
6) "34"
原文來自:博客園/kmonkey