1. 程式人生 > 其它 >Redis複習

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單執行緒為什麼還這麼快?

  1. 誤區:高效能的伺服器一定是多執行緒的

  2. 誤區:多執行緒(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"

共同好友,共同愛好,二度好友,推薦好友!

Hash

Zset

三種特殊的資料型別

geospatial

hyperloglog

bitmaps