一 . Linux下安裝Redis
二 . Redis基礎知識
redis有16個資料庫,預設為第0個資料庫
切換資料庫 select 序號
檢視所有的key
127.0.0.1:6379[3]> keys *
1) "age"
127.0.0.1:6379[3]>
清除當前資料庫 FLUSHDB
清除所有資料庫 FLUSHALL
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379>
Redis是單執行緒的!!
官方表示Redis是基於記憶體操作的,CPU不是Redis的效能瓶頸,Redis的效能瓶頸是根據計算機的記憶體和網路頻寬,既然可以使用單執行緒來實現就使用單執行緒實現了!
Redis是C語言寫的,官方提供的資料為100000+QPS,效能非常之高!
Redis為什麼單執行緒還這麼快?
1. 誤區1:高效能的伺服器一定是多執行緒的?
2. 誤區2:多執行緒(CPU上下文切換!)一定比單執行緒高!
核心:Redis是將所有的資料放在記憶體中,所以說Redis使用單執行緒去操作效率就是最高的,(多執行緒CPU上下文切換耗時間!!),對於記憶體系統來說,沒有上下文切換效率就是最高的!多次讀寫都是在一個CPU 上,在記憶體情況下這個就是最佳方案!
三 . Redis五巨量資料型別
查詢未知命令----Redis中文網站 http://www.redis.cn/commands.html# Redis-key
127.0.0.1:6379> keys * //檢視當前庫所有的key
(empty list or set)
127.0.0.1:6379> flushall //清除所有的庫
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set name wenjin
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> set age 22
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> exists name //檢視key是否存在
(integer) 1
127.0.0.1:6379> exists name1
(integer) 0
127.0.0.1:6379> move name 1 //一出key到目標庫
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> select 1 //切換庫
OK
127.0.0.1:6379[1]> keys *
1) "name"
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> set name wenwen
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> expire name 10 //設定key過期時間,單位是秒
(integer) 1
127.0.0.1:6379> ttl name //檢視當前key的剩餘時間
(integer) 6
127.0.0.1:6379> ttl name
(integer) 3
127.0.0.1:6379> ttl name
(integer) 0
127.0.0.1:6379> type age //檢視key的型別
string
127.0.0.1:6379>
String型別
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set name1 wenjin
OK
127.0.0.1:6379> get name1
"wenjin"
127.0.0.1:6379> append name1 ",qianyu" //追加字串
(integer) 17
127.0.0.1:6379> get name1
"wenjin,qianyu"
127.0.0.1:6379> append name2 "hello" //追加字串,如果當前字串不存在,則為set
(integer) 5
127.0.0.1:6379> strlen name2 //檢視字串長度!
(integer) 5
127.0.0.1:6379>
做自增i++,例如瀏覽量
127.0.0.1:6379> set view 0
OK
127.0.0.1:6379> get view
"0"
127.0.0.1:6379> incr view //自加
(integer) 1
127.0.0.1:6379> incr view
(integer) 2
127.0.0.1:6379>
127.0.0.1:6379> incr view
(integer) 3
127.0.0.1:6379> decr view //自減
(integer) 2
127.0.0.1:6379> decr view
(integer) 1
127.0.0.1:6379> decr view
(integer) 0
127.0.0.1:6379> decr view
(integer) -1
127.0.0.1:6379> incrby view 30 //自加多
(integer) 29
127.0.0.1:6379> decrby view 20 //自減多
(integer) 9
127.0.0.1:6379>
字串替換和擷取
//字串範圍 range
127.0.0.1:6379> set key1 "hello,wenjin"
OK
127.0.0.1:6379> get key1
"hello,wenjin"
127.0.0.1:6379> getrange key1 0 4 //擷取字串【0,3】
"hello"
127.0.0.1:6379> get key1
"hello,wenjin"
127.0.0.1:6379> getrange key1 0 -1 //獲取全部字串
"hello,wenjin"
127.0.0.1:6379> set key2 abdfdgdjkj
OK
127.0.0.1:6379> get key2
"abdfdgdjkj"
127.0.0.1:6379> setrange key2 2 xxx //字串替換
(integer) 10
127.0.0.1:6379> get key2
"abxxxgdjkj"
重點:setex和setnx基礎用法及分散式鎖使用場景
#setex (set with expire) //設定過期時間
#setnx (set if not existr) //設定不存在的key-value (在分散式鎖中常用)
127.0.0.1:6379> setex key3 40 danaomeng //設定key3的值在40秒後過期
OK
127.0.0.1:6379> ttl key3 //檢視key3的過期時間
(integer) 35
127.0.0.1:6379> ttl key3
(integer) 32
127.0.0.1:6379> setnx mykey hahhahaha //如果meykey不存在,則設定mykey
(integer) 1
127.0.0.1:6379> keys *
1) "mykey"
2) "key1"
3) "key2"
4) "i"
5) "name"
127.0.0.1:6379> setnx mykey wewewewe //如果mykey存在,則設定失敗
(integer) 0
127.0.0.1:6379> keys *
1) "mykey"
2) "key1"
3) "key2"
4) "i"
5) "name"
127.0.0.1:6379> get mykey
"hahhahaha"
批次設定字串
#mset #mget
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 //同時設定多個值
OK
127.0.0.1:6379> mget k1 k2 k3 //同時獲取多個值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379> msetnx k1 v1 k4 v4 //msetnx是一個原子性操作,要麼一起成功!要麼一起失敗!
(integer) 0
127.0.0.1:6379>
設定物件
#物件
set user:1 {name:wenjin,age:22} #這隻一個user:1物件,值用一個json字串來儲存一個物件!
#這裡key是一個巧妙的設計: user:{id}:{filed}
127.0.0.1:6379> mset user:1:name liusan user:1:age 33
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "liusan"
2) "33"
127.0.0.1:6379>
getset用法
#getset //先get後set
127.0.0.1:6379> getset desc redis //如果不存在值則,則返回nil
(nil)
127.0.0.1:6379> get desc
"redis"
127.0.0.1:6379> getset desc mongodb //如果存在值,則返回原來的值,設定新的值!
"redis"
127.0.0.1:6379> get desc
"mongodb"
127.0.0.1:6379>
String型別使用場景:value除了我們的字串還可以是數位
* 計數器
* 統計多單位數量
* 粉絲數
* 物件快取儲存
* 等等等等
**
**