redis 一 、安裝以及基本數據類型操作

redis安裝和使用

redis安裝

wget http://download.redis.io/redis-stable.tar.gz
tar zxvf redis-stable.tar.gz
cd redis-stable.tar.gz
make
make install

redis啓動

redis-server
redis關閉
redis-cli shutdown

 配置

方法一

redis-server /path/to/redis.conf
redis-server /path/to/redis.conf --loglevel warning //設置日誌級別

方法二

redis-cli
redis > CONFIG SET loglevel warning

多數據庫的選擇

默認情況下,客戶端自動選擇0號數據庫。
可以使用select命令來選擇其他數據庫。
> select 1
redis不可以設置數據庫的名稱,數據庫是通過編號來使用的。
redis只有一個全局的密碼,不存在訪問某個數據庫的密碼。

數據庫基本操作

(1)添加數據和查找數據,通過set/get命令添加和獲取數據

複製代碼
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> set bar 1
OK
127.0.0.1:6379[1]> get bar
"1"
127.0.0.1:6379[1]> get aaa
(nil)
複製代碼

(2)判斷一個鍵是否存在,exists命令可以判斷key是否存在,存在返回1,不存在返回0

127.0.0.1:6379[1]> exists bar
(integer) 1
127.0.0.1:6379[1]> exists aaa
(integer) 0

(3)刪除數據,del命令刪除key,返回值爲成功刪除key的個數

127.0.0.1:6379[1]> del aaa
(integer) 0
127.0.0.1:6379[1]> del bar
(integer) 1

(4)獲取value的類型

127.0.0.1:6379[1]> set bar 1
OK
127.0.0.1:6379[1]> type bar
string

(5)自增和自減,incr 、decr以及incrby和decrby實現整數的加減

複製代碼
127.0.0.1:6379[1]> INCR ab
(integer) 1
127.0.0.1:6379[1]> INCR ab
(integer) 2
127.0.0.1:6379[1]> INCRBY ab 2
(integer) 4
127.0.0.1:6379[1]> DECR ab
(integer) 3
127.0.0.1:6379[1]> DECRBY ab 2
(integer) 1
複製代碼

(6)增加指定浮點數,incrbyfloat可以指定自增的浮點數

127.0.0.1:6379[1]> INCRBYFLOAT ab 1.1
"2.1"

(7)向尾部追加,append命令可以向字符尾部追加內容

127.0.0.1:6379[1]> set key hello
OK
127.0.0.1:6379[1]> append key world
(integer) 10
127.0.0.1:6379[1]> get key
"helloworld"

(8)獲取字符串長度,strlen獲取value的長度

127.0.0.1:6379[1]> STRLEN key
(integer) 10

(9)批量設置和獲取,通過mset和mget命令可以批量執行設置和獲取

127.0.0.1:6379[1]> mset key1 va1 key2 va2
OK
127.0.0.1:6379[1]> mget key1 key2
1) "va1"
2) "va2"

(10)位操作

getbit key offset
setbit key offset
bitcount key [start] [end]
bitop operation destkey key [key ...]

散列類型

其實這裏的散列類型就是類似於非結構化數據,json數據一樣。
{
    "id":1,
    "name":"test"
}

基本操作

(1)存儲方法,可以通過hset和hget來設置和獲取數據

複製代碼
127.0.0.1:6379[1]> hset user id 1
(integer) 1
127.0.0.1:6379[1]> hset user name test
(integer) 1
127.0.0.1:6379[1]> hget user id
"1"
127.0.0.1:6379[1]> hget user name
"test"
複製代碼

(2)判斷字段是否存在,hexists命令,返回1存在,返回0不存在

127.0.0.1:6379[1]> hexists user id
(integer) 1
127.0.0.1:6379[1]> hexists user age
(integer) 0

(3)使用hsetnx(hset if not exists)如果不存在賦值

127.0.0.1:6379[1]> hsetnx user age 111
(integer) 1
127.0.0.1:6379[1]> hget user age
"111"

(4)增加數字

127.0.0.1:6379[1]> hincrby user score 60
(integer) 60
127.0.0.1:6379[1]> hget user score
"60"

(5)刪除字段

127.0.0.1:6379[1]> hdel user score
(integer) 1
127.0.0.1:6379[1]> hget user score
(nil)

