Redis複習
Redis
Redis基礎知識
redis預設有16個數據庫
預設使用的是第0個
基本方法
可以使用select進行切換資料庫
127.0.0.1:6379> select 3 #切換資料庫 OK 127.0.0.1:6379[3]> DBSIZE (integer) 0 127.0.0.1:6379[3]> set name hepeng OK 127.0.0.1:6379[3]> DBSIZE #檢視資料庫大小 (integer) 1 127.0.0.1:6379[3]> get name #檢視值 "hepeng" 127.0.0.1:6379[3]> keys * #檢視所有key 1) "name" 127.0.0.1:6379[3]> select 0 OK
DBSIZE #檢視資料庫大小
127.0.0.1:6379> dbsize
(integer) 8
keys * #檢視所有key
127.0.0.1:6379> keys *
1) "views"
2) "k13"
3) "v13"
4) "v11"
5) "name"
6) "list"
7) "key1"
8) "k11"
flushdb #清空當前庫
127.0.0.1:6379[3]> flushdb #清空當前庫
OK
127.0.0.1:6379[3]> keys *
(empty list or set)
flushall #清空全部資料庫
127.0.0.1:6379>flushall #清空全部資料庫
為什麼redis的埠是6379?
作者是痴漢,用的明星名字,粉絲效應
Reddis是單執行緒
明白Redis是很快的,官方表示,Redis是基於記憶體操作,CPU並不是Redis的瓶頸,Redis的瓶頸是根據機器的記憶體和網路頻寬,既然可以使用單執行緒來實現,就使用單執行緒了。
Redis是C語言寫的,官方的資料是每秒10萬+的QPS,這個不比Memecache差!
Redis單執行緒為什麼還這麼快?
-
誤區:高效能的伺服器一定是多執行緒的
-
誤區:多執行緒(CPU上下文會切換)一定比單執行緒效率高
核心:redis是將所有資料全部放在記憶體中的,所以說使用單執行緒操作效率就是最高的,多執行緒(CPU上下文切換消耗),對於記憶體系統來說,,如果沒有上下文操作效率就是最高的,每次讀寫都是在一個CPU上的,在記憶體情況下,這個就是最佳方案。
五大資料型別
Redis 是一種開源(BSD 許可)、記憶體中資料結構儲存,用作資料庫、快取和訊息代理*。Redis 提供了諸如字串、雜湊、列表、集合、帶範圍查詢的排序集合、點陣圖、超級日誌、地理空間索引和流等資料結構。Redis 內建複製、Lua 指令碼、LRU 驅逐、事務和不同級別的磁碟持久化,並通過 Redis Sentinel 和 Redis Cluster 自動分割槽提供高可用性。
Redis-Key
EXISTS 鍵 鍵存在返回1,不存在返回0
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> exists name1
(integer) 0
127.0.0.1:6379>
move 鍵 1 從當前庫中的name移動到資料庫1中 ,1代表資料庫
127.0.0.1:6379> move name 1
(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
(error) ERR wrong number of arguments for 'keys' command
127.0.0.1:6379[1]> keys *
1) "name"
127.0.0.1:6379[1]>
expire 鍵 10 設定過期時間,10秒後過期
ttl 鍵 檢視當前key的剩餘時間
127.0.0.1:6379[1]> keys *
1) "name"
127.0.0.1:6379[1]> expire name 10
(integer) 1
127.0.0.1:6379[1]> ttl name
(integer) 2
127.0.0.1:6379[1]> ttl name
(integer) -2
127.0.0.1:6379[1]> get name
(nil)
127.0.0.1:6379[1]>
type 鍵 檢視鍵的型別
127.0.0.1:6379> type name
string
127.0.0.1:6379> type age
string
127.0.0.1:6379>
String
字串型別
append 追加
127.0.0.1:6379> set key1 v1
OK
127.0.0.1:6379> get key1
"v1"
127.0.0.1:6379> append key1 "hello"
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379>
strlen key1 檢視key的長度
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> append key1 ",hepeng"
(integer) 14
127.0.0.1:6379> strlen key1
(integer) 14
127.0.0.1:6379> get key1
"v1hello,hepeng"
127.0.0.1:6379>
getrange 擷取字串 range 字串範圍
127.0.0.1:6379> get key1
"helloworld"
127.0.0.1:6379> getrange key1 0 3 #是閉區間的
"hell"
127.0.0.1:6379> getrange key1 0 -1 #獲取全部字串,和get key 是一樣的
"helloworld"
SETRANGE 替換
127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> SETRANGE key2 1 xx #替換指定位置開始的字串
(integer) 7
127.0.0.1:6379> get key2
"axxdefg"
setex (set with expire) # 設定過期時間
setnx (set if not exist) # 不存在再設定 在分散式鎖中常用
127.0.0.1:6379> setex key3 30 hello #設定key3的值為hello 30秒後過期
OK
127.0.0.1:6379> ttl key3
(integer) 18
127.0.0.1:6379> ttl key3
(integer) 15
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> setnx mykey "redis" #如果mykey不存在就建立
(integer) 1
127.0.0.1:6379> get mykey
"redis"
127.0.0.1:6379> keys *
1) "key2"
2) "views"
3) "mykey"
4) "key1"
5) "list"
6) "v11"
7) "k11"
8) "k13"
9) "v13"
10) "name"
127.0.0.1:6379> setnx mykey "MongoDB" #如果存在就不建立
(integer) 0
127.0.0.1:6379> get mykey
"redis"
mset 批量設定值
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 k4 v4
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k1"
3) "k4"
4) "k2"
mget 批量獲取值
127.0.0.1:6379> mget k1 k2 k3 k4
1) "v1"
2) "v2"
3) "v3"
4) "v4"
msetnx 是原子性操作 要麼一起成功要麼一起失敗
127.0.0.1:6379> msetnx k4 v4 k5 v5
(integer) 0
127.0.0.1:6379> get k5
(nil)
設定user:1物件,用json來儲存物件
127.0.0.1:6379> set user:1 {name:zhangsan,age:3}
OK
127.0.0.1:6379> get user:1
"{name:zhangsan,age:3}"
這裡的key是一個巧妙的設計:user:{id}:{filed}
127.0.0.1:6379> mset user:1:name zhangsan user:1:age 23
OK
127.0.0.1:6379> mget user:1:name user:1:age
1) "zhangsan"
2) "23"
getset 先get再set
127.0.0.1:6379> getset db redis #如果不存在值返回nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb #如果存在值,獲取原來的值,設定新的值
"redis"
127.0.0.1:6379> get db
"mongodb"
CAS 比較並交換
資料結構是相同的
List(有序,可重複)
所有的List命令都是以L開頭的
lpush 左插入 rpush 右插入
127.0.0.1:6379> Lpush list one #將一個或多個值插入到列表頭部(左)
(integer) 1
127.0.0.1:6379> Lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1 #獲取list中的值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1 #通過區間獲取具體的值
1) "three"
2) "two"
127.0.0.1:6379> rpush list right #將一個或多個值插入到列表尾部(右)
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "right"
lpop rpop
127.0.0.1:6379> lpop list #從左移除
"three"
127.0.0.1:6379> rpop list
"right"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 1 #通過下標獲取值
"one"
127.0.0.1:6379> lindex list 0
"two"
lrem 移除list集合中指定個數的value Llen返回列表長度
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> llen list #返回列表長度
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 one #移除list集合中指定個數的value,精確匹配
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 1 three
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 2 three
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
ltrim
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "world"
(integer) 2
127.0.0.1:6379> rpush mylist "hello1"
(integer) 3
127.0.0.1:6379> rpush mylist "hello12"
(integer) 4
127.0.0.1:6379> rpush mylist "hello3"
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "world"
3) "hello1"
4) "hello12"
5) "hello3"
127.0.0.1:6379> ltrim mylist 1 2 #通過下標擷取指定長度,這個list已經被改變了,截斷了值剩下擷取的元素
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "world"
2) "hello1"
rpoplpush #移除列表的最後一個元素,將他移動到另一個新列表中
127.0.0.1:6379> lpush mylist "hello"
(integer) 1
127.0.0.1:6379> lpush mylist "hello1"
(integer) 2
127.0.0.1:6379> lpush mylist "hello2"
(integer) 3
127.0.0.1:6379> lpush mylist "hello3"
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello3"
2) "hello2"
3) "hello1"
4) "hello"
127.0.0.1:6379> rpoplpush mylist list #檢視新列表中,確實存在該值
"hello"
127.0.0.1:6379> lrange list 0 -1
1) "hello"
lset 將列表中指定下標的值替換為另一個值,更新操作
127.0.0.1:6379> exists list #判斷這個列表是否存在,如果不存在列表我們去更新就會報錯
1) 0
127.0.0.1:6379> lrange list 0 -1
1) "hello"
127.0.0.1:6379> lpush list value
(integer) 2
127.0.0.1:6379> lrange list 0 0
1) "value"
127.0.0.1:6379> lset list 0 item #如果存在就會更新當前下標的值
OK
127.0.0.1:6379> lrange list 0 -1
1) "item"
2) "hello"
linsert 將某個具體的value插入到列中某個元素的前面或者後面
127.0.0.1:6379> lpush list "hello"
(integer) 1
127.0.0.1:6379> lpush list "hello1"
(integer) 2
127.0.0.1:6379> lpush list "hello2"
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "hello2"
2) "hello1"
3) "hello"
127.0.0.1:6379> linsert list before "hello2" "other"
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "other"
2) "hello2"
3) "hello1"
4) "hello"
127.0.0.1:6379> linsert list after "hello" "java"
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "other"
2) "hello2"
3) "hello1"
4) "hello"
5) "java"
總結
Set(無序,不重複)
命令都是以S開頭
ladd 新增元素 smembers list 檢視集合
127.0.0.1:6379> sadd list "hello" #set集合中新增元素
(integer) 1
127.0.0.1:6379> sadd list "redis"
(integer) 1
127.0.0.1:6379> sadd list "loveredis"
(integer) 1
127.0.0.1:6379> smembers list
1) "hello"
2) "redis"
3) "loveredis"
127.0.0.1:6379> sismember list "hello" #判斷某一個值是否在集合中,返回1表示存在,0為不存在
(integer) 1
127.0.0.1:6379> sismember list "java"
(integer) 0
127.0.0.1:6379> smembers list
1) "hello"
2) "redis"
3) "loveredis"
127.0.0.1:6379> scard list #獲取當前列表元素個數
(integer) 3
127.0.0.1:6379> sismember list "java" 如果元素存在,則新增不了
(integer) 0
127.0.0.1:6379> srem list "hello" #移除set集合中的指定元素
(integer) 1
127.0.0.1:6379> smembers list
1) "redis"
2) "loveredis"
127.0.0.1:6379> srandmember list # 隨機獲取集合中的元素
"loveredis"
127.0.0.1:6379> srandmember list
"redis"
127.0.0.1:6379> srandmember list 2 #隨機獲取兩個元素
1) "redis"
2) "loveredis"
127.0.0.1:6379> smembers list
1) "c++"
2) "redis"
3) "loveredis"
127.0.0.1:6379> spop list # 隨機移除set集合中的元素
"loveredis"
127.0.0.1:6379> spop list
"c++"
127.0.0.1:6379> smembers list
1) "redis"
將一個指定的值移動到另外一個set集合中
127.0.0.1:6379> smembers myset
1) "hepeng"
2) "hello"
3) "redis"
4) "java"
127.0.0.1:6379> smembers myset2
1) "haha"
127.0.0.1:6379> smove myset myset2 "java"
(integer) 1
共同關注 (並集)
數字集合類:
差集 SDIFF
並集 SINTER
交集 SUNION
127.0.0.1:6379> smembers key1
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> smembers key2
1) "e"
2) "d"
3) "c"
差集
127.0.0.1:6379> sdiff key1 key2
1) "a"
2) "b"
交集
127.0.0.1:6379> sinter key1 key2
1) "c"
並集
127.0.0.1:6379> sunion key1 key2
1) "e"
2) "c"
3) "b"
4) "a"
5) "d"
共同好友,共同愛好,二度好友,推薦好友!