如何存儲數據?

(1)使用散列類型存儲數據,散列數據包括三部分(鍵、字段、字段值)
鍵           字段     字段值
post:id    field     value
複製代碼
127.0.0.1:6379[1]> incr userid
(integer) 1
127.0.0.1:6379[1]> hset user:1 name test
(integer) 1
127.0.0.1:6379[1]> hset user:1 score 90
(integer) 1
127.0.0.1:6379[1]> incr userid
(integer) 2
127.0.0.1:6379[1]> hset user:2 name test2
(integer) 1
127.0.0.1:6379[1]> hset user:2 score 99
(integer) 1
複製代碼

 添加了兩條數據,id爲1的名字爲test分數爲90,而id爲2的名字爲test2分數爲90.

(2)獲取多個字段的數據,需要使用hmget命令,並制定字段名稱
127.0.0.1:6379[1]> hmget user:1 name score
1) "test"
2) "90"
(3)獲取一行數據,不需要指定字段名稱,只需要指出鍵名
127.0.0.1:6379[1]> hgetall user:2
1) "name"
2) "test2"
3) "score"
4) "99"
(4)只獲取字段名或字段值
127.0.0.1:6379[1]> hkeys user:1
1) "name"
2) "score"
127.0.0.1:6379[1]> hvals user:1
1) "test"
2) "90"
(5)獲取字段數量
127.0.0.1:6379[1]> hlen user:1
(integer) 2
需要注意的是,散列類型無法獲取所有存在的鍵值,也就是id,如果刪除了中間某個id的話,只可以使用exist命令來判斷key是否存在。

列表類型

類表類型解決了上述的問題。
類表類型是有序的,值是可以重複的。
列表類型是通過雙向鏈表實現的,向列表兩端添加元素的時間複雜度爲O(1),獲取兩端元素的速度也是最快。

基本操作

列表的基本操作命令都是以l開頭的。

(1)添加和彈出元素使用lpush和rpush以及lpop和rpop分別從列表的左側和右側添加和刪除元素。
複製代碼
127.0.0.1:6379> lpush user test
(integer) 1
127.0.0.1:6379> rpush user test1
(integer) 2
127.0.0.1:6379> lpop user 
"test"
127.0.0.1:6379> rpop user
"test1"
127.0.0.1:6379>
複製代碼
(2)llen查看元素個數
127.0.0.1:6379> llen user
(integer) 0
127.0.0.1:6379> lpush user test
(integer) 1
127.0.0.1:6379> llen user
(integer) 1
(3)獲取列表片段
複製代碼
127.0.0.1:6379> lrange user 0 3
1) "test"
2) "test1"
3) "test2"
4) "test3"
127.0.0.1:6379> lrange user 0 2
1) "test"
2) "test1"
3) "test2"
複製代碼
(4)從列表中刪除元素
lrem     key     count     value
@count 爲刪除個數,大於0的話從左邊開始,小於0的話從右邊開始
@value 要刪除的值

我們可以把數據的id存儲在列表中,當某一行數據被刪除時候,只需要刪除爲該value爲key即可,而查詢數據的時候,需要先從列表中讀取所有的id,再從散列表中讀取數據。

 
(5)獲取和設置索引元素值
 
(6)向列表中插入元素
複製代碼
127.0.0.1:6379> lrange user 0 -1
1) "test"
2) "test1"
3) "test2"
4) "test3"
127.0.0.1:6379> linsert user before test1 test0
(integer) 5
127.0.0.1:6379> linsert user after test1 test1.5
(integer) 6
127.0.0.1:6379> lrange user 0 -1
1) "test"
2) "test0"
3) "test1"
4) "test1.5"
5) "test2"
6) "test3"
複製代碼
(7)將元素從一個列表轉移到另外一個列表
rdroplpush     source     destination
從source列表的右側彈出一個數據,添加到destination列表的左側

集合類型

集合中不允許重複數據的出現,數據是唯一的,無序的。
空的散列表的HASH TABLE實現,因此操作時間複雜度爲O(1)。
(1)增加sadd和刪除srem、獲取所有元素smembers,返回值標識成功添加元素的數量:
複製代碼
127.0.0.1:6379> sadd key 1
(integer) 1
127.0.0.1:6379> sadd key 2
(integer) 1
127.0.0.1:6379> sadd key 2
(integer) 0
127.0.0.1:6379> smembers key
1) "1"
2) "2"
127.0.0.1:6379> srem key 2
(integer) 1
127.0.0.1:6379> smembers key
1) "1"
複製代碼
(2)判斷元素是否在集合中可以使用sismember命令。
127.0.0.1:6379> sismember key 1
(integer) 1
127.0.0.1:6379> sismember key 3
(integer) 0
(3)集合運算
sdiff      key     [key...]
sinter     key     [key...]
sunion     key     [key...]
(4)獲取元素個數
127.0.0.1:6379> scard key
(integer) 1
(5)集合運算並保存結果
sdiffstore       destination     key [key...]
sinterstore      destination     key[key...]
sunionstore      destination     key[key...]
(6)隨機獲取集合的元素
srandmember key [count]
 127.0.0.1:6379> srandmember key 3
1) "4"
2) "2"
3) "3"
需要注意,srandmember取到的隨機元素在集合比較小的情況下並不是完全隨機的,由於redis的存儲方法是利用哈希桶+數據鏈的存儲方式,當桶和每個桶內元素的個數都非常小時就會造成取到相同數據的情況。

有序集合類型 sorted set

與普通的集合類型相比,有序集合爲集合中的每一個元素都關聯了一個分數,這使得我們不僅可以完成插入、刪除和判斷元素是否存在等集合的基本操作,還能夠得到分數最高(或最低)的前n個元素、獲得指定分數範圍內的元素等與分有關的操作,雖然集合中的元素必須是不同的,但是其分數是可以相同的。
 
有序結合和列表的使用區別:
(1)列表類型是通過鏈來實現的,獲取靠近兩端數據的速度極快,而當元素增多後,訪問中間元素的數據就會變慢,所以她更適合實現如“新鮮事”或“日誌”這樣少訪問中間元素的應用。
(2)有序集合類型是使用散列和跳躍表實現的,所以即使讀取位於中間部分數據的速度也很快(時間複雜度爲O(log(n)))。
(3)列表中不能簡單地調整某個元素的位置,但有序集合可以通過調整分數來實現位置的調整。
(4)有序集合更加消耗內存。

基本操作

(1)zadd添加元素,並設置分數score

127.0.0.1:6379> zadd students 60 xiaoming
(integer) 1
127.0.0.1:6379> zadd students 80 daxiong
(integer) 1
(2)zscore獲取元素分數
127.0.0.1:6379> zscore students xiaoming
"60"
(3)獲取排名在某個範圍的列表,元素是從0開始的
127.0.0.1:6379> zrange students 0 1
1) "xiaoming"
2) "daxiong"
(4)獲取指定分數範圍的元素,用於篩選數據
127.0.0.1:6379> zrangebyscore students 0 70
1) "xiaoming"
127.0.0.1:6379> zrangebyscore students 0 100
1) "xiaoming"
2) "daxiong"
limit命令可以實現sql語句中的Limit效果
複製代碼
獲取從0開始的前2個數據
127.0.0.1:6379> zrangebyscore students 0 100 limit 0 2
1) "xiaoming"
2) "daxiong"
獲取從1開始的前2個數據
127.0.0.1:6379> zrangebyscore students 0 100 limit 1 2
1) "daxiong"
複製代碼
(5)增加和減少某個元素的分數
127.0.0.1:6379> zincrby students 5 xiaoming
"65"
127.0.0.1:6379> zincrby students -5 xiaoming
"60"
(6)獲取集合中元素個數
127.0.0.1:6379> zcard students
(integer) 2
(7)獲取指定分數範圍內的元素個數
zcount     key     min     max

127.0.0.1:6379> zcount students 0 70
(integer) 1
127.0.0.1:6379> zcount students 0 90
(integer) 2
(8)刪除一個或多個元素
zrem     key     [key...]
(9)按照排名範圍來刪除元素
zremrangebyrank     key     start     stop
(10)按照分數範圍來刪除元素
zremrangebyscore     key     min     max
(11)獲取元素的排名,注意元素從0開始排序
127.0.0.1:6379> zrank students xiaoming
(integer) 0

 參考

redis入門指南

http://redis.readthedocs.org/en/latest/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章