久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

phpredis中文手册——《redis中文手册》 php版

發布時間:2024/10/12 php 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 phpredis中文手册——《redis中文手册》 php版 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

redis中文手冊:http://readthedocs.org/docs/redis/en/latest/?

本文是參考《redis中文手冊》,將示例代碼用php來實現,注意php-redis與redis_cli的區別(主要是返回值類型和參數用法)。

目錄(使用CTRL+F快速查找命令):

KeyStringHashListSet
  • 鍵(Key)
    • DEL
    • KEYS
    • RANDOMKEY
    • TTL
    • EXISTS
    • MOVE
    • RENAME
    • RENAMENX
    • TYPE
    • EXPIRE
    • EXPIREAT
    • OBJECT
    • PERSIST
    • SORT
  • 字符串(String)
    • SET
    • SETNX
    • SETEX
    • SETRANGE
    • MSET
    • MSETNX
    • APPEND
    • GET
    • MGET
    • GETRANGE
    • GETSET
    • STRLEN
    • INCR
    • INCRBY
    • DECR
    • DECRBY
    • SETBIT
    • GETBIT
  • 哈希表(Hash)
    • HSET
    • HSETNX
    • HMSET
    • HGET
    • HMGET
    • HGETALL
    • HDEL
    • HLEN
    • HEXISTS
    • HINCRBY
    • HKEYS
    • HVALS
  • 表(List)
    • LPUSH
    • LPUSHX
    • RPUSH
    • RPUSHX
    • LPOP
    • RPOP
    • BLPOP
    • BRPOP
    • LLEN
    • LRANGE
    • LREM
    • LSET
    • LTRIM
    • LINDEX
    • LINSERT
    • RPOPLPUSH
    • BRPOPLPUSH
  • 集合(Set)
    • SADD
    • SREM
    • SMEMBERS
    • SISMEMBER
    • SCARD
    • SMOVE
    • SPOP
    • SRANDMEMBER
    • SINTER
    • SINTERSTORE
    • SUNION
    • SUNIONSTORE
    • SDIFF
    • SDIFFSTORE
Sorted SetPub/SubTransactionConnectionServer
  • 有序集(Sorted Set)
    • ZADD
    • ZREM
    • ZCARD
    • ZCOUNT
    • ZSCORE
    • ZINCRBY
    • ZRANGE
    • ZREVRANGE
    • ZRANGEBYSCORE
    • ZREVRANGEBYSCORE
    • ZRANK
    • ZREVRANK
    • ZREMRANGEBYRANK
    • ZREMRANGEBYSCORE
    • ZINTERSTORE
    • ZUNIONSTORE
  • 發布/訂閱(Pub/Sub)
    • PUBLISH
    • SUBSCRIBE
    • PSUBSCRIBE
    • UNSUBSCRIBE
    • PUNSUBSCRIBE
  • 事務(Transaction)
    • WATCH
    • UNWATCH
    • MULTI
    • EXEC
    • DISCARD
  • 連接(Connection)
    • AUTH
    • PING
    • SELECT
    • ECHO
    • QUIT
  • 服務器(Server)
    • BGREWRITEAOF
    • BGSAVE
    • SAVE
    • LASTSAVE
    • DBSIZE
    • SLAVEOF
    • FLUSHALL
    • FLUSHDB
    • SHUTDOWN
    • SLOWLOG
    • INFO
    • CONFIG GET
    • CONFIG SET
    • CONFIG RESETSTAT
    • DEBUG OBJECT
    • DEBUG SEGFAULT
    • MONITOR
    • SYNC

phpredis是redis的php的一個擴展,效率是相當高有鏈表排序功能,對創建內存級的模塊業務關系

很有用;以下是redis官方提供的命令使用技巧:

下載地址如下:

https://github.com/owlient/phpredis(支持redis 2.0.4)

Redis::__construct構造函數
$redis = new Redis();

connect, open 鏈接redis服務
參數
host: string,服務地址
port: int,端口號
timeout: float,鏈接時長 (可選, 默認為 0 ,不限鏈接時間)
注: 在redis.conf中也有時間,默認為300

pconnect, popen 不會主動關閉的鏈接
參考上面

setOption 設置redis模式

getOption 查看redis設置的模式

ping 查看連接狀態

?

KEY相關操作

DEL

移除給定的一個或多個key

如果key不存在,則忽略該命令。

時間復雜度:
O(N),N為要移除的key的數量。 移除單個字符串類型的key,時間復雜度為O(1)。 移除單個列表、集合、有序集合或哈希表類型的key,時間復雜度為O(M),M為以上數據結構內的元素數量。
返回值:
被移除key的數量。

?

//DEL
#
情況1: 刪除單個key
$redis->set('myname','ikodota');
echo $redis->get('myname').'<br>'; # 返回:ikodota

$redis->del('myname');# 返回 TRUE(1)
var_dump($redis->get('myname')); # 返回 bool(false)

# 情況2: 刪除一個不存在的key
if(!$redis->exists('fake_key')) # 不存在
var_dump($redis->del('fake_key')); # 返回 int(0)

# 情況3: 同時刪除多個key
$array_mset=array('first_key'=>'first_val',
'second_key'=>'second_val',
'third_key'=>'third_val');
$redis->mset($array_mset); #用MSET一次儲存多個值
$array_mget=array('first_key','second_key','third_key');
var_dump($redis->mget($array_mget)); #一次返回多個值 //array(3) { [0]=> string(9) "first_val" [1]=> string(10) "second_val" [2]=> string(9) "third_val" }

$redis->del($array_mget); #同時刪除多個key
var_dump($redis->mget($array_mget)); #返回 array(3) { [0]=> bool(false) [1]=> bool(false) [2]=> bool(false) }

?

KEYSKEYS pattern?查找符合給定模式的keyKEYS?*命中數據庫中所有keyKEYS?h?llo命中hello,?hallo?and?hxllo等。 KEYS?h*llo命中hlloheeeeello等。 KEYS?h[ae]llo命中hellohallo,但不命中hillo

特殊符號用"\"隔開

時間復雜度:
O(N),N為數據庫中key的數量。
返回值:
符合給定模式的key列表。

警告 :KEYS的速度非常快,但在一個大的數據庫中使用它仍然可能造成性能問題,如果你需要從一個數據集中查找特定的key,你最好還是用集合(Set)

?

//KEYS
#
$redis->FLUSHALL();
$array_mset_keys=array('one'=>'1',
'two'=>'2',
'three '=>'3',
'four'=>'4');
$redis->mset($array_mset_keys); #用MSET一次儲存多個值
var_dump($redis->keys('*o*')); //array(3) { [0]=> string(4) "four" [1]=> string(3) "two" [2]=> string(3) "one" }
var_dump($redis->keys('t??')); //array(1) { [0]=> string(3) "two" }
var_dump($redis->keys('t[w]*')); //array(1) { [0]=> string(3) "two" }
print_r($redis->keys('*')); //Array ( [0] => four [1] => three [2] => two [3] => one )

?

RANDOMKEY

從當前數據庫中隨機返回(不刪除)一個key

時間復雜度:
O(1)
返回值:
當數據庫不為空時,返回一個key。 當數據庫為空時,返回nil。

?

//RANDOMKEY
$redis->FLUSHALL();
# 情況1:數據庫不為空
$array_mset_randomkey=array('fruit'=>'apple',
'drink'=>'beer',
'food'=>'cookis');
$redis->mset($array_mset_randomkey);
echo $redis->randomkey();
print_r($redis->keys('*')); # 查看數據庫內所有key,證明RANDOMKEY并不刪除key//Array ( [0] => food [1] => drink [2] => fruit )

# 情況2:數據庫為空
$redis->flushdb(); # 刪除當前數據庫所有key
var_dump($redis-> randomkey()); //bool(false)

?

TTL
TTL key

返回給定key的剩余生存時間(time to live)(以秒為單位)。

時間復雜度:
O(1)
返回值:
key的剩余生存時間(以秒為單位)。 當key不存在或沒有設置生存時間時,返回-1?。

?

//TTL
#
情況1:帶TTL的key
$redis->flushdb();
//$redis->set('name','ikodota'); # 設置一個key
$redis->expire('name',30); # 設置生存時間為30秒 //return (integer) 1
echo $redis->get('name'); //return ikodota
echo $redis->ttl('name'); //(integer) 25

//echo $redis->ttl('name'); # 30秒過去,name過期 //(integer) -1

var_dump($redis->get('name')); # 過期的key將被刪除 //return bool(false);

# 情況2:不帶TTL的key
$redis->set('site','wikipedia.org');//OK
var_dump($redis->ttl('site'));//int(-1)

# 情況3:不存在的key
$redis->EXISTS('not_exists_key');//int(0)
var_dump($redis->TTL('not_exists_key'));//int(-1)

?

EXISTSEXISTS key

檢查給定key是否存在。

時間復雜度:
O(1)
返回值:
key存在,返回1,否則返回0
//EXISTS
echo '<br>EXISTS<br>';
$redis->set('db',"redis"); //bool(true)
var_dump($redis->exists('db')); # key存在 //bool(true)
$redis->del('db'); # 刪除key //int(1)
var_dump($redis->exists('db')) # key不存在 //bool(false)

?

MOVE
MOVE key db

將當前數據庫(默認為0)的key移動到給定的數據庫db當中。

如果當前數據庫(源數據庫)和給定數據庫(目標數據庫)有相同名字的給定key,或者key不存在于當前數據庫,那么MOVE沒有任何效果。

因此,也可以利用這一特性,將MOVE當作鎖(locking)原語。

時間復雜度:
O(1)
返回值:
移動成功返回1,失敗則返回0
//MOVE
echo '<br><br>MOVE<br>';
# 情況1: key存在于當前數據庫
$redis->SELECT(0); # redis默認使用數據庫0,為了清晰起見,這里再顯式指定一次。//OK
$redis->SET('song',"secret base - Zone"); //OK
var_dump ($redis->MOVE('song',1)); # 將song移動到數據庫1 //bool(true)

# 情況2:當key不存在的時候
$redis->SELECT(1);
var_dump ($redis->EXISTS('fake_key'));//bool(false);
var_dump($redis->MOVE('fake_key', 0)); # 試圖從數據庫1移動一個不存在的key到數據庫0,失敗) //bool(false)

$redis->SELECT(0); # 使用數據庫0
var_dump($redis->EXISTS('fake_key')); # 證實fake_key不存在 //bool(false)

# 情況3:當源數據庫和目標數據庫有相同的key時

$redis->SELECT(0); # 使用數據庫0
$redis->SET('favorite_fruit',"banana");

$redis->SELECT(1); # 使用數據庫1
$redis->SET('favorite_fruit',"apple");

$redis->SELECT(0); # 使用數據庫0,并試圖將favorite_fruit移動到數據庫1
var_dump($redis->MOVE('favorite_fruit',1)); # 因為兩個數據庫有相同的key,MOVE失敗 //return bool(false)
echo $redis->GET('favorite_fruit'); # 數據庫0的favorite_fruit沒變 //return banana

$redis->SELECT(1);
echo $redis->GET('favorite_fruit'); # 數據庫1的favorite_fruit也是 //return apple

?

RENAME?

RENAME key newkey

key改名為newkey

keynewkey相同或者key不存在時,返回一個錯誤。

newkey已經存在時,RENAME命令將覆蓋舊值。

時間復雜度:
O(1)
返回值:
改名成功時提示OK,失敗時候返回一個錯誤。
//RENAME
echo '<br><br>RENAME<br>';
# 情況1:key存在且newkey不存在
$redis->SET('message',"hello world");
var_dump($redis->RENAME('message','greeting')); //bool(true)
var_dump($redis->EXISTS('message')); # message不復存在 //bool(false)
var_dump($redis->EXISTS('greeting')); # greeting取而代之 //bool(true)

# 情況2:當key不存在時,返回錯誤 ,php返回false;
var_dump($redis->RENAME('fake_key','never_exists')); //bool(false)

# 情況3:newkey已存在時,RENAME會覆蓋舊newkey
$redis->SET('pc',"lenovo");
$redis->SET('personal_computer',"dell");
var_dump($redis->RENAME('pc','personal_computer')); //bool(true)
var_dump($redis->GET('pc')); //(nil) bool(false)
var_dump($redis->GET('personal_computer')); # dell“沒有”了 //string(6) "lenovo"

?

RENAMENX?RENAMENX key newkey

當且僅當newkey不存在時,將key改為newkey

出錯的情況和RENAME一樣(key不存在時報錯)。

時間復雜度:
O(1)
返回值:
修改成功時,返回1。 如果newkey已經存在,返回0
//RENAMENX
echo '<br><br>RENAMENX<br>';

# 情況1:newkey不存在,成功
$redis->SET('player',"MPlyaer");
$redis->EXISTS('best_player'); //int(0)
var_dump($redis->RENAMENX('player','best_player')); // bool(true)

# 情況2:newkey存在時,失敗
$redis->SET('animal',"bear");
$redis->SET('favorite_animal', "butterfly");

var_dump($redis->RENAMENX('animal', 'favorite_animal'));// bool(false)

var_dump($redis->get('animal')); //string(4) "bear"
var_dump($redis->get('favorite_animal')); //string(9) "butterfly"

TYPETYPE key

返回key所儲存的值的類型。

時間復雜度:
O(1)
返回值:
none(key不存在) int(0) string(字符串) int(1) list(列表) int(3) set(集合) int(2) zset(有序集) int(4) hash(哈希表) int(5)

?

//TYPE
$redis->flushALL();
echo '<br><br>TYPE<br>';

var_dump($redis->TYPE('fake_key')); //none /int(0)

$redis->SET('weather',"sunny"); # 構建一個字符串
var_dump($redis->TYPE('weather'));//string / int(1)

$redis->SADD('pat',"dog"); # 構建一個集合
var_dump($redis->TYPE('pat')); //set /int(2)

$redis->LPUSH('book_list',"programming in scala"); # 構建一個列表
var_dump($redis->TYPE('book_list'));//list / int(3)

$redis->ZADD('pats',1,'cat'); # 構建一個zset (sorted set) // int(1)
$redis->ZADD('pats',2,'dog');
$redis->ZADD('pats',3,'pig');
var_dump($redis->zRange('pats',0,-1)); // array(3) { [0]=> string(3) "cat" [1]=> string(3) "dog" [2]=> string(3) "pig" }
var_dump($redis->TYPE('pats')); //zset / int(4)

$redis->HSET('website','google','www.g.cn'); # 一個新域
var_dump($redis->HGET('website','google')); //string(8) "www.g.cn"
var_dump($redis->TYPE('website')); //hash /int(5)

EXPIRE

EXPIRE key seconds

為給定key設置生存時間。

key過期時,它會被自動刪除。

在Redis中,帶有生存時間的key被稱作“易失的”(volatile)。

?

在低于2.1.3版本的Redis中,已存在的生存時間不可覆蓋。 從2.1.3版本開始,key的生存時間可以被更新,也可以被PERSIST命令移除。(詳情參見?http://redis.io/topics/expire)。

?

時間復雜度:
O(1)
返回值:
設置成功返回1。 當key不存在或者不能為key設置生存時間時(比如在低于2.1.3中你嘗試更新key的生存時間),返回0
//EXPIRE
$redis->select(7);
//$redis->flushdb();

echo '<br><br>EXPIRE<br>';
$redis->SET('cache_page',"www.cnblogs.com/ikodota");
$redis->EXPIRE('cache_page', 30); # 設置30秒后過期
sleep(6);
echo $redis->TTL('cache_page').'<br>'; # 查看給定key的剩余生存時間 //(integer) 24

$redis->EXPIRE('cache_page', 3000); # 更新生存時間,3000秒
sleep(4);
echo $redis->TTL('cache_page').'<br>'; //(integer) 2996

?

?

EXPIREAT?EXPIREAT key timestamp

EXPIREAT的作用和EXPIRE一樣,都用于為key設置生存時間。

不同在于EXPIREAT命令接受的時間參數是UNIX時間戳(unix timestamp)。

時間復雜度:
O(1)
返回值:
如果生存時間設置成功,返回1。 當key不存在或沒辦法設置生存時間,返回0

?

//EXPIREAT
echo '<br><br>EXPIREAT<br>';
$redis->SET('cache','www.google.com');
echo $redis->EXPIREAT('cache','1355292000'); # 這個key將在2012.12.12過期

echo ($redis->TTL('cache')); //return 124345085

?

OBJECT?OBJECT subcommand [arguments [arguments]]

OBJECT命令允許從內部察看給定key的Redis對象。

它通常用在除錯(debugging)或者了解為了節省空間而對key使用特殊編碼的情況。 當將Redis用作緩存程序時,你也可以通過OBJECT命令中的信息,決定key的驅逐策略(eviction policies)。

OBJECT命令有多個子命令:

  • OBJECT?REFCOUNT?<key>返回給定key引用所儲存的值的次數。此命令主要用于除錯。
  • OBJECT?ENCODING?<key>返回給定key鎖儲存的值所使用的內部表示(representation)。
  • OBJECT?IDLETIME?<key>返回給定key自儲存以來的空轉時間(idle, 沒有被讀取也沒有被寫入),以秒為單位。
對象可以以多種方式編碼:
  • 字符串可以被編碼為raw(一般字符串)或int(用字符串表示64位數字是為了節約空間)。
  • 列表可以被編碼為ziplistlinkedlistziplist是為節約大小較小的列表空間而作的特殊表示。
  • 集合可以被編碼為intset或者hashtableintset是只儲存數字的小集合的特殊表示。
  • 哈希表可以編碼為zipmap或者hashtablezipmap是小哈希表的特殊表示。
  • 有序集合可以被編碼為ziplist或者skiplist格式。ziplist用于表示小的有序集合,而skiplist則用于表示任何大小的有序集合。
假如你做了什么讓Redis沒辦法再使用節省空間的編碼時(比如將一個只有1個元素的集合擴展為一個有100萬個元素的集合),特殊編碼類型(specially encoded types)會自動轉換成通用類型(general type)。 時間復雜度:
O(1)
返回值:
REFCOUNTIDLETIME返回數字。 ENCODING返回相應的編碼類型。
//OBJECT
$redis->select(8);
echo '<br><br>OBJECT<br>';
$redis->SET('game',"WOW"); # 設置一個字符串
$redis->OBJECT('REFCOUNT','game'); # 只有一個引用

//sleep(5);

echo $redis->OBJECT('IDLETIME','game'); # 等待一陣。。。然后查看空轉時間 //(integer) 10
//echo $redis->GET('game'); # 提取game, 讓它處于活躍(active)狀態 //return WOW
//echo $redis->OBJECT('IDLETIME','game'); # 不再處于空轉 //(integer) 0

var_dump($redis->OBJECT('ENCODING','game')); # 字符串的編碼方式 //string(3) "raw"
$redis->SET('phone',15820123123); # 大的數字也被編碼為字符串
var_dump($redis->OBJECT('ENCODING','phone')); //string(3) "raw"
$redis->SET('age',20); # 短數字被編碼為int
var_dump($redis->OBJECT('ENCODING','age')); //string(3) "int"

?

PERSIST?PERSIST key

?

移除給定key的生存時間。

?

時間復雜度:
O(1)
返回值:
當生存時間移除成功時,返回1. 如果key不存在或key沒有設置生存時間,返回0

?

//PERSIST
echo '<br><br>PERSIST<br>';
$redis->SET('time_to_say_goodbye',"886...");
$redis->EXPIRE('time_to_say_goodbye', 300);
sleep(3);
echo $redis->TTL('time_to_say_goodbye'); # (int) 297
echo '<br>';

$redis->PERSIST('time_to_say_goodbye'); # 移除生存時間
echo $redis->TTL('time_to_say_goodbye'); # 移除成功 //int(-1)


SORT

?

SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]

排序,分頁等
參數

array(
‘by’ => ‘some_pattern_*’,
‘limit’ => array(0, 1),
‘get’ => ‘some_other_pattern_*’ or an array of patterns,
‘sort’ => ‘asc’ or ‘desc’,
‘alpha’ => TRUE,
‘store’ => ‘external-key’
)

返回或保存給定列表、集合、有序集合key中經過排序的元素。

排序默認以數字作為對象,值被解釋為雙精度浮點數,然后進行比較。

?

一般SORT用法

最簡單的SORT使用方法是SORT?key

假設today_cost是一個保存數字的列表,SORT命令默認會返回該列表值的遞增(從小到大)排序結果。

?

# 將數據一一加入到列表中
$redis->LPUSH('today_cost', 30);
$redis->LPUSH('today_cost', 1.5);
$redis->LPUSH('today_cost', 10);
$redis->LPUSH('today_cost', 8);
# 排序
var_dump($redis->SORT('today_cost')); //array(4) { [0]=> string(3) "1.5" [1]=> string(1) "8" [2]=> string(2) "10" [3]=> string(2) "30" }

當數據集中保存的是字符串值時,你可以用ALPHA修飾符(modifier)進行排序。

# 將數據一一加入到列表中
$redis->LPUSH('website', "www.reddit.com");
$redis->LPUSH('website', "www.slashdot.com");
$redis->LPUSH('website', "www.infoq.com");
# 默認排序
var_dump($redis->SORT('website'));//array(3) { [0]=> string(13) "www.infoq.com" [1]=> string(16) "www.slashdot.com" [2]=> string(14) "www.reddit.com" }

# 按字符排序 ALPHA=true
var_dump($redis->SORT('website', array('ALPHA'=>TRUE))); //array(3) { [0]=> string(13) "www.infoq.com" [1]=> string(14) "www.reddit.com" [2]=> string(16) "www.slashdot.com" }

如果你正確設置了!LC_COLLATE環境變量的話,Redis能識別UTF-8編碼。

排序之后返回的元素數量可以通過LIMIT修飾符進行限制。 LIMIT修飾符接受兩個參數:offsetcountoffset指定要跳過的元素數量,count指定跳過offset個指定的元素之后,要返回多少個對象。

以下例子返回排序結果的前5個對象(offset0表示沒有元素被跳過)。

# 將數據一一加入到列表中
$redis->LPUSH('rank', 30); //(integer) 1
$redis->LPUSH('rank', 56); //(integer) 2
$redis->LPUSH('rank', 42); //(integer) 3
$redis->LPUSH('rank', 22); //(integer) 4
$redis->LPUSH('rank', 0); //(integer) 5
$redis->LPUSH('rank', 11); //(integer) 6
$redis->LPUSH('rank', 32); //(integer) 7
$redis->LPUSH('rank', 67); //(integer) 8
$redis->LPUSH('rank', 50); //(integer) 9
$redis->LPUSH('rank', 44); //(integer) 10
$redis->LPUSH('rank', 55); //(integer) 11

# 排序
$redis_sort_option=array('LIMIT'=>array(0,5));
var_dump($redis->SORT('rank',$redis_sort_option)); # 返回排名前五的元素 // array(5) { [0]=> string(1) "0" [1]=> string(2) "11" [2]=> string(2) "22" [3]=> string(2) "30" [4]=> string(2) "32" }

修飾符可以組合使用。以下例子返回降序(從大到小)的前5個對象。

$redis_sort_option=array(
'LIMIT'=>array(0,5),
'SORT'=>'DESC'
);
var_dump($redis->SORT('rank',$redis_sort_option)); //array(5) { [0]=> string(2) "67" [1]=> string(2) "56" [2]=> string(2) "55" [3]=> string(2) "50" [4]=> string(2) "44" }

?

使用外部key進行排序

有時候你會希望使用外部的key作為權重來比較元素,代替默認的對比方法。

假設現在有用戶(user)數據如下:

id    ?name    level
-------------------------------
1    admin    ?9999
2    huangz   10
59230  jack     ? ?3
222   ?hacker    ??9999

id數據保存在key名為user_id的列表中。
name數據保存在key名為user_name_{id}的列表中
level數據保存在user_level_{id}的key中。

# 先將要使用的數據加入到數據庫中

# admin
$redis->LPUSH('user_id', 1);//(integer) 1
$redis->SET('user_name_1', 'admin');
$redis->SET('user_level_1',9999);

# huangz
$redis->LPUSH('user_id', 2);//(integer) 2
$redis->SET('user_name_2', 'huangz');
$redis->SET('user_level_2', 10);

# jack
$redis->LPUSH('user_id', 59230);//(integer) 3
$redis->SET('user_name_59230','jack');
$redis->SET('user_level_59230', 3);

# hacker
$redis->LPUSH('user_id', 222); //(integer) 4
$redis->SET('user_name_222', 'hacker');
$redis->SET('user_level_222', 9999);

?

如果希望按level從大到小排序user_id,可以使用以下命令:

$redis_sort_option=array('BY'=>'user_level_*',
'SORT'=>'DESC'
);
var_dump($redis->SORT('user_id',$redis_sort_option)); //array(4) { [0]=> string(3) "222" [1]=> string(1) "1" [2]=> string(1) "2" [3]=> string(5) "59230" }

#---------------------------
#
1) "222" # hacker
#
2) "1" # admin
#
3) "2" # huangz
#
4) "59230" # jack

但是有時候只是返回相應的id沒有什么用,你可能更希望排序后返回id對應的用戶名,這樣更友好一點,使用GET選項可以做到這一點:

?

$redis_sort_option=array('BY'=>'user_level_*',
'SORT'=>'DESC',
'GET'=>'user_name_*'
);
var_dump($redis->SORT('user_id', $redis_sort_option)); //array(4) { [0]=> string(6) "hacker" [1]=> string(5) "admin" [2]=> string(6) "huangz" [3]=> string(4) "jack" }
#1) "hacker"
#
2) "admin"
#
3) "huangz"
#
4) "jack"

可以多次地、有序地使用GET操作來獲取更多外部key

比如你不但希望獲取用戶名,還希望連用戶的密碼也一并列出,可以使用以下命令:

?

# 先添加一些測試數據
$redis->SET('user_password_222', "hey,im in");
$redis->SET('user_password_1', "a_long_long_password");
$redis->SET('user_password_2', "nobodyknows");
$redis->SET('user_password_59230', "jack201022");

# 獲取name和password
$redis_sort_option=array('BY'=>'user_level_*',
'SORT'=>'DESC',
'GET'=>array('user_name_*','user_password_*')
);
var_dump($redis->SORT('user_id',$redis_sort_option));//array(8) { [0]=> string(6) "hacker" [1]=> string(9) "hey,im in" [2]=> string(5) "admin" [3]=> string(20) "a_long_long_password" [4]=> string(6) "huangz" [5]=> string(11) "nobodyknows" [6]=> string(4) "jack" [7]=> string(10) "jack201022" }

#------------------------------------
#
1) "hacker" # 用戶名
#
2) "hey,im in" # 密碼
#
3) "jack"
#
4) "jack201022"
#
5) "huangz"
#
6) "nobodyknows"
#
7) "admin"
#
8) "a_long_long_password" # 注意GET操作是有序的,GET user_name_* GET user_password_* 和 GET user_password_* GET user_name_*返回的結果位置不同

?

# 獲取name和password 注意GET操作是有序的
$redis_sort_option=array('BY'=>'user_level_*',
'SORT'=>'DESC',
'GET'=>array('user_password_*','user_name_*')
);
var_dump($redis->SORT('user_id',$redis_sort_option));// array(8) { [0]=> string(9) "hey,im in" [1]=> string(6) "hacker" [2]=> string(20) "a_long_long_password" [3]=> string(5) "admin" [4]=> string(11) "nobodyknows" [5]=> string(6) "huangz" [6]=> string(10) "jack201022" [7]=> string(4) "jack" }

GET還有一個特殊的規則——"GET?#",用于獲取被排序對象(我們這里的例子是user_id)的當前元素。

比如你希望user_idlevel排序,還要列出idnamepassword,可以使用以下命令:

?

$redis_sort_option=array('BY'=>'user_level_*',
'SORT'=>'DESC',
'GET'=>array('#','user_password_*','user_name_*')
);
var_dump($redis->SORT('user_id',$redis_sort_option));//array(12) { [0]=> string(3) "222" [1]=> string(9) "hey,im in" [2]=> string(6) "hacker" [3]=> string(1) "1" [4]=> string(20) "a_long_long_password" [5]=> string(5) "admin" [6]=> string(1) "2" [7]=> string(11) "nobodyknows" [8]=> string(6) "huangz" [9]=> string(5) "59230" [10]=> string(10) "jack201022" [11]=> string(4) "jack" }

#--------------------------------------------------------------
#
1) "222" # id
#
2) "hacker" # name
#
3) "hey,im in" # password
#
4) "1"
#
5) "admin"
#
6) "a_long_long_password"
#
7) "2"
#
8) "huangz"
#
9) "nobodyknows"
#
10) "59230"
#
11) "jack"
#
12) "jack201022"

只獲取對象而不排序

BY修飾符可以將一個不存在的key當作權重,讓SORT跳過排序操作。

該方法用于你希望獲取外部對象而又不希望引起排序開銷時使用。

?

# 確保fake_key不存在
$redis->EXISTS('fake_key');//(integer) 0

# 以fake_key作BY參數,不排序,只GET name 和 GET password
$redis_sort_option=array('BY'=>'fake_key',
'SORT'=>'DESC',
'GET'=>array('#','user_name_*','user_password_*')
);
var_dump($redis->SORT('user_id',$redis_sort_option));//array(12) { [0]=> string(3) "222" [1]=> string(6) "hacker" [2]=> string(9) "hey,im in" [3]=> string(5) "59230" [4]=> string(4) "jack" [5]=> string(10) "jack201022" [6]=> string(1) "2" [7]=> string(6) "huangz" [8]=> string(11) "nobodyknows" [9]=> string(1) "1" [10]=> string(5) "admin" [11]=> string(20) "a_long_long_password" }

#----------------------------------------------
#
1) "222" # id
#
2) "hacker" # user_name
#
3) "hey,im in" # password
#
4) "59230"
#
5) "jack"
#
6) "jack201022"
#
7) "2"
#
8) "huangz"
#
9) "nobodyknows"
#
10) "1"
#
11) "admin"
#
12) "a_long_long_password"

保存排序結果

默認情況下,SORT操作只是簡單地返回排序結果,如果你希望保存排序結果,可以給STORE選項指定一個key作為參數,排序結果將以列表的形式被保存到這個key上。(若指定key已存在,則覆蓋。)

$redis->EXISTS('user_info_sorted_by_level'); # 確保指定key不存在 //(integer) 0
$redis_sort_option=array('BY'=>'user_level_*',
'GET'=>array('#','user_name_*','user_password_*'),
'STORE'=>'user_info_sorted_by_level'
);

var_dump($redis->SORT('user_id',$redis_sort_option)); //int(12)
var_dump($redis->LRANGE('user_info_sorted_by_level', 0 ,11)); # 查看排序結果 //array(12) { [0]=> string(5) "59230" [1]=> string(4) "jack" [2]=> string(10) "jack201022" [3]=> string(1) "2" [4]=> string(6) "huangz" [5]=> string(11) "nobodyknows" [6]=> string(3) "222" [7]=> string(6) "hacker" [8]=> string(9) "hey,im in" [9]=> string(1) "1" [10]=> string(5) "admin" [11]=> string(20) "a_long_long_password" }

#-----------------------------------------------------------------
#
1) "59230"
#
2) "jack"
#
3) "jack201022"
#
4) "2"
#
5) "huangz"
#
6) "nobodyknows"
#
7) "222"
#
8) "hacker"
#
9) "hey,im in"
#
10) "1"
#
11) "admin"
#
12) "a_long_long_password"

一個有趣的用法是將SORT結果保存,用EXPIRE為結果集設置生存時間,這樣結果集就成了SORT操作的一個緩存。

這樣就不必頻繁地調用SORT操作了,只有當結果集過期時,才需要再調用一次SORT操作。

有時候為了正確實現這一用法,你可能需要加鎖以避免多個客戶端同時進行緩存重建(也就是多個客戶端,同一時間進行SORT操作,并保存為結果集),具體參見SETNX命令。

在GET和BY中使用哈希表

可以使用哈希表特有的語法,在SORT命令中進行GET和BY操作。

# 假設現在我們的用戶表新增了一個serial項來為作為每個用戶的序列號
#
序列號以哈希表的形式保存在serial哈希域內。

$redis_hash_testdata_array=array(1=>'23131283',
2=>'23810573',
222=>'502342349',
59230=>'2435829758'
);

$redis->HMSET('serial',$redis_hash_testdata_array);

# 我們希望以比較serial中的大小來作為排序user_id的方式
$redis_sort_option=array('BY'=>'*->serial');
var_dump($redis->SORT('user_id', $redis_sort_option)); //array(4) { [0]=> string(3) "222" [1]=> string(5) "59230" [2]=> string(1) "2" [3]=> string(1) "1" }

#----------------------------------------
#
1) "222"
#
2) "59230"
#
3) "2"
#
4) "1"

?

符號"->"用于分割哈希表的關鍵字(key name)和索引域(hash field),格式為"key->field"

除此之外,哈希表的BYGET操作和上面介紹的其他數據結構(列表、集合、有序集合)沒有什么不同。

時間復雜度:
O(N+M*log(M)),N為要排序的列表或集合內的元素數量,M為要返回的元素數量。 如果只是使用SORT命令的GET選項獲取數據而沒有進行排序,時間復雜度O(N)。
返回值:
沒有使用STORE參數,返回列表形式的排序結果。 使用STORE參數,返回排序結果的元素數量。

?

字符串(String)

SET

SET key value

將字符串值value關聯到key

如果key已經持有其他值,SET就覆寫舊值,無視類型。


時間復雜度:O(1)返回值:總是返回OK(TRUE),因為SET不可能失敗。

# 情況1:對字符串類型的key進行SET
$redis->SET('apple', 'www.apple.com');#OK //bool(true)
$redis->GET('apple');//"www.apple.com"

# 情況2:對非字符串類型的key進行SET
$redis->LPUSH('greet_list', "hello"); # 建立一個列表 #(integer) 1 //int(1)
$redis->TYPE('greet_list');#list //int(3)

$redis->SET('greet_list', "yooooooooooooooooo"); # 覆蓋列表類型 #OK //bool(true)
$redis->TYPE('greet_list');#string //int(1)

?

SETNX SETNX key value

key的值設為value,當且僅當key不存在。

若給定的key已經存在,則SETNX不做任何動作。

SETNX是”SET if Not eXists”(如果不存在,則SET)的簡寫。

時間復雜度:
O(1)
返回值:
設置成功,返回1。 設置失敗,返回0
//SETNX
echo '<br><br>SETNX<br>';
$redis->EXISTS('job'); # job不存在 //bool(false);
$redis->SETNX('job', "programmer"); # job設置成功 //bool(true)
$redis->SETNX('job', "code-farmer"); # job設置失敗 //bool(false)
echo $redis->GET('job'); # 沒有被覆蓋 //"programmer"

設計模式(Design pattern): 將SETNX用于加鎖(locking)

SETNX可以用作加鎖原語(locking primitive)。比如說,要對關鍵字(key)foo加鎖,客戶端可以嘗試以下方式:

SETNX?lock.foo?<current?Unix?time?+?lock?timeout?+?1>

如果SETNX返回1,說明客戶端已經獲得了鎖,key設置的unix時間則指定了鎖失效的時間。之后客戶端可以通過DEL?lock.foo來釋放鎖。

如果SETNX返回0,說明key已經被其他客戶端上鎖了。如果鎖是非阻塞(non blocking lock)的,我們可以選擇返回調用,或者進入一個重試循環,直到成功獲得鎖或重試超時(timeout)。

處理死鎖(deadlock)

上面的鎖算法有一個問題:如果因為客戶端失敗、崩潰或其他原因導致沒有辦法釋放鎖的話,怎么辦?

這種狀況可以通過檢測發現——因為上鎖的key保存的是unix時間戳,假如key值的時間戳小于當前的時間戳,表示鎖已經不再有效。

但是,當有多個客戶端同時檢測一個鎖是否過期并嘗試釋放它的時候,我們不能簡單粗暴地刪除死鎖的key,再用SETNX上鎖,因為這時競爭條件(race condition)已經形成了:

  • C1和C2讀取lock.foo并檢查時間戳,SETNX都返回0,因為它已經被C3鎖上了,但C3在上鎖之后就崩潰(crashed)了。
  • C1向lock.foo發送DEL命令。
  • C1向lock.foo發送SETNX并成功。
  • C2向lock.foo發送DEL命令。
  • C2向lock.foo發送SETNX并成功。
  • 出錯:因為競爭條件的關系,C1和C2兩個都獲得了鎖。

幸好,以下算法可以避免以上問題。來看看我們聰明的C4客戶端怎么辦:

  • C4向lock.foo發送SETNX命令。
  • 因為崩潰掉的C3還鎖著lock.foo,所以Redis向C4返回0
  • C4向lock.foo發送GET命令,查看lock.foo的鎖是否過期。如果不,則休眠(sleep)一段時間,并在之后重試。
  • 另一方面,如果lock.foo內的unix時間戳比當前時間戳老,C4執行以下命令:

GETSET?lock.foo?<current?Unix?timestamp?+?lock?timeout?+?1>

  • 因為GETSET的作用,C4可以檢查看GETSET的返回值,確定lock.foo之前儲存的舊值仍是那個過期時間戳,如果是的話,那么C4獲得鎖。
  • 如果其他客戶端,比如C5,比C4更快地執行了GETSET操作并獲得鎖,那么C4的GETSET操作返回的就是一個未過期的時間戳(C5設置的時間戳)。C4只好從第一步開始重試。
注意,即便C4的GETSET操作對key進行了修改,這對未來也沒什么影響。 (這里是不是有點問題?C4的確是可以重試,但C5怎么辦?它的鎖的過期被C4修改了。——譯注)

?警告

為了讓這個加鎖算法更健壯,獲得鎖的客戶端應該常常檢查過期時間以免鎖因諸如DEL等命令的執行而被意外解開,因為客戶端失敗的情況非常復雜,不僅僅是崩潰這么簡單,還可能是客戶端因為某些操作被阻塞了相當長時間,緊接著DEL命令被嘗試執行(但這時鎖卻在另外的客戶端手上)。

SETEX SETEX key seconds value

將值value關聯到key,并將key的生存時間設為seconds(以秒為單位)。

如果key?已經存在,SETEX命令將覆寫舊值。

這個命令類似于以下兩個命令:

$redis->SET('key', 'value');
$redis->EXPIRE('key','seconds'); # 設置生存時間

不同之處是,SETEX是一個原子性(atomic)操作,關聯值和設置生存時間兩個動作會在同一時間內完成,該命令在Redis用作緩存時,非常實用。

時間復雜度:
O(1)
返回值:
設置成功時返回OK。 當seconds參數不合法時,返回一個錯誤。
# 情況1:key不存在
$redis->SETEX('cache_user_id', 60,10086);//bool(true)
echo $redis->GET('cache_user_id'); # 值 //"10086"

sleep(4);
echo $redis->TTL('cache_user_id'); # 剩余生存時間 //int(56)

# 情況2:key已經存在,key被覆寫
$redis->SET('cd', "timeless"); //bool(true);
$redis->SETEX('cd', 3000,"goodbye my love"); //bool(true);
echo $redis->GET('cd');//"goodbye my love"

?

SETRANGE

SETRANGE key offset value

value參數覆寫(Overwrite)給定key所儲存的字符串值,從偏移量offset開始。

不存在的key當作空白字符串處理。

SETRANGE命令會確保字符串足夠長以便將value設置在指定的偏移量上,如果給定key原來儲存的字符串長度比偏移量小(比如字符串只有5個字符長,但你設置的offset10),那么原字符和偏移量之間的空白將用零比特(zerobytes,"\x00")來填充。

注意你能使用的最大偏移量是2^29-1(536870911),因為Redis的字符串被限制在512兆(megabytes)內。如果你需要使用比這更大的空間,你得使用多個key

時間復雜度:
對小(small)的字符串,平攤復雜度O(1)。(關于什么字符串是”小”的,請參考APPEND命令) 否則為O(M),M為value參數的長度。
返回值:
被SETRANGE修改之后,字符串的長度。

?警告

?當生成一個很長的字符串時,Redis需要分配內存空間,該操作有時候可能會造成服務器阻塞(block)。在2010年的Macbook Pro上,設置偏移量為536870911(512MB內存分配),耗費約300毫秒, 設置偏移量為134217728(128MB內存分配),耗費約80毫秒,設置偏移量33554432(32MB內存分配),耗費約30毫秒,設置偏移量為8388608(8MB內存分配),耗費約8毫秒。 注意若首次內存分配成功之后,再對同一個key調用SETRANGE操作,無須再重新內存。

模式

因為有了SETRANGE和GETRANGE命令,你可以將Redis字符串用作具有O(1)隨機訪問時間的線性數組。這在很多真實用例中都是非常快速且高效的儲存方式。

# 情況1:對非空字符串進行SETRANGE
$redis->SET('greeting', "hello world");
$redis->SETRANGE('greeting', 6, "Redis"); //int(11)
$redis->GET('greeting');//"hello Redis"

# 情況2:對空字符串/不存在的key進行SETRANGE
$redis->EXISTS('empty_string');//bool(false)
$redis->SETRANGE('empty_string', 5 ,"Redis!"); # 對不存在的key使用SETRANGE //int(11)
var_dump($redis->GET('empty_string')); # 空白處被"\x00"填充 #"\x00\x00\x00\x00\x00Redis!" //return string(11) "Redis!"

MSET?
MSET key value [key value ...]

同時設置一個或多個key-value對。

當發現同名的key存在時,MSET會用新值覆蓋舊值,如果你不希望覆蓋同名key,請使用MSETNX命令。

MSET是一個原子性(atomic)操作,所有給定key都在同一時間內被設置,某些給定key被更新而另一些給定key沒有改變的情況,不可能發生。

時間復雜度:
O(N),N為要設置的key數量。
返回值:
總是返回OK(因為MSET不可能失敗)
#MSET
echo '<br><br>MSET<br>';
$redis->select(0);
$redis->flushdb();
$array_mset=array('date'=>'2012.3.5',
'time'=>'9.09a.m.',
'weather'=>'sunny'
);
$redis->MSET($array_mset); //bool(true)

var_dump($redis->KEYS('*')); # 確保指定的三個key-value對被插入 //array(3) { [0]=> string(4) "time" [1]=> string(7) "weather" [2]=> string(4) "date" }

# MSET覆蓋舊值的例子 但是經過測試覆蓋不了
var_dump($redis->SET('google', "google.cn")); //bool(true)
var_dump($redis->MSET('google',"google.hk")); //bool(false)
echo $redis->GET('google'); //google.cn 與redis手冊的示例結果不符

?

MSETNX

MSETNX key value [key value ...]

同時設置一個或多個key-value對,當且僅當key不存在。

即使只有一個key已存在,MSETNX也會拒絕所有傳入key的設置操作

MSETNX是原子性的,因此它可以用作設置多個不同key表示不同字段(field)的唯一性邏輯對象(unique logic object),所有字段要么全被設置,要么全不被設置。

時間復雜度:
O(N),N為要設置的key的數量。
返回值:
當所有key都成功設置,返回1。 如果所有key都設置失敗(最少有一個key已經存在),那么返回0
# 情況1:對不存在的key進行MSETNX
$array_mset=array('rmdbs'=>'MySQL',
'nosql'=>'MongoDB',
'key-value-store'=>'redis'
);
$redis->MSETNX($array_mset);//bool(true)


# 情況2:對已存在的key進行MSETNX
$array_mset=array('rmdbs'=>'Sqlite',
'language'=>'python'
);
var_dump($redis->MSETNX($array_mset)); # rmdbs鍵已經存在,操作失敗 //bool(false)
var_dump($redis->EXISTS('language')); # 因為操作是原子性的,language沒有被設置 bool(false)

echo $redis->GET('rmdbs'); # rmdbs沒有被修改 //"MySQL"

$array_mset_keys=array( 'rmdbs', 'nosql', 'key-value-store');
print_r($redis->MGET($array_mset_keys)); //Array ( [0] => MySQL [1] => MongoDB [2] => redis )

?

APPEND

APPEND key value

如果key已經存在并且是一個字符串,APPEND命令將value追加到key原來的值之后。

如果key不存在,APPEND就簡單地將給定key設為value,就像執行SET?key?value一樣。

時間復雜度:
平攤復雜度O(1)
返回值:
追加value之后,key中字符串的長度。
# 情況1:對不存在的key執行APPEND

$redis->EXISTS('myphone'); # 確保myphone不存在 //bool(false)
$redis->APPEND('myphone',"nokia"); # 對不存在的key進行APPEND,等同于SET myphone "nokia" //int(5) # 字符長度

# 情況2:對字符串進行APPEND
$redis->APPEND('myphone', " - 1110");# 長度從5個字符增加到12個字符 //int(12)

echo $redis->GET('myphone'); # 查看整個字符串 //"nokia - 1110"

GET

GET key

返回key所關聯的字符串值。

如果key不存在則返回特殊值nil

假如key儲存的值不是字符串類型,返回一個錯誤,因為GET只能用于處理字符串值。

時間復雜度:
O(1)
返回值:
key的值。 如果key不存在,返回nil

?

//GET
var_dump($redis->GET('fake_key')); #(nil) //return bool(false)
$redis->SET('animate', "anohana"); //return bool(true)
var_dump($redis->GET('animate')); //return string(7) "anohana"

?

MGET

MGET key [key ...]

返回所有(一個或多個)給定key的值。

如果某個指定key不存在,那么返回特殊值nil。因此,該命令永不失敗。

時間復雜度:
O(1)
返回值:
一個包含所有給定key的值的列表。
//MGET
echo '<br><br>MGET<br>';
$redis_mget_data_array=array('name'=>'ikodota','blog'=>'cnblogs.com/ikodota');
$redis->MSET($redis_mget_data_array);#用MSET一次儲存多個值

$redis_mget_key_array=array('name','blog');
var_dump($redis->MGET($redis_mget_key_array)); //array(2) { [0]=> string(7) "ikodota" [1]=> string(19) "cnblogs.com/ikodota" }

$redis->EXISTS('fake_key'); //bool(false)

$redis_mget_key_array=array('name','fake_key');
var_dump($redis->MGET($redis_mget_key_array)); # 當MGET中有不存在key的情況 //array(2) { [0]=> string(7) "ikodota" [1]=> bool(false) }

GETRANGE

GETRANGE key start end

返回key中字符串值的子字符串,字符串的截取范圍由startend兩個偏移量決定(包括startend在內)。

負數偏移量表示從字符串最后開始計數,-1表示最后一個字符,-2表示倒數第二個,以此類推。

GETRANGE通過保證子字符串的值域(range)不超過實際字符串的值域來處理超出范圍的值域請求。

時間復雜度:
O(N),N為要返回的字符串的長度。 復雜度最終由返回值長度決定,但因為從已有字符串中建立子字符串的操作非常廉價(cheap),所以對于長度不大的字符串,該操作的復雜度也可看作O(1)。
返回值:
截取得出的子字符串。

注解:在<=2.0的版本里,GETRANGE被叫作SUBSTR。

//GETRANGE
echo '<br><br>GETRANGE<br>';
$redis->SET('greeting', "hello, my friend");
echo $redis->GETRANGE('greeting', 0, 4).'<br>'; # 返回索引0-4的字符,包括4。 //"hello"
echo $redis->GETRANGE('greeting', -1 ,-5).'<br>'; # 不支持回繞操作 //""
echo $redis->GETRANGE('greeting', -3 ,-1).'<br>'; # 負數索引 //"end"
echo $redis->GETRANGE('greeting', 0, -1).'<br>'; # 從第一個到最后一個 //"hello, my friend"
echo $redis->GETRANGE('greeting', 0, 1008611).'<br>'; # 值域范圍不超過實際字符串,超過部分自動被符略 //"hello, my friend"

?

GETSET

GETSET key value

將給定key的值設為value,并返回key的舊值。

key存在但不是字符串類型時,返回一個錯誤。

時間復雜度:
O(1)
返回值:
返回給定key的舊值(old value)。 當key沒有舊值時,返回nil
//GETSET
echo '<br><br>GETSET<br>';
var_dump($redis->EXISTS('mail'));//return bool(false);
var_dump($redis->GETSET('mail','xxx@google.com')); # 因為mail之前不存在,沒有舊值,返回nil ,#(nil) //bool(false)

var_dump($redis->GETSET('mail','xxx@yahoo.com')); # mail被更新,舊值被返回 //string(14) "xxx@google.com"

設計模式

GETSET可以和INCR組合使用,實現一個有原子性(atomic)復位操作的計數器(counter)。

舉例來說,每次當某個事件發生時,進程可能對一個名為mycountkey調用INCR操作,通常我們還要在一個原子時間內同時完成獲得計數器的值和將計數器值復位為0兩個操作。

可以用命令GETSET?mycounter?0來實現這一目標。

$redis->SELECT(2);
echo $redis->INCR('mycount').'<br>'; #(integer) 11

if($redis->GET('mycount')>19){
echo $redis->GETSET('mycount', 0).'<br>'; # 一個原子內完成GET mycount和SET mycount 0操作 #"11"
}
echo $redis->GET('mycount'); #"0"

?

STRLEN

STRLEN key

返回key所儲存的字符串值的長度。

key儲存的不是字符串值時,返回一個錯誤。

復雜度:
O(1)
返回值:
字符串值的長度。 當?key不存在時,返回0
$redis->SET('mykey', "Hello world");
echo $redis->STRLEN('mykey'); //int(11)
echo $redis->STRLEN('nonexisting'); # 不存在的key長度視為0 //int(0)

INCR

INCR key

key中儲存的數字值增一。

如果key不存在,以0key的初始值,然后執行INCR操作。

如果值包含錯誤的類型,或字符串類型的值不能表示為數字,那么返回一個錯誤。

本操作的值限制在64位(bit)有符號數字表示之內。

時間復雜度:
O(1)
返回值:
執行INCR命令之后key的值。

注解:這是一個針對字符串的操作,因為Redis沒有專用的整數類型,所以key內儲存的字符串被解釋為十進制64位有符號整數來執行INCR操作。

$redis->SET('page_view', 20);
var_dump($redis->INCR('page_view')); //int(21)
var_dump($redis->GET('page_view')); # 數字值在Redis中以字符串的形式保存 //string(2) "21

INCRBY

INCRBY key increment

key所儲存的值加上增量increment

如果key不存在,以0key的初始值,然后執行INCRBY命令。

如果值包含錯誤的類型,或字符串類型的值不能表示為數字,那么返回一個錯誤。

本操作的值限制在64位(bit)有符號數字表示之內。

關于更多遞增(increment)/遞減(decrement)操作信息,參見INCR命令。

時間復雜度:
O(1)
返回值:
加上increment之后,key的值。
//INCRBY
echo '<br><br>INCRBY<br>';
# 情況1:key存在且是數字值
$redis->SET('rank', 50); # 設置rank為50
$redis->INCRBY('rank', 20); # 給rank加上20
var_dump($redis->GET('rank')); #"70" //string(2) "70"

# 情況2:key不存在
$redis->EXISTS('counter'); //bool(false)
$redis->INCRBY('counter'); #int 30 //bool(false)
var_dump($redis->GET('counter')); #30 //經測試 與手冊上結果不一樣,不能直接從bool型轉為int型。 return bool(false)

# 情況3:key不是數字值
$redis->SET('book', "long long ago...");
var_dump($redis->INCRBY('book', 200)); #(error) ERR value is not an integer or out of range // bool(false)

?

DECR

DECR key

key中儲存的數字值減一。

如果key不存在,以0key的初始值,然后執行DECR操作。

如果值包含錯誤的類型,或字符串類型的值不能表示為數字,那么返回一個錯誤。

本操作的值限制在64位(bit)有符號數字表示之內。

關于更多遞增(increment)/遞減(decrement)操作信息,參見INCR命令。

時間復雜度:
O(1)
返回值:
執行DECR命令之后key的值。
//DECR
$redis->SELECT(3);
$redis->flushdb();
echo '<br><br>DECR<br>';
# 情況1:對存在的數字值key進行DECR
$redis->SET('failure_times', 10);
$redis->DECR('failure_times'); //int(9)
echo $redis->GET('failure_times').'<br>'; //string(1) "9"

# 情況2:對不存在的key值進行DECR
$redis->EXISTS('count'); #(integer) 0 //bool(false)
$redis->DECR('count'); //int(-1)
echo $redis->GET('count').'<br>'; //string(2) "-1"

# 情況3:對存在但不是數值的key進行DECR
$redis->SET('company', 'YOUR_CODE_SUCKS.LLC');
var_dump($redis->DECR('company')); #(error) ERR value is not an integer or out of range //bool(false)
echo $redis->GET('company').'<br>'; //YOUR_CODE_SUCKS.LLC

?

DECRBY

DECRBY key decrement

key所儲存的值減去減量decrement

如果key不存在,以0key的初始值,然后執行DECRBY操作。

如果值包含錯誤的類型,或字符串類型的值不能表示為數字,那么返回一個錯誤。

本操作的值限制在64位(bit)有符號數字表示之內。

關于更多遞增(increment)/遞減(decrement)操作信息,參見INCR命令。

時間復雜度:
O(1)
返回值:
減去decrement之后,key的值。
# 情況1:對存在的數值key進行DECRBY
$redis->SET('count', 100);
var_dump($redis->DECRBY('count', 20)); //int(80)
var_dump($redis->GET('count')); //string(2) "80"

# 情況2:對不存在的key進行DECRBY
$redis->EXISTS('pages');#(integer) 0 //bool(false)
var_dump($redis->DECRBY('pages', 10)); //int(-10)
var_dump($redis->GET('pages')); //string(3) "-10"

?

SETBIT

SETBIT key offset value

key所儲存的字符串值,設置或清除指定偏移量上的位(bit)。

位的設置或清除取決于value參數,可以是0也可以是1

key不存在時,自動生成一個新的字符串值。

字符串會增長(grown)以確保它可以將value保存在指定的偏移量上。當字符串值增長時,空白位置以0填充。

offset參數必須大于或等于0,小于2^32(bit映射被限制在512MB內)。

時間復雜度:
O(1)
返回值:
指定偏移量原來儲存的位("0"或"1").

警告:對使用大的offset的SETBIT操作來說,內存分配可能造成Redis服務器被阻塞。具體參考SETRANGE命令,warning(警告)部分。

//SETBIT
echo '<br><br>SETBIT<br>';
$bit_val=67;
echo decbin($bit_val).'<br>'; //1000011
var_dump($redis->SETBIT('bit',1,1));//int(0) 空位上都是0
var_dump($redis->SETBIT('bit',2,0));//int(0)
var_dump($redis->SETBIT('bit',3,0));//int(0)
var_dump($redis->SETBIT('bit',4,0));//int(0)
var_dump($redis->SETBIT('bit',5,0));//int(0)
var_dump($redis->SETBIT('bit',6,1));//int(0)
var_dump($redis->SETBIT('bit',7,1));//int(0)

var_dump($redis->GET('bit')); //string(1) "C" ,二進制為:1000011 ,ASCII:67

var_dump($redis->GETBIT('bit', 6 )); //int(1) 取出第6位(從左到右)為“1”

var_dump($redis->SETBIT('bit',5,1));//int(0) 把第5位的0改為1
var_dump($redis->SETBIT('bit',6,0));//int(1) 把第6位的1改為0

var_dump($redis->GET('bit')); //string(1) "E ,二進制為:1000101,ASCII:69l



GETBIT

GETBIT key offset

key所儲存的字符串值,獲取指定偏移量上的位(bit)。

offset比字符串值的長度大,或者key不存在時,返回0

時間復雜度:
O(1)
返回值:
字符串值指定偏移量上的位(bit)。
#參見SETBIT的示例

?

哈希表(Hash)

HSET

HSET key field value

將哈希表key中的域field的值設為value

如果key不存在,一個新的哈希表被創建并進行HSET操作。

如果域field已經存在于哈希表中,舊值將被覆蓋。

時間復雜度:
O(1)
返回值:
如果field是哈希表中的一個新建域,并且值設置成功,返回1。 如果哈希表中域field已經存在且舊值已被新值覆蓋,返回0

?

HSETNX

HSETNX key field value

將哈希表key中的域field的值設置為value,當且僅當域field不存在。

若域field已經存在,該操作無效。

如果key不存在,一個新哈希表被創建并執行HSETNX命令。

時間復雜度:
O(1)
返回值:
設置成功,返回1。 如果給定域已經存在且沒有操作被執行,返回0

?

HMSET

HMSET key field value [field value ...]

同時將多個field?-?value(域-值)對設置到哈希表key中。

此命令會覆蓋哈希表中已存在的域。

如果key不存在,一個空哈希表被創建并執行HMSET操作。

時間復雜度:
O(N),Nfield?-?value對的數量。
返回值:
如果命令執行成功,返回OK。 當key不是哈希表(hash)類型時,返回一個錯誤。

?

?

HGET

HGET key field

返回哈希表key中給定域field的值。

時間復雜度:
O(1)
返回值:
給定域的值。 當給定域不存在或是給定key不存在時,返回nil

?

HMGET

HMGET key field [field ...]

返回哈希表key中,一個或多個給定域的值。

如果給定的域不存在于哈希表,那么返回一個nil值。

因為不存在的key被當作一個空哈希表來處理,所以對一個不存在的key進行HMGET操作將返回一個只帶有nil值的表。

時間復雜度:
O(N),N為給定域的數量。
返回值:
一個包含多個給定域的關聯值的表,表值的排列順序和給定域參數的請求順序一樣。

?

?

HGETALL

HGETALL key

返回哈希表key中,所有的域和值。

在返回值里,緊跟每個域名(field name)之后是域的值(value),所以返回值的長度是哈希表大小的兩倍。

時間復雜度:
O(N),N為哈希表的大小。
返回值:
以列表形式返回哈希表的域和域的值。 若key不存在,返回空列表。

?

?

HDEL

HDEL key field [field ...]

刪除哈希表key中的一個或多個指定域,不存在的域將被忽略。

時間復雜度:
O(N),N為要刪除的域的數量。
返回值:
被成功移除的域的數量,不包括被忽略的域。

注解:在Redis2.4以下的版本里,HDEL每次只能刪除單個域,如果你需要在一個原子時間內刪除多個域,請將命令包含在MULTI/?EXEC塊內。

?

HLEN

HLEN key

返回哈希表key中域的數量。

時間復雜度:
O(1)
返回值:
哈希表中域的數量。 當key不存在時,返回0

?

HEXISTS

HEXISTS key field

查看哈希表key中,給定域field是否存在。

時間復雜度:
O(1)
返回值:
如果哈希表含有給定域,返回1。 如果哈希表不含有給定域,或key不存在,返回0

?

HINCRBY

HINCRBY key field increment

為哈希表key中的域field的值加上增量increment

增量也可以為負數,相當于對給定域進行減法操作。

如果key不存在,一個新的哈希表被創建并執行HINCRBY命令。

如果域field不存在,那么在執行命令前,域的值被初始化為0

對一個儲存字符串值的域field執行HINCRBY命令將造成一個錯誤。

本操作的值限制在64位(bit)有符號數字表示之內。

時間復雜度:
O(1)
返回值:
執行HINCRBY命令之后,哈希表key中域field的值。

?

HKEYS

HKEYS key

返回哈希表key中的所有域。

時間復雜度:
O(N),N為哈希表的大小。
返回值:
一個包含哈希表中所有域的表。 當key不存在時,返回一個空表。

?

HVALS

HVALS key

返回哈希表key中的所有值。

時間復雜度:
O(N),N為哈希表的大小。
返回值:
一個包含哈希表中所有值的表。 當key不存在時,返回一個空表。

?

表(List)

頭元素和尾元素

頭元素指的是列表左端/前端第一個元素,尾元素指的是列表右端/后端第一個元素。

舉個例子,列表list包含三個元素:x,?y,?z,其中x是頭元素,而z則是尾元素。

空列表

指不包含任何元素的列表,Redis將不存在的key也視為空列表。

?

LPUSH

LPUSH key value [value ...]

將一個或多個值value插入到列表key的表頭。

如果有多個value值,那么各個value值按從左到右的順序依次插入到表頭:比如對一個空列表(mylist)執行LPUSH?mylist?a?b?c,則結果列表為c?b?a,等同于執行執行命令LPUSH?mylist?aLPUSH?mylist?bLPUSH?mylist?c

如果key不存在,一個空列表會被創建并執行LPUSH操作。

key存在但不是列表類型時,返回一個錯誤。

時間復雜度:
O(1)
返回值:
執行LPUSH命令后,列表的長度。

?

注解:在Redis 2.4版本以前的LPUSH命令,都只接受單個value值。

?

LPUSHX

LPUSHX key value

將值value插入到列表key的表頭,當且僅當key存在并且是一個列表。

和LPUSH命令相反,當key不存在時,LPUSHX命令什么也不做。

時間復雜度:
O(1)
返回值:
LPUSHX命令執行之后,表的長度。

?

RPUSH

RPUSH key value [value ...]

將一個或多個值value插入到列表key的表尾。

如果有多個value值,那么各個value值按從左到右的順序依次插入到表尾:比如對一個空列表(mylist)執行RPUSH?mylist?a?b?c,則結果列表為a?b?c,等同于執行命令RPUSHmylist?aRPUSH?mylist?bRPUSH?mylist?c

如果key不存在,一個空列表會被創建并執行RPUSH操作。

key存在但不是列表類型時,返回一個錯誤。

時間復雜度:
O(1)
返回值:
執行RPUSH操作后,表的長度。

注解:在Redis 2.4版本以前的RPUSH命令,都只接受單個value值。

?

RPUSHX

RPUSHX key value

將值value插入到列表key的表尾,當且僅當key存在并且是一個列表。

和RPUSH命令相反,當key不存在時,RPUSHX命令什么也不做。

時間復雜度:
O(1)
返回值:
RPUSHX命令執行之后,表的長度。

?

LPOP

LPOP key

移除并返回列表key的頭元素。

時間復雜度:
O(1)
返回值:
列表的頭元素。 當key不存在時,返回nil

?

RPOP

RPOP key

移除并返回列表key的尾元素。

時間復雜度:
O(1)
返回值:
列表的尾元素。 當key不存在時,返回nil

?

BLPOP

BLPOP key [key ...] timeout

BLPOP是列表的阻塞式(blocking)彈出原語。

它是LPOP命令的阻塞版本,當給定列表內沒有任何元素可供彈出的時候,連接將被BLPOP命令阻塞,直到等待超時或發現可彈出元素為止。

當給定多個key參數時,按參數key的先后順序依次檢查各個列表,彈出第一個非空列表的頭元素。

非阻塞行為

當BLPOP被調用時,如果給定key內至少有一個非空列表,那么彈出遇到的第一個非空列表的頭元素,并和被彈出元素所屬的列表的名字一起,組成結果返回給調用者。

當存在多個給定key時,BLPOP按給定key參數排列的先后順序,依次檢查各個列表。

假設現在有job、?commandrequest三個列表,其中job不存在,commandrequest都持有非空列表。考慮以下命令:

BLPOP?job?command?request?0

BLPOP保證返回的元素來自command,因為它是按”查找job?-> 查找command?-> 查找request“這樣的順序,第一個找到的非空列表。

?

?

阻塞行為

如果所有給定key都不存在或包含空列表,那么BLPOP命令將阻塞連接,直到等待超時,或有另一個客戶端對給定key的任意一個執行LPUSH或RPUSH命令為止。

超時參數timeout接受一個以秒為單位的數字作為值。超時參數設為0表示阻塞時間可以無限期延長(block indefinitely) 。

?

?

相同的key被多個客戶端同時阻塞

相同的key可以被多個客戶端同時阻塞。 不同的客戶端被放進一個隊列中,按”先阻塞先服務”(first-BLPOP,first-served)的順序為key執行BLPOP命令。

在MULTI/EXEC事務中的BLPOP

BLPOP可以用于流水線(pipline,批量地發送多個命令并讀入多個回復),但把它用在MULTI/EXEC塊當中沒有意義。因為這要求整個服務器被阻塞以保證塊執行時的原子性,該行為阻止了其他客戶端執行LPUSH或RPUSH命令。

因此,一個被包裹在MULTI/EXEC塊內的BLPOP命令,行為表現得就像LPOP一樣,對空列表返回nil,對非空列表彈出列表元素,不進行任何阻塞操作。

?

?

時間復雜度:O(1)返回值:

如果列表為空,返回一個nil。 反之,返回一個含有兩個元素的列表,第一個元素是被彈出元素所屬的key,第二個元素是被彈出元素的值。

?

?

BRPOP

BRPOP key [key ...] timeout

BRPOP是列表的阻塞式(blocking)彈出原語。

它是RPOP命令的阻塞版本,當給定列表內沒有任何元素可供彈出的時候,連接將被BRPOP命令阻塞,直到等待超時或發現可彈出元素為止。

當給定多個key參數時,按參數key的先后順序依次檢查各個列表,彈出第一個非空列表的尾部元素。

關于阻塞操作的更多信息,請查看BLPOP命令,BRPOP除了彈出元素的位置和BLPOP不同之外,其他表現一致。

時間復雜度:
O(1)
返回值:
假如在指定時間內沒有任何元素被彈出,則返回一個nil和等待時長。 反之,返回一個含有兩個元素的列表,第一個元素是被彈出元素所屬的key,第二個元素是被彈出元素的值。

?

LLEN

LLEN key

返回列表key的長度。

如果key不存在,則key被解釋為一個空列表,返回0.

如果key不是列表類型,返回一個錯誤。

時間復雜度:
O(1)
返回值:
列表key的長度。

?

LRANGE

LRANGE key start stop

返回列表key中指定區間內的元素,區間以偏移量startstop指定。

下標(index)參數startstop都以0為底,也就是說,以0表示列表的第一個元素,以1表示列表的第二個元素,以此類推。

你也可以使用負數下標,以-1表示列表的最后一個元素,-2表示列表的倒數第二個元素,以此類推。

注意LRANGE命令和編程語言區間函數的區別

假如你有一個包含一百個元素的列表,對該列表執行LRANGE?list?0?10,結果是一個包含11個元素的列表,這表明stop下標也在LRANGE命令的取值范圍之內(閉區間),這和某些語言的區間函數可能不一致,比如Ruby的Range.newArray#slice和Python的range()函數。

超出范圍的下標

超出范圍的下標值不會引起錯誤。

如果start下標比列表的最大下標end(LLEN?list減去1)還要大,或者start?>?stop,LRANGE返回一個空列表。

如果stop下標比end下標還要大,Redis將stop的值設置為end

時間復雜度:
O(S+N),S為偏移量startN為指定區間內元素的數量。
返回值:
一個列表,包含指定區間內的元素。

?

LREM

LREM key count value

根據參數count的值,移除列表中與參數value相等的元素。

count的值可以是以下幾種:
  • count?>?0: 從表頭開始向表尾搜索,移除與value相等的元素,數量為count
  • count?<?0: 從表尾開始向表頭搜索,移除與value相等的元素,數量為count的絕對值。
  • count?=?0: 移除表中所有與value相等的值。
時間復雜度:
O(N),N為列表的長度。
返回值:
被移除元素的數量。 因為不存在的key被視作空表(empty list),所以當key不存在時,LREM命令總是返回0

?

LSET

LSET key index value

將列表key下標為index的元素的值甚至為value

更多信息請參考LINDEX操作。

index參數超出范圍,或對一個空列表(key不存在)進行LSET時,返回一個錯誤。

時間復雜度:
對頭元素或尾元素進行LSET操作,復雜度為O(1)。 其他情況下,為O(N),N為列表的長度。
返回值:
操作成功返回ok,否則返回錯誤信息

?

LTRIM

LTRIM key start stop

對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。

舉個例子,執行命令LTRIM?list?0?2,表示只保留列表list的前三個元素,其余元素全部刪除。

下標(index)參數startstop都以0為底,也就是說,以0表示列表的第一個元素,以1表示列表的第二個元素,以此類推。

你也可以使用負數下標,以-1表示列表的最后一個元素,-2表示列表的倒數第二個元素,以此類推。

key不是列表類型時,返回一個錯誤。

LTRIM命令通常和LPUSH命令或RPUSH命令配合使用,舉個例子:

?

?

這個例子模擬了一個日志程序,每次將最新日志newest_log放到log列表中,并且只保留最新的100項。注意當這樣使用LTRIM命令時,時間復雜度是O(1),因為平均情況下,每次只有一個元素被移除。

注意LTRIM命令和編程語言區間函數的區別

假如你有一個包含一百個元素的列表list,對該列表執行LTRIM?list?0?10,結果是一個包含11個元素的列表,這表明stop下標也在LTRIM命令的取值范圍之內(閉區間),這和某些語言的區間函數可能不一致,比如Ruby的Range.newArray#slice和Python的range()函數。

超出范圍的下標

超出范圍的下標值不會引起錯誤。

如果start下標比列表的最大下標end(LLEN?list減去1)還要大,或者start?>?stop,LTRIM返回一個空列表(因為LTRIM已經將整個列表清空)。

如果stop下標比end下標還要大,Redis將stop的值設置為end

時間復雜度:
O(N),N為被移除的元素的數量。
返回值:
命令執行成功時,返回ok

?

?

LINDEX

LINDEX key index

返回列表key中,下標為index的元素。

下標(index)參數startstop都以0為底,也就是說,以0表示列表的第一個元素,以1表示列表的第二個元素,以此類推。

你也可以使用負數下標,以-1表示列表的最后一個元素,-2表示列表的倒數第二個元素,以此類推。

如果key不是列表類型,返回一個錯誤。

時間復雜度:
O(N),N為到達下標index過程中經過的元素數量。 因此,對列表的頭元素和尾元素執行LINDEX命令,復雜度為O(1)。
返回值:
列表中下標為index的元素。 如果index參數的值不在列表的區間范圍內(out of range),返回nil

?

LINSERT

LINSERT key BEFORE|AFTER pivot value

將值value插入到列表key當中,位于值pivot之前或之后。

pivot不存在于列表key時,不執行任何操作。

key不存在時,key被視為空列表,不執行任何操作。

如果key不是列表類型,返回一個錯誤。

時間復雜度:
O(N),N為尋找pivot過程中經過的元素數量。
返回值:
如果命令執行成功,返回插入操作完成之后,列表的長度。 如果沒有找到pivot,返回-1。 如果key不存在或為空列表,返回0

?

?

RPOPLPUSH

RPOPLPUSH source destination

命令RPOPLPUSH在一個原子時間內,執行以下兩個動作:

  • 將列表source中的最后一個元素(尾元素)彈出,并返回給客戶端。
  • source彈出的元素插入到列表destination,作為destination列表的的頭元素。

舉個例子,你有兩個列表sourcedestinationsource列表有元素a,?b,?cdestination列表有元素x,?y,?z,執行RPOPLPUSH?source?destination之后,source列表包含元素a,?bdestination列表包含元素c,?x,?y,?z?,并且元素c被返回。

如果source不存在,值nil被返回,并且不執行其他動作。

如果sourcedestination相同,則列表中的表尾元素被移動到表頭,并返回該元素,可以把這種特殊情況視作列表的旋轉(rotation)操作。

時間復雜度:
O(1)
返回值:
被彈出的元素。

?

設計模式: 一個安全的隊列

Redis的列表經常被用作隊列(queue),用于在不同程序之間有序地交換消息(message)。一個程序(稱之為生產者,producer)通過LPUSH命令將消息放入隊列中,而另一個程序(稱之為消費者,consumer)通過RPOP命令取出隊列中等待時間最長的消息。

不幸的是,在這個過程中,一個消費者可能在獲得一個消息之后崩潰,而未執行完成的消息也因此丟失。

使用RPOPLPUSH命令可以解決這個問題,因為它在返回一個消息之余,還將該消息添加到另一個列表當中,另外的這個列表可以用作消息的備份表:假如一切正常,當消費者完成該消息的處理之后,可以用LREM命令將該消息從備份表刪除。

另一方面,助手(helper)程序可以通過監視備份表,將超過一定處理時限的消息重新放入隊列中去(負責處理該消息的消費者可能已經崩潰),這樣就不會丟失任何消息了。

?

BRPOPLPUSH

BRPOPLPUSH source destination timeout

BRPOPLPUSH是RPOPLPUSH的阻塞版本,當給定列表source不為空時,BRPOPLPUSH的表現和RPOPLPUSH一樣。

當列表source為空時,BRPOPLPUSH命令將阻塞連接,直到等待超時,或有另一個客戶端對source執行LPUSH或RPUSH命令為止。

超時參數timeout接受一個以秒為單位的數字作為值。超時參數設為0表示阻塞時間可以無限期延長(block indefinitely) 。

更多相關信息,請參考RPOPLPUSH命令。

時間復雜度:
O(1)
返回值:
假如在指定時間內沒有任何元素被彈出,則返回一個nil和等待時長。 反之,返回一個含有兩個元素的列表,第一個元素是被彈出元素的值,第二個元素是等待時長。

?

?

集合(Set)

?附錄,常用集合運算:

? ?A = {'a', 'b', 'c'}
B = {'a', 'e', 'i', 'o', 'u'}

inter(x, y): 交集,在集合x和集合y中都存在的元素。 inter(A, B) = {'a'}union(x, y): 并集,在集合x中或集合y中的元素,如果一個元素在x和y中都出現,那只記錄一次即可。 union(A,B) = {'a', 'b', 'c', 'e', 'i', 'o', 'u'}diff(x, y): 差集,在集合x中而不在集合y中的元素。 diff(A,B) = {'b', 'c'}card(x): 基數,一個集合中元素的數量。 card(A) = 3空集: 基數為0的集合。

?

SADD

SADD key member [member ...]

將一個或多個member元素加入到集合key當中,已經存在于集合的member元素將被忽略。

假如key不存在,則創建一個只包含member元素作成員的集合。

key不是集合類型時,返回一個錯誤。

時間復雜度:
O(N),N是被添加的元素的數量。
返回值:
被添加到集合中的新元素的數量,不包括被忽略的元素。

注解:在Redis2.4版本以前,SADD只接受單個member值。

?

?

SREM

SREM key member [member ...]

移除集合key中的一個或多個member元素,不存在的member元素會被忽略。

key不是集合類型,返回一個錯誤。

時間復雜度:
O(N),N為給定member元素的數量。
返回值:
被成功移除的元素的數量,不包括被忽略的元素。

注解:在Redis2.4版本以前,SREM只接受單個member值。

?

?

SMEMBERS

SMEMBERS key

返回集合key中的所有成員。

時間復雜度:
O(N),N為集合的基數。
返回值:
集合中的所有成員。

?

?

SISMEMBER

SISMEMBER key member

判斷member元素是否是集合key的成員。

時間復雜度:
O(1)
返回值:
如果member元素是集合的成員,返回1。 如果member元素不是集合的成員,或key不存在,返回0

?

?

SCARD

SCARD key

返回集合key基數(集合中元素的數量)。

時間復雜度:
O(1)
返回值:
集合的基數。 當key不存在時,返回0

?

?

SMOVE

SMOVE source destination member

member元素從source集合移動到destination集合。

SMOVE是原子性操作。

如果source集合不存在或不包含指定的member元素,則SMOVE命令不執行任何操作,僅返回0。否則,member元素從source集合中被移除,并添加到destination集合中去。

destination集合已經包含member元素時,SMOVE命令只是簡單地將source集合中的member元素刪除。

sourcedestination不是集合類型時,返回一個錯誤。

時間復雜度:
O(1)
返回值:
如果member元素被成功移除,返回1。 如果member元素不是source集合的成員,并且沒有任何操作對destination集合執行,那么返回0

?

?

SPOP

SPOP key

移除并返回集合中的一個隨機元素。

時間復雜度:
O(1)
返回值:
被移除的隨機元素。 當key不存在或key是空集時,返回nil

?

?

也可以參考:如果只想獲取一個隨機元素,但不想該元素從集合中被移除的話,可以使用SRANDMEMBER命令。

?

SRANDMEMBER

SRANDMEMBER key

返回集合中的一個隨機元素。

該操作和SPOP相似,但SPOP將隨機元素從集合中移除并返回,而SRANDMEMBER則僅僅返回隨機元素,而不對集合進行任何改動。

時間復雜度:
O(1)
返回值:
被選中的隨機元素。 當key不存在或key是空集時,返回nil

?

?

SINTER

SINTER key [key ...]

返回一個集合的全部成員,該集合是所有給定集合的交集。

不存在的key被視為空集。

當給定集合當中有一個空集時,結果也為空集(根據集合運算定律)。

時間復雜度:
O(N * M),N為給定集合當中基數最小的集合,M為給定集合的個數。
返回值:
交集成員的列表。

?

?

SINTERSTORE

SINTERSTORE destination key [key ...]

此命令等同于SINTER,但它將結果保存到destination集合,而不是簡單地返回結果集。

如果destination集合已經存在,則將其覆蓋。

destination可以是key本身。

時間復雜度:
O(N * M),N為給定集合當中基數最小的集合,M為給定集合的個數。
返回值:
結果集中的成員數量。

?

?

SUNION

SUNION key [key ...]

返回一個集合的全部成員,該集合是所有給定集合的并集。

不存在的key被視為空集。

時間復雜度:
O(N),N是所有給定集合的成員數量之和。
返回值:
并集成員的列表。

?

?

SUNIONSTORE

SUNIONSTORE destination key [key ...]

此命令等同于SUNION,但它將結果保存到destination集合,而不是簡單地返回結果集。

如果destination已經存在,則將其覆蓋。

destination可以是key本身。

時間復雜度:
O(N),N是所有給定集合的成員數量之和。
返回值:
結果集中的元素數量。

?

?

SDIFF

SDIFF key [key ...]

返回一個集合的全部成員,該集合是所有給定集合的差集?。

不存在的key被視為空集。

時間復雜度:
O(N),N是所有給定集合的成員數量之和。
返回值:
交集成員的列表。

?

?

SDIFFSTORE

SDIFFSTORE destination key [key ...]

此命令等同于SDIFF,但它將結果保存到destination集合,而不是簡單地返回結果集。

如果destination集合已經存在,則將其覆蓋。

destination可以是key本身。

時間復雜度:
O(N),N是所有給定集合的成員數量之和。
返回值:
結果集中的元素數量。

?

?

有序集(Sorted Set)

ZADD

?

ZADD key score member [[score member] [score member] ...]

將一個或多個member元素及其score值加入到有序集key當中。

如果某個member已經是有序集的成員,那么更新這個memberscore值,并通過重新插入這個member元素,來保證該member在正確的位置上。

score值可以是整數值或雙精度浮點數。

如果key不存在,則創建一個空的有序集并執行ZADD操作。

key存在但不是有序集類型時,返回一個錯誤。

對有序集的更多介紹請參見sorted set。

時間復雜度:
O(M*log(N)),N是有序集的基數,M為成功添加的新成員的數量。
返回值:
被成功添加的新成員的數量,不包括那些被更新的、已經存在的成員。

?

?

注解:在Redis2.4版本以前,ZADD每次只能添加一個元素。

?

?

ZREM

ZREM key member [member ...]

移除有序集key中的一個或多個成員,不存在的成員將被忽略。

key存在但不是有序集類型時,返回一個錯誤。

時間復雜度:
O(M*log(N)),N為有序集的基數,M為被成功移除的成員的數量。
返回值:
被成功移除的成員的數量,不包括被忽略的成員。

注解:在Redis2.4版本以前,ZREM每次只能刪除一個元素。

?

?

ZCARD

ZCARD key

返回有序集key的基數。

時間復雜度:
O(1)
返回值:
key存在且是有序集類型時,返回有序集的基數。 當key不存在時,返回0

?

ZCOUNT

ZCOUNT key min max

返回有序集key中,score值在minmax之間(默認包括score值等于minmax)的成員。

關于參數minmax的詳細使用方法,請參考ZRANGEBYSCORE命令。

時間復雜度:
O(log(N)+M),N為有序集的基數,M為值在minmax之間的元素的數量。
返回值:
score值在minmax之間的成員的數量。

?

ZSCORE

ZSCORE key member

返回有序集key中,成員memberscore值。

如果member元素不是有序集key的成員,或key不存在,返回nil

時間復雜度:
O(1)
返回值:
member成員的score值,以字符串形式表示。

?

ZINCRBY

ZINCRBY key increment member

為有序集key的成員memberscore值加上增量increment

你也可以通過傳遞一個負數值increment,讓score減去相應的值,比如ZINCRBY?key?-5?member,就是讓memberscore值減去5

key不存在,或member不是key的成員時,ZINCRBY?key?increment?member等同于ZADD?key?increment?member

key不是有序集類型時,返回一個錯誤。

score值可以是整數值或雙精度浮點數。

時間復雜度:
O(log(N))
返回值:
member成員的新score值,以字符串形式表示。

?

?

ZRANGE

ZRANGE key start stop [WITHSCORES]

返回有序集key中,指定區間內的成員。

其中成員的位置按score值遞增(從小到大)來排序。

具有相同score值的成員按字典序(lexicographical order)來排列。

如果你需要成員按score值遞減(從大到小)來排列,請使用ZREVRANGE命令。

下標參數startstop都以0為底,也就是說,以0表示有序集第一個成員,以1表示有序集第二個成員,以此類推。 你也可以使用負數下標,以-1表示最后一個成員,-2表示倒數第二個成員,以此類推。 超出范圍的下標并不會引起錯誤。 比如說,當start的值比有序集的最大下標還要大,或是start?>?stop時,ZRANGE命令只是簡單地返回一個空列表。 另一方面,假如stop參數的值比有序集的最大下標還要大,那么Redis將stop當作最大下標來處理。 可以通過使用WITHSCORES選項,來讓成員和它的score值一并返回,返回列表以value1,score1,?...,?valueN,scoreN的格式表示。 客戶端庫可能會返回一些更復雜的數據類型,比如數組、元組等。 時間復雜度:
O(log(N)+M),N為有序集的基數,而M為結果集的基數。
返回值:
指定區間內,帶有score值(可選)的有序集成員的列表。

?

ZREVRANGE

ZREVRANGE key start stop [WITHSCORES]

返回有序集key中,指定區間內的成員。

其中成員的位置按score值遞減(從大到小)來排列。 具有相同score值的成員按字典序的反序(reverse lexicographical order)排列。

除了成員按score值遞減的次序排列這一點外,ZREVRANGE命令的其他方面和ZRANGE命令一樣。

時間復雜度:
O(log(N)+M),N為有序集的基數,而M為結果集的基數。
返回值:
指定區間內,帶有score值(可選)的有序集成員的列表。

?

?

ZRANGEBYSCORE

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

返回有序集key中,所有score值介于minmax之間(包括等于minmax)的成員。有序集成員按score值遞增(從小到大)次序排列。

具有相同score值的成員按字典序(lexicographical order)來排列(該屬性是有序集提供的,不需要額外的計算)。

可選的LIMIT參數指定返回結果的數量及區間(就像SQL中的SELECT?LIMIT?offset,?count),注意當offset很大時,定位offset的操作可能需要遍歷整個有序集,此過程最壞復雜度為O(N)時間。

可選的WITHSCORES參數決定結果集是單單返回有序集的成員,還是將有序集成員及其score值一起返回。 該選項自Redis 2.0版本起可用。

區間及無限

minmax可以是-inf+inf,這樣一來,你就可以在不知道有序集的最低和最高score值的情況下,使用ZRANGEBYSCORE這類命令。

默認情況下,區間的取值使用閉區間(小于等于或大于等于),你也可以通過給參數前增加(符號來使用可選的開區間(小于或大于)。

舉個例子:

?

返回所有符合條件1?<?score?<=?5的成員;

?

返回所有符合條件5?<?score?<?10的成員。

時間復雜度:
O(log(N)+M),N為有序集的基數,M為被結果集的基數。
返回值:
指定區間內,帶有score值(可選)的有序集成員的列表。

?

?

ZREVRANGEBYSCORE

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

返回有序集key中,score值介于maxmin之間(默認包括等于maxmin)的所有的成員。有序集成員按score值遞減(從大到小)的次序排列。

具有相同score值的成員按字典序的反序(reverse lexicographical order)排列。

除了成員按score值遞減的次序排列這一點外,ZREVRANGEBYSCORE命令的其他方面和ZRANGEBYSCORE命令一樣。

時間復雜度:
O(log(N)+M),N為有序集的基數,M為結果集的基數。
返回值:
指定區間內,帶有score值(可選)的有序集成員的列表。

?

?

ZRANK

ZRANK key member

返回有序集key中成員member的排名。其中有序集成員按score值遞增(從小到大)順序排列。

排名以0為底,也就是說,score值最小的成員排名為0

使用ZREVRANK命令可以獲得成員按score值遞減(從大到小)排列的排名。

時間復雜度:
O(log(N))
返回值:
如果member是有序集key的成員,返回member的排名。 如果member不是有序集key的成員,返回nil

?

ZREVRANK

ZREVRANK key member

返回有序集key中成員member的排名。其中有序集成員按score值遞減(從大到小)排序。

排名以0為底,也就是說,score值最大的成員排名為0

使用ZRANK命令可以獲得成員按score值遞增(從小到大)排列的排名。

時間復雜度:
O(log(N))
返回值:
如果member是有序集key的成員,返回member的排名。 如果member不是有序集key的成員,返回nil

?

?

ZREMRANGEBYRANK

ZREMRANGEBYRANK key start stop

移除有序集key中,指定排名(rank)區間內的所有成員。

區間分別以下標參數startstop指出,包含startstop在內。

下標參數startstop都以0為底,也就是說,以0表示有序集第一個成員,以1表示有序集第二個成員,以此類推。 你也可以使用負數下標,以-1表示最后一個成員,-2表示倒數第二個成員,以此類推。 時間復雜度:
O(log(N)+M),N為有序集的基數,而M為被移除成員的數量。
返回值:
被移除成員的數量。

?

?

ZREMRANGEBYSCORE

ZREMRANGEBYSCORE key min max

移除有序集key中,所有score值介于minmax之間(包括等于minmax)的成員。

自版本2.1.6開始,score值等于minmax的成員也可以不包括在內,詳情請參見ZRANGEBYSCORE命令。

時間復雜度:
O(log(N)+M),N為有序集的基數,而M為被移除成員的數量。
返回值:
被移除成員的數量。

?

?

ZINTERSTORE

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

計算給定的一個或多個有序集的交集,其中給定key的數量必須以numkeys參數指定,并將該交集(結果集)儲存到destination

默認情況下,結果集中某個成員的score值是所有給定集下該成員score值之和。

關于WEIGHTSAGGREGATE選項的描述,參見ZUNIONSTORE命令。

時間復雜度:
O(N*K)+O(M*log(M)),N為給定key中基數最小的有序集,K為給定有序集的數量,M為結果集的基數。
返回值:
保存到destination的結果集的基數。

?

?

ZUNIONSTORE

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

計算給定的一個或多個有序集的并集,其中給定key的數量必須以numkeys參數指定,并將該并集(結果集)儲存到destination

默認情況下,結果集中某個成員的score值是所有給定集下該成員score值之和。

WEIGHTS

使用WEIGHTS選項,你可以為每個給定有序集分別指定一個乘法因子(multiplication factor),每個給定有序集的所有成員的score值在傳遞給聚合函數(aggregation function)之前都要先乘以該有序集的因子。

如果沒有指定WEIGHTS選項,乘法因子默認設置為1

AGGREGATE

使用AGGREGATE選項,你可以指定并集的結果集的聚合方式。

默認使用的參數SUM,可以將所有集合中某個成員的score值之和作為結果集中該成員的score值;使用參數MIN,可以將所有集合中某個成員的最小score值作為結果集中該成員的score值;而參數MAX則是將所有集合中某個成員的最大score值作為結果集中該成員的score值。

時間復雜度:
O(N)+O(M log(M)),N為給定有序集基數的總和,M為結果集的基數。
返回值:
保存到destination的結果集的基數。

?

?

發布/訂閱(Pub/Sub)

PUBLISH

PUBLISH channel message

將信息?message?發送到指定的頻道?channel?。

時間復雜度:
O(N+M),其中?N?是頻道?channel?的訂閱者數量,而?M?則是使用模式訂閱(subscribed patterns)的客戶端的數量。
返回值:
接收到信息?message?的訂閱者數量。

?

?

SUBSCRIBE

SUBSCRIBE channel [channel ...]

訂閱給定頻道的信息。

時間復雜度:
O(N),其中?N?是訂閱的頻道的數量。
返回值:
接收到的信息(請參見下面的代碼說明)。

?

?

PSUBSCRIBE

PSUBSCRIBE pattern [pattern ...]

訂閱符合給定模式的頻道。

每個模式以?*?作為匹配符,比如?huangz*?匹配所有以?huangz?開頭的頻道(?huangzmsg?、?huangz-blog?、?huangz.tweets?等等),?news.*?匹配所有以?news.?開頭的頻道(news.it?、?news.global.today?等等),諸如此類。

時間復雜度:
O(N),?N?是訂閱的模式的數量。
返回值:
接收到的信息(請參見下面的代碼說明)。

?

?

UNSUBSCRIBE

警告:此命令在新版 Redis 中似乎已經被廢棄?

PUNSUBSCRIBE

警告:此命令在新版 Redis 中似乎已經被廢棄?

?

事務(Transaction)

WATCH

ATCH key [key ...]

監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷。

時間復雜度:
O(1)。
返回值:
總是返回?OK?。

?

UNWATCH

UNWATCH

取消?WATCH?命令對所有 key 的監視。

如果在執行?WATCH?命令之后,?EXEC?命令或?DISCARD?命令先被執行了的話,那么就不需要再執行?UNWATCH?了。

因為?EXEC?命令會執行事務,因此?WATCH?命令的效果已經產生了;而?DISCARD?命令在取消事務的同時也會取消所有對 key 的監視,因此這兩個命令執行之后,就沒有必要執行?UNWATCH?了。

時間復雜度:
O(1)
返回值:
總是?OK?。

?

MULTI

MULTI

標記一個事務塊的開始。

事務塊內的多條命令會按照先后順序被放進一個隊列當中,最后由?EXEC?命令在一個原子時間內執行。

時間復雜度:
O(1)。
返回值:
總是返回?OK?。

?

?

EXEC

EXEC

執行所有事務塊內的命令。

假如某個(或某些) key 正處于?WATCH?命令的監視之下,且事務塊中有和這個(或這些) key 相關的命令,那么?EXEC?命令只在這個(或這些) key 沒有被其他命令所改動的情況下執行并生效,否則該事務被打斷(abort)。

時間復雜度:
事務塊內所有命令的時間復雜度的總和。
返回值:
事務塊內所有命令的返回值,按命令執行的先后順序排列。 當操作被打斷時,返回空值?nil?。

?

?

DISCARD

DISCARD

取消事務,放棄執行事務塊內的所有命令。

如果正在使用?WATCH?命令監視某個(或某些) key ,那么取消所有監視,等同于執行命令?UNWATCH?。

時間復雜度:
O(1)。
返回值:
總是返回?OK?。

?

?

連接(Connection)

AUTH

AUTH password

通過設置配置文件中?requirepass?項的值(使用命令?CONFIG?SET?requirepass?password?),可以使用密碼來保護 Redis 服務器。

如果開啟了密碼保護的話,在每次連接 Redis 服務器之后,就要使用?AUTH?命令解鎖,解鎖之后才能使用其他 Redis 命令。

如果?AUTH?命令給定的密碼?password?和配置文件中的密碼相符的話,服務器會返回?OK?并開始接受命令輸入。

反之,如果密碼不匹配的話,服務器將返回一個錯誤,并要求客戶端需重新輸入密碼。

?

警告:因為 Redis 高性能的特點,在很短時間內嘗試猜測非常多個密碼是有可能的,因此請確保使用的密碼足夠復雜和足夠長,以免遭受密碼猜測攻擊。

時間復雜度:
O(1)
返回值:
密碼匹配時返回?OK?,否則返回一個錯誤。

?

PING

PING

客戶端向服務器發送一個?PING?,然后服務器返回客戶端一個?PONG?。

通常用于測試與服務器的連接是否仍然生效,或者用于測量延遲值。

時間復雜度:
O(1)
返回值:
PONG

?

?

SELECT

SELECT index

切換到指定的數據庫,數據庫索引號用數字值指定,以?0?作為起始索引值。

新的鏈接總是使用?0?號數據庫。

時間復雜度:
O(1)
返回值:
OK

?

ECHO

ECHO message

打印一個特定的信息?message?,測試時使用。

時間復雜度:
O(1)
返回值:
message?自身。

?

?

QUIT

QUIT

請求服務器關閉與當前客戶端的連接。

一旦所有等待中的回復(如果有的話)順利寫入到客戶端,連接就會被關閉。

時間復雜度:
O(1)
返回值:
總是返回?OK?(但是不會被打印顯示,因為當時 Redis-cli 已經退出)。

?

?

服務器(Server)

BGREWRITEAOF

BGREWRITEAOF

異步(Asynchronously)重寫 AOF 文件以反應當前數據庫的狀態。

即使?BGREWRITEAOF?命令執行失敗,舊 AOF 文件中的數據也不會因此丟失或改變。

時間復雜度:
O(N),?N?為要追加到 AOF 文件中的數據數量。
返回值:
反饋信息。

?

BGSAVE

在后臺異步保存當前數據庫的數據到磁盤。

BGSAVE?命令執行之后立即返回?OK?,然后 Redis fork出一個新子進程,原來的 Redis 進程(父進程)繼續處理客戶端請求,而子進程則負責將數據保存到磁盤,然后退出。

客戶端可以通過?LASTSAVE?命令查看相關信息,判斷?BGSAVE?命令是否執行成功。

時間復雜度:
O(N),?N?為要保存到數據庫中的 key 的數量。
返回值:
反饋信息。

?

SAVE

SAVE

同步保存當前數據庫的數據到磁盤。

時間復雜度:
O(N),?N?為要保存到數據庫中的 key 的數量。
返回值:
總是返回?OK?。

?

?

LASTSAVE

LASTSAVE

返回最近一次 Redis 成功執行保存操作的時間點(?SAVE?、?BGSAVE?等),以 UNIX 時間戳格式表示。

時間復雜度:
O(1)
返回值:
一個 UNIX 時間戳。

?

?

DBSIZE

DBSIZE

返回當前數據庫的 key 的數量。

時間復雜度:
O(1)
返回值:
當前數據庫的 key 的數量。

?

?

SLAVEOF

SLAVEOF host port

SLAVEOF?命令用于在 Redis 運行時動態地修改復制(replication)功能的行為。

通過執行?SLAVEOF?host?port?命令,可以將當前服務器轉變為指定服務器的從屬服務器(slave server)。

如果當前服務器已經是某個主服務器(master server)的從屬服務器,那么執行?SLAVEOF?host?port?將使當前服務器停止對舊主服務器的同步,丟棄舊數據集,轉而開始對新主服務器進行同步。

另外,對一個從屬服務器執行命令?SLAVEOF?NO?ONE?將使得這個從屬服務器關閉復制功能,并從從屬服務器轉變回主服務器,原來同步所得的數據集不會被丟棄。

利用“?SLAVEOF?NO?ONE?不會丟棄同步所得數據集”這個特性,可以在主服務器失敗的時候,將從屬服務器用作新的主服務器,從而實現無間斷運行。

時間復雜度:
SLAVEOF?host?port?,O(N),?N?為要同步的數據數量。 SLAVEOF?NO?ONE?, O(1) 。
返回值:
總是返回?OK?。

?

?

FLUSHALL

FLUSHALL

清空整個 Redis 服務器的數據(刪除所有數據庫的所有 key)。

此命令從不失敗。

時間復雜度:
尚未明確
返回值:
總是返回?OK?。

?

?

FLUSHDB

FLUSHDB

清空當前數據庫中的所有 key 。

此命令從不失敗。

時間復雜度:
O(1)
返回值:
總是返回?OK?。

?

?

SHUTDOWN

SHUTDOWN

SHUTDOWN?命令執行以下操作:

  • 停止所有客戶端
  • 如果有最少一個保存點在等待,執行?SAVE?命令
  • 如果 AOF 選項被打開,更新 AOF 文件
  • 服務器關閉

如果持久化被打開的話,?SHUTDOWN?命令會保證服務器正常關閉而不丟失任何數據。

假如只是單純地執行?SAVE?命令,然后再執行?QUIT?命令,則沒有這一保證 —— 因為在執行?SAVE?之后、執行?QUIT?之前的這段時間中間,其他客戶端可能正在和服務器進行通訊,這時如果執行?QUIT?就會造成數據丟失。

時間復雜度:
不明確
返回值:
執行失敗時返回錯誤。 執行成功時不返回任何信息,服務器和客戶端的連接斷開,客戶端自動退出。

?

?

SLOWLOG

SLOWLOG subcommand [argument]

什么是 SLOWLOG

Slow log 是 Redis 用來記錄查詢執行時間的日志系統。

查詢執行時間指的是不包括像客戶端響應(talking)、發送回復等 IO 操作,而單單是執行一個查詢命令所耗費的時間。

另外,slow log 保存在內存里面,讀寫速度非常快,因此你可以放心地使用它,不必擔心因為開啟 slow log 而損害 Redis 的速度。

設置 SLOWLOG

Slow log 的行為由兩個配置參數(configuration parameter)指定,可以通過改寫 redis.conf 文件或者用?CONFIG?GET?和?CONFIG?SET?命令對它們動態地進行修改。

第一個選項是?slowlog-log-slower-then?,它決定要對執行時間大于多少微秒(microsecond,1秒 = 1,000,000 微秒)的查詢進行記錄。

比如執行以下命令將讓 slow log 記錄所有查詢時間大于等于 100 微秒的查詢:

CONFIG?SET?slowlog-log-slower-then?100?,

而以下命令記錄所有查詢時間大于 1000 微秒的查詢:

CONFIG?SET?slowlog-log-slower-then?1000?。

另一個選項是?slowlog-max-len?,它決定 slow log?最多能保存多少條日志, slow log 本身是一個 LIFO 隊列,當隊列大小超過?slowlog-max-len?時,最舊的一條日志將被刪除,而最新的一條日志加入到 slow log ,以此類推。

以下命令讓 slow log 最多保存 1000 條日志:

CONFIG?SET?slowlog-max-len?1000?。

使用?CONFIG?GET?命令可以查詢兩個選項的當前值:

?

?

查看 slow log

要查看 slow log ,可以使用?SLOWLOG?GET?或者?SLOWLOG?GET?number?命令,前者打印所有 slow log ,最大長度取決于?slowlog-max-len?選項的值,而?SLOWLOG?GET?number?則只打印指定數量的日志。

最新的日志會最先被打印:

?

?

日志的唯一 id 只有在 Redis 服務器重啟的時候才會重置,這樣可以避免對日志的重復處理(比如你可能會想在每次發現新的慢查詢時發郵件通知你)。

查看當前日志的數量

使用命令?SLOWLOG?LEN?可以查看當前日志的數量。

請注意這個值和?slower-max-len?的區別,它們一個是當前日志的數量,一個是允許記錄的最大日志的數量。

?

清空日志

使用命令?SLOWLOG?RESET?可以清空 slow log 。

?

?

時間復雜度:O(1)

返回值:取決于不同命令,返回不同的值。

?

INFO

INFO

返回關于 Redis 服務器的各種信息和統計值。

時間復雜度:
O(1)
返回值:
具體請參見下面的測試代碼。

?

?

CONFIG GET

CONFIG GET parameter

CONFIG GET?命令用于取得運行中的 Redis 服務器的配置參數(configuration parameters),不過并非所有配置參數都被?CONFIG?GET?命令所支持。

CONFIG GET?接受單個參數?parameter?作為搜索關鍵字,查找所有匹配的配置參數,其中參數和值以“鍵-值對”(key-value pairs)的方式排列。

比如執行?CONFIG?GET?s*?命令,服務器就會返回所有以?s?開頭的配置參數及參數的值:

?

?

如果你只是尋找特定的某個參數的話,你當然也可以直接指定參數的名字:

?

使用命令?CONFIG?GET?*?,可以列出?CONFIG?GET?命令支持的所有參數:

?

所有被?CONFIG?SET?所支持的配置參數都可以在配置文件 redis.conf 中找到,不過?CONFIG?GET?和?CONFIG?SET?使用的格式和 redis.conf 文件所使用的格式有以下兩點不同:

  • 10kb?、?2gb?這些在配置文件中所使用的儲存單位縮寫,不可以用在?CONFIG?命令中,?CONFIG?SET?的值只能通過數字值顯式地設定。 像?CONFIG?SET?xxx?1k?這樣的命令是錯誤的,正確的格式是?CONFIG?SET?xxx?1000?。
  • save?選項在 redis.conf 中是用多行文字儲存的,但在?CONFIG?GET?命令中,它只打印一行文字。 以下是?save?選項在 redis.conf 文件中的表示: save?900?1 save?300?10 save?60?10000 但是?CONFIG?GET?命令的輸出只有一行: redis>?CONFIG?GET?save 1)?"save" 2)?"900?1?300?10?60?10000" 上面?save?參數的三個值表示:在 900 秒內最少有 1 個 key 被改動,或者 300 秒內最少有 10 個 key 被改動,又或者 60 秒內最少有 1000 個 key 被改動,以上三個條件隨便滿足一個,就觸發一次保存操作。
時間復雜度:
不明確
返回值:
給定配置參數的值。

?

CONFIG SET

CONFIG SET parameter value

CONFIG SET?命令可以動態地調整 Redis 服務器的配置(configuration)而無須重啟。

你可以使用它修改配置參數,或者改變 Redis 的持久化(Persistence)方式。

CONFIG SET?可以修改的配置參數可以使用命令?CONFIG?GET?*?來列出,所有被?CONFIG SET?修改的配置參數都會立即生效。

關于?CONFIG SET?命令的更多消息,請參見命令?CONFIG GET?的說明。

關于如何使用?CONFIG SET?命令修改 Redis 持久化方式,請參見?Redis Persistence?。

時間復雜度:
不明確
返回值:
當設置成功時返回?OK?,否則返回一個錯誤。

?

CONFIG RESETSTAT

CONFIG RESETSTAT

重置?INFO?命令中的某些統計數據,包括:

  • Keyspace hits (鍵空間命中次數)
  • Keyspace misses (鍵空間不命中次數)
  • Number of commands processed (執行命令的次數)
  • Number of connections received (連接服務器的次數)
  • Number of expired keys (過期key的數量)
時間復雜度:
O(1)
返回值:
總是返回?OK?。

?

DEBUG OBJECT

DEBUG OBJECT key

返回給定?key?的調試信息。

時間復雜度:
O(1)
返回值:
當?key?存在時,返回有關信息。 當?key?不存在時,返回一個錯誤。

?

DEBUG SEGFAULT

DEBUG SEGFAULT

令 Redis 服務器崩潰,調試用。

時間復雜度:
不明確
返回值:

?

MONITOR

MONITOR

實時打印出 Redis 服務器接收到的命令,調試用。

時間復雜度:
不明確
返回值:
總是返回?OK?。

?

SYNC

YNC

用于復制功能(replication)的內部命令。

時間復雜度:
不明確
返回值:
不明確

轉載于:https://www.cnblogs.com/zcy_soft/archive/2012/09/21/2697006.html

總結

以上是生活随笔為你收集整理的phpredis中文手册——《redis中文手册》 php版的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久这里只有精品视频9 | 免费无码一区二区三区蜜桃大 | 欧美日本日韩 | 精品国产乱码久久久久乱码 | 毛片内射-百度 | 久久综合激激的五月天 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 亚洲精品一区二区三区婷婷月 | 久久婷婷五月综合色国产香蕉 | 少妇高潮一区二区三区99 | 亚洲s色大片在线观看 | 欧美性黑人极品hd | 亚洲中文字幕无码一久久区 | 久久99精品久久久久久动态图 | 综合网日日天干夜夜久久 | 亚洲国产精品成人久久蜜臀 | 少妇的肉体aa片免费 | 久久精品中文字幕大胸 | 亚洲一区二区观看播放 | 国产69精品久久久久app下载 | 免费无码一区二区三区蜜桃大 | 无码人妻久久一区二区三区不卡 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 青青青手机频在线观看 | 奇米影视7777久久精品 | 久久久久国色av免费观看性色 | 麻豆国产人妻欲求不满谁演的 | 在线观看免费人成视频 | 88国产精品欧美一区二区三区 | 亚洲の无码国产の无码步美 | 激情爆乳一区二区三区 | 亚洲综合无码久久精品综合 | 少妇厨房愉情理9仑片视频 | 久久精品国产99久久6动漫 | 欧美人与禽zoz0性伦交 | 少妇激情av一区二区 | 人人爽人人爽人人片av亚洲 | 日本一区二区三区免费高清 | 久久精品国产日本波多野结衣 | 久久亚洲精品中文字幕无男同 | 黑人大群体交免费视频 | 99久久精品国产一区二区蜜芽 | √天堂中文官网8在线 | 欧美亚洲日韩国产人成在线播放 | 久9re热视频这里只有精品 | 妺妺窝人体色www在线小说 | 一本久道久久综合狠狠爱 | 丰满护士巨好爽好大乳 | 99精品久久毛片a片 | 成人片黄网站色大片免费观看 | 国产成人综合色在线观看网站 | 一二三四在线观看免费视频 | 国产成人无码区免费内射一片色欲 | 成熟女人特级毛片www免费 | 俄罗斯老熟妇色xxxx | 四虎永久在线精品免费网址 | av无码电影一区二区三区 | 久久久www成人免费毛片 | 欧美丰满老熟妇xxxxx性 | 成人精品视频一区二区 | 一本久道久久综合婷婷五月 | 欧美高清在线精品一区 | 暴力强奷在线播放无码 | 国产三级精品三级男人的天堂 | 中文字幕精品av一区二区五区 | 国产成人综合在线女婷五月99播放 | 国产xxx69麻豆国语对白 | 午夜福利不卡在线视频 | 欧美熟妇另类久久久久久多毛 | 少妇无套内谢久久久久 | 国产97人人超碰caoprom | 久久亚洲国产成人精品性色 | 亚洲综合无码久久精品综合 | 亚洲成a人片在线观看日本 | 久久精品国产日本波多野结衣 | 精品亚洲成av人在线观看 | 狂野欧美性猛xxxx乱大交 | 激情五月综合色婷婷一区二区 | 在线 国产 欧美 亚洲 天堂 | 国产一区二区三区精品视频 | 国产精品久久久久9999小说 | 麻豆av传媒蜜桃天美传媒 | 少妇性俱乐部纵欲狂欢电影 | 日韩人妻系列无码专区 | 国产亚洲精品久久久久久国模美 | 亚洲欧美日韩国产精品一区二区 | 国产97色在线 | 免 | 成人一区二区免费视频 | 亚洲一区二区三区国产精华液 | 免费无码一区二区三区蜜桃大 | 麻豆蜜桃av蜜臀av色欲av | 国产在线aaa片一区二区99 | 国产精品久久久久影院嫩草 | 国产成人无码av片在线观看不卡 | 青春草在线视频免费观看 | 人妻体内射精一区二区三四 | av无码久久久久不卡免费网站 | 亚洲中文字幕av在天堂 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 狠狠噜狠狠狠狠丁香五月 | 亚洲日本一区二区三区在线 | 国产69精品久久久久app下载 | 亚洲午夜无码久久 | 日韩精品a片一区二区三区妖精 | 亚洲综合在线一区二区三区 | 国产精华av午夜在线观看 | 久久国产劲爆∧v内射 | 精品国精品国产自在久国产87 | 性生交大片免费看l | 国产成人无码av一区二区 | 国产精品无码成人午夜电影 | 国产精品爱久久久久久久 | 亚洲日本在线电影 | 亚洲精品久久久久中文第一幕 | 99久久久国产精品无码免费 | 夫妻免费无码v看片 | 国产三级久久久精品麻豆三级 | 在线а√天堂中文官网 | 亚拍精品一区二区三区探花 | 精品无码一区二区三区爱欲 | 国产成人无码av一区二区 | 亚洲人成网站在线播放942 | 无码一区二区三区在线观看 | 麻豆精品国产精华精华液好用吗 | 小sao货水好多真紧h无码视频 | 国产特级毛片aaaaaa高潮流水 | 国产精品欧美成人 | 国产精品欧美成人 | 中文字幕无码免费久久9一区9 | 老子影院午夜精品无码 | 久久久久久久久888 | 牲欲强的熟妇农村老妇女视频 | 97色伦图片97综合影院 | 久久国产精品精品国产色婷婷 | 精品久久久久久人妻无码中文字幕 | 大胆欧美熟妇xx | 亚洲 激情 小说 另类 欧美 | 男女猛烈xx00免费视频试看 | 九九在线中文字幕无码 | 人妻夜夜爽天天爽三区 | 内射白嫩少妇超碰 | 野狼第一精品社区 | 无码人妻久久一区二区三区不卡 | 亚洲区欧美区综合区自拍区 | aⅴ在线视频男人的天堂 | 成 人影片 免费观看 | 国内揄拍国内精品少妇国语 | 久久国内精品自在自线 | 日韩无套无码精品 | 宝宝好涨水快流出来免费视频 | 欧美性生交xxxxx久久久 | 午夜理论片yy44880影院 | 国产精品久久久久无码av色戒 | 精品一区二区不卡无码av | 日韩av无码一区二区三区不卡 | 一本无码人妻在中文字幕免费 | 亚洲国产精品成人久久蜜臀 | 色婷婷久久一区二区三区麻豆 | 天海翼激烈高潮到腰振不止 | 亚洲人成网站免费播放 | 国精品人妻无码一区二区三区蜜柚 | 国产麻豆精品精东影业av网站 | 色一情一乱一伦 | 丝袜 中出 制服 人妻 美腿 | 国产九九九九九九九a片 | 午夜性刺激在线视频免费 | 中文字幕+乱码+中文字幕一区 | 国产精品人妻一区二区三区四 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 国产人妻精品一区二区三区 | 国产精品高潮呻吟av久久4虎 | 精品少妇爆乳无码av无码专区 | 日韩人妻无码中文字幕视频 | 成熟人妻av无码专区 | 爆乳一区二区三区无码 | 熟妇人妻无码xxx视频 | 国产9 9在线 | 中文 | 四虎影视成人永久免费观看视频 | 亚洲精品国产品国语在线观看 | 午夜免费福利小电影 | 荫蒂被男人添的好舒服爽免费视频 | 国产两女互慰高潮视频在线观看 | 自拍偷自拍亚洲精品10p | 狂野欧美性猛交免费视频 | 鲁大师影院在线观看 | 国产精品久久久久9999小说 | 少妇性荡欲午夜性开放视频剧场 | 国产电影无码午夜在线播放 | 国产精品久久久久久亚洲影视内衣 | 午夜理论片yy44880影院 | 无码免费一区二区三区 | 中文字幕无线码 | 国产福利视频一区二区 | 国产精品国产自线拍免费软件 | 无码乱肉视频免费大全合集 | 未满小14洗澡无码视频网站 | 色一情一乱一伦一视频免费看 | 激情爆乳一区二区三区 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 国产艳妇av在线观看果冻传媒 | 国产一区二区三区四区五区加勒比 | 高中生自慰www网站 | 久久精品国产精品国产精品污 | 久久亚洲中文字幕无码 | 人妻中文无码久热丝袜 | 熟妇人妻激情偷爽文 | 男人的天堂av网站 | 久久久亚洲欧洲日产国码αv | 少妇激情av一区二区 | 欧美成人家庭影院 | 女人被男人爽到呻吟的视频 | 领导边摸边吃奶边做爽在线观看 | 久久精品国产一区二区三区肥胖 | 狂野欧美性猛xxxx乱大交 | 日日摸日日碰夜夜爽av | 亚洲经典千人经典日产 | 内射老妇bbwx0c0ck | 国产亚洲精品久久久久久大师 | 99久久精品日本一区二区免费 | 亚洲国产精品久久久天堂 | 在线精品国产一区二区三区 | 国产香蕉尹人综合在线观看 | 日韩少妇白浆无码系列 | 性色欲情网站iwww九文堂 | 日产精品99久久久久久 | 国产69精品久久久久app下载 | 亚洲欧美国产精品专区久久 | 色一情一乱一伦一视频免费看 | 日日摸夜夜摸狠狠摸婷婷 | 久久99精品国产麻豆 | 中文字幕日韩精品一区二区三区 | 又大又硬又爽免费视频 | 精品国产aⅴ无码一区二区 | 高潮毛片无遮挡高清免费 | 国产人妻精品一区二区三区不卡 | 午夜性刺激在线视频免费 | 鲁一鲁av2019在线 | 成人免费无码大片a毛片 | 日韩成人一区二区三区在线观看 | 人人妻人人藻人人爽欧美一区 | 67194成是人免费无码 | 免费观看的无遮挡av | 一本色道久久综合亚洲精品不卡 | 中文字幕乱码中文乱码51精品 | 在线观看国产一区二区三区 | 九九在线中文字幕无码 | 久久精品无码一区二区三区 | 一区二区三区乱码在线 | 欧洲 | 熟女少妇在线视频播放 | 国产精品高潮呻吟av久久 | 亚洲aⅴ无码成人网站国产app | 色诱久久久久综合网ywww | 99麻豆久久久国产精品免费 | 久久国产劲爆∧v内射 | 最近免费中文字幕中文高清百度 | 日本大香伊一区二区三区 | 欧美精品国产综合久久 | 永久免费观看美女裸体的网站 | 日韩无码专区 | 久久久久久九九精品久 | 国内丰满熟女出轨videos | 日日麻批免费40分钟无码 | 99在线 | 亚洲 | 99麻豆久久久国产精品免费 | 人妻熟女一区 | 色综合久久中文娱乐网 | 伊人久久婷婷五月综合97色 | 久久久中文久久久无码 | 亚洲 另类 在线 欧美 制服 | 中文字幕无码视频专区 | 国产69精品久久久久app下载 | 色偷偷人人澡人人爽人人模 | 乌克兰少妇性做爰 | 性欧美疯狂xxxxbbbb | 国产综合久久久久鬼色 | 麻豆精品国产精华精华液好用吗 | 中文字幕色婷婷在线视频 | 精品无码国产自产拍在线观看蜜 | 狠狠色噜噜狠狠狠7777奇米 | 国产手机在线αⅴ片无码观看 | 午夜不卡av免费 一本久久a久久精品vr综合 | 国产肉丝袜在线观看 | 日本大香伊一区二区三区 | 天堂一区人妻无码 | 久久亚洲日韩精品一区二区三区 | 国产激情艳情在线看视频 | 亚洲国产av美女网站 | 97无码免费人妻超级碰碰夜夜 | 宝宝好涨水快流出来免费视频 | 国精产品一区二区三区 | 成人性做爰aaa片免费看 | 日本丰满护士爆乳xxxx | 丰满少妇熟乱xxxxx视频 | 美女黄网站人色视频免费国产 | 无套内射视频囯产 | 在线观看免费人成视频 | 日本护士毛茸茸高潮 | 亚洲精品国产品国语在线观看 | 欧美老熟妇乱xxxxx | 大乳丰满人妻中文字幕日本 | 97精品国产97久久久久久免费 | 麻豆精品国产精华精华液好用吗 | 思思久久99热只有频精品66 | 最新国产麻豆aⅴ精品无码 | 性生交大片免费看女人按摩摩 | 人人妻人人澡人人爽精品欧美 | 在线看片无码永久免费视频 | 青草青草久热国产精品 | 国产精品久久国产三级国 | 久久精品国产日本波多野结衣 | 色老头在线一区二区三区 | 日本www一道久久久免费榴莲 | 岛国片人妻三上悠亚 | av人摸人人人澡人人超碰下载 | 国内精品人妻无码久久久影院 | 人妻少妇精品无码专区二区 | 亚洲精品久久久久中文第一幕 | 性欧美牲交在线视频 | 久久亚洲精品中文字幕无男同 | 亚洲 欧美 激情 小说 另类 | 久热国产vs视频在线观看 | 国产精华av午夜在线观看 | 中文字幕无码视频专区 | 国产亲子乱弄免费视频 | 免费无码一区二区三区蜜桃大 | 青春草在线视频免费观看 | 欧美大屁股xxxxhd黑色 | 久久亚洲精品中文字幕无男同 | 亚洲精品一区二区三区大桥未久 | 水蜜桃亚洲一二三四在线 | 精品国产国产综合精品 | 内射爽无广熟女亚洲 | 婷婷五月综合缴情在线视频 | 精品人妻人人做人人爽 | 欧美日韩人成综合在线播放 | 欧美日韩人成综合在线播放 | 暴力强奷在线播放无码 | √天堂资源地址中文在线 | 国产无套内射久久久国产 | 久久久久99精品国产片 | 国内精品久久久久久中文字幕 | 亚洲の无码国产の无码步美 | 色五月五月丁香亚洲综合网 | 老太婆性杂交欧美肥老太 | 亚洲大尺度无码无码专区 | 人妻无码久久精品人妻 | 六十路熟妇乱子伦 | 国产人妻久久精品二区三区老狼 | 99久久精品国产一区二区蜜芽 | 中文精品久久久久人妻不卡 | 极品尤物被啪到呻吟喷水 | 男女猛烈xx00免费视频试看 | 亚洲精品午夜无码电影网 | 久久www免费人成人片 | 亚洲自偷自拍另类第1页 | 久久久久成人片免费观看蜜芽 | 少女韩国电视剧在线观看完整 | 熟女俱乐部五十路六十路av | 黑人巨大精品欧美一区二区 | 国产在线精品一区二区三区直播 | 麻豆果冻传媒2021精品传媒一区下载 | 国产无遮挡又黄又爽又色 | 国产无套粉嫩白浆在线 | 好男人社区资源 | 免费人成在线视频无码 | 日本丰满护士爆乳xxxx | 日韩av无码一区二区三区不卡 | 久久久久久九九精品久 | 蜜桃视频插满18在线观看 | 亚洲第一无码av无码专区 | 成人欧美一区二区三区 | 噜噜噜亚洲色成人网站 | 久久亚洲中文字幕精品一区 | 亚洲日韩精品欧美一区二区 | 亚洲男女内射在线播放 | 国产免费久久久久久无码 | 欧美老妇交乱视频在线观看 | 午夜福利一区二区三区在线观看 | 亚洲精品国产精品乱码视色 | 欧美激情一区二区三区成人 | 疯狂三人交性欧美 | 精品国产一区二区三区四区在线看 | 亚洲国产综合无码一区 | 亚洲欧洲日本无在线码 | 亚洲中文字幕va福利 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 中文字幕人妻无码一区二区三区 | 在线a亚洲视频播放在线观看 | 大色综合色综合网站 | 丰满少妇熟乱xxxxx视频 | 暴力强奷在线播放无码 | 精品 日韩 国产 欧美 视频 | 特大黑人娇小亚洲女 | 内射巨臀欧美在线视频 | 亚洲自偷精品视频自拍 | 女人被爽到呻吟gif动态图视看 | 好爽又高潮了毛片免费下载 | 亚洲午夜久久久影院 | 国产九九九九九九九a片 | 水蜜桃亚洲一二三四在线 | 少妇人妻大乳在线视频 | 亚洲一区二区三区播放 | 国产性生大片免费观看性 | 国产人妻人伦精品 | 中国女人内谢69xxxxxa片 | 国产午夜精品一区二区三区嫩草 | 300部国产真实乱 | 中文字幕无码视频专区 | 国产精品亚洲一区二区三区喷水 | 国产又粗又硬又大爽黄老大爷视 | аⅴ资源天堂资源库在线 | 人人妻人人澡人人爽精品欧美 | 天堂а√在线中文在线 | 日韩人妻少妇一区二区三区 | 国产精品国产自线拍免费软件 | 亚洲中文字幕无码中文字在线 | 国产精品高潮呻吟av久久4虎 | 国产sm调教视频在线观看 | 亚洲热妇无码av在线播放 | 国产成人人人97超碰超爽8 | 欧美freesex黑人又粗又大 | 牲欲强的熟妇农村老妇女视频 | 亚洲男人av天堂午夜在 | 日本高清一区免费中文视频 | 亚洲成av人片天堂网无码】 | 日本又色又爽又黄的a片18禁 | 一本大道久久东京热无码av | 亚洲中文字幕无码一久久区 | 精品水蜜桃久久久久久久 | 欧美日韩精品 | 无遮挡国产高潮视频免费观看 | 日韩精品无码免费一区二区三区 | 欧美性色19p | 亚洲 激情 小说 另类 欧美 | 婷婷五月综合激情中文字幕 | 内射后入在线观看一区 | 熟妇人妻激情偷爽文 | 兔费看少妇性l交大片免费 | 夜夜高潮次次欢爽av女 | 国产成人无码一二三区视频 | 日韩av无码一区二区三区不卡 | 性欧美videos高清精品 | 18精品久久久无码午夜福利 | 强辱丰满人妻hd中文字幕 | 99久久精品无码一区二区毛片 | 国模大胆一区二区三区 | 天堂无码人妻精品一区二区三区 | 色 综合 欧美 亚洲 国产 | 麻花豆传媒剧国产免费mv在线 | 国产特级毛片aaaaaaa高清 | 一个人免费观看的www视频 | 99久久无码一区人妻 | 人妻中文无码久热丝袜 | 亚洲欧洲日本综合aⅴ在线 | 牲欲强的熟妇农村老妇女 | 国产成人无码a区在线观看视频app | 精品一二三区久久aaa片 | 少女韩国电视剧在线观看完整 | 欧美国产日产一区二区 | 99久久久无码国产精品免费 | 国产亚洲精品久久久久久久 | 久久久无码中文字幕久... | 999久久久国产精品消防器材 | 中文字幕av日韩精品一区二区 | 久久人人97超碰a片精品 | 黑人大群体交免费视频 | 色一情一乱一伦一视频免费看 | 亚洲精品久久久久久一区二区 | 人妻人人添人妻人人爱 | 大屁股大乳丰满人妻 | 亚洲中文字幕久久无码 | 国产成人人人97超碰超爽8 | 又大又硬又爽免费视频 | 亚洲国产精品无码一区二区三区 | 亚洲中文无码av永久不收费 | 人人妻在人人 | 丰满肥臀大屁股熟妇激情视频 | 超碰97人人做人人爱少妇 | 特级做a爰片毛片免费69 | 久久99精品久久久久久 | 日日麻批免费40分钟无码 | 粉嫩少妇内射浓精videos | 99视频精品全部免费免费观看 | 樱花草在线社区www | 免费播放一区二区三区 | 一本久道久久综合狠狠爱 | 国产在线精品一区二区三区直播 | 国精产品一区二区三区 | 99久久婷婷国产综合精品青草免费 | 男人的天堂av网站 | 国产精品成人av在线观看 | 在线欧美精品一区二区三区 | 久久www免费人成人片 | 无码帝国www无码专区色综合 | 老熟妇仑乱视频一区二区 | 久久伊人色av天堂九九小黄鸭 | a在线亚洲男人的天堂 | 国产精品久久国产精品99 | 午夜福利试看120秒体验区 | 熟妇人妻中文av无码 | 日韩欧美中文字幕公布 | 久久久久99精品成人片 | 亚洲无人区午夜福利码高清完整版 | 啦啦啦www在线观看免费视频 | 日本一本二本三区免费 | 网友自拍区视频精品 | 久久亚洲国产成人精品性色 | 亚洲の无码国产の无码步美 | 九月婷婷人人澡人人添人人爽 | 亚洲国精产品一二二线 | av在线亚洲欧洲日产一区二区 | 色综合视频一区二区三区 | 最新版天堂资源中文官网 | 国产精品va在线播放 | 蜜桃视频韩日免费播放 | 午夜不卡av免费 一本久久a久久精品vr综合 | 欧美 亚洲 国产 另类 | 无码av免费一区二区三区试看 | 永久免费观看国产裸体美女 | 国产va免费精品观看 | 人人超人人超碰超国产 | 免费视频欧美无人区码 | 无码帝国www无码专区色综合 | 强开小婷嫩苞又嫩又紧视频 | 欧美一区二区三区 | 亚洲天堂2017无码中文 | 国产精品久久久午夜夜伦鲁鲁 | 亚洲а∨天堂久久精品2021 | 国产成人午夜福利在线播放 | 秋霞特色aa大片 | 精品人妻人人做人人爽 | 红桃av一区二区三区在线无码av | 白嫩日本少妇做爰 | 亚洲成在人网站无码天堂 | 在教室伦流澡到高潮hnp视频 | 内射爽无广熟女亚洲 | 成年美女黄网站色大免费全看 | 亚洲色欲色欲天天天www | 欧美 日韩 人妻 高清 中文 | 熟妇人妻无乱码中文字幕 | 无码人中文字幕 | 精品久久久久香蕉网 | 国产办公室秘书无码精品99 | 午夜精品一区二区三区在线观看 | 国产激情精品一区二区三区 | 亚洲国产精品一区二区第一页 | 久久精品国产一区二区三区 | 国产人妻精品一区二区三区不卡 | 中文字幕av无码一区二区三区电影 | 色五月丁香五月综合五月 | 狠狠色欧美亚洲狠狠色www | 欧美性生交活xxxxxdddd | 超碰97人人做人人爱少妇 | 久久熟妇人妻午夜寂寞影院 | 无码一区二区三区在线观看 | 国产精品亚洲五月天高清 | 少妇被黑人到高潮喷出白浆 | 亚洲综合在线一区二区三区 | 四十如虎的丰满熟妇啪啪 | 精品一区二区三区波多野结衣 | 国产精品二区一区二区aⅴ污介绍 | 国产综合久久久久鬼色 | 高潮毛片无遮挡高清免费视频 | 内射巨臀欧美在线视频 | 中国大陆精品视频xxxx | 伊人久久大香线蕉亚洲 | 久久天天躁夜夜躁狠狠 | 99久久婷婷国产综合精品青草免费 | 一本色道婷婷久久欧美 | 麻花豆传媒剧国产免费mv在线 | 成在人线av无码免费 | 成人无码精品1区2区3区免费看 | 亚洲日韩精品欧美一区二区 | 久久婷婷五月综合色国产香蕉 | 国产亚洲欧美日韩亚洲中文色 | 国产精品亚洲一区二区三区喷水 | 性做久久久久久久久 | 动漫av网站免费观看 | 国内少妇偷人精品视频免费 | 国产深夜福利视频在线 | 波多野结衣aⅴ在线 | 在线观看国产一区二区三区 | 成人欧美一区二区三区黑人免费 | 亚洲国精产品一二二线 | 欧美精品免费观看二区 | 理论片87福利理论电影 | 国产免费久久精品国产传媒 | 国产综合在线观看 | 久久精品成人欧美大片 | 精品久久久久香蕉网 | 无遮挡啪啪摇乳动态图 | 一本久久a久久精品vr综合 | 国产欧美精品一区二区三区 | 一二三四社区在线中文视频 | 少妇性俱乐部纵欲狂欢电影 | av无码电影一区二区三区 | 欧美肥老太牲交大战 | 扒开双腿疯狂进出爽爽爽视频 | 日韩视频 中文字幕 视频一区 | 老熟妇仑乱视频一区二区 | 在线天堂新版最新版在线8 | 国产明星裸体无码xxxx视频 | 日日摸夜夜摸狠狠摸婷婷 | 国产两女互慰高潮视频在线观看 | 欧美亚洲国产一区二区三区 | 国产黑色丝袜在线播放 | 少妇无套内谢久久久久 | 久久人人爽人人爽人人片av高清 | 欧美性猛交内射兽交老熟妇 | 丰满人妻翻云覆雨呻吟视频 | 国产精品va在线观看无码 | 国产精品久久久久久无码 | 欧美 日韩 亚洲 在线 | 国产成人亚洲综合无码 | 中文字幕无线码 | 精品aⅴ一区二区三区 | 无码成人精品区在线观看 | 国内揄拍国内精品少妇国语 | 动漫av一区二区在线观看 | 亚洲色无码一区二区三区 | 麻豆av传媒蜜桃天美传媒 | 欧美性猛交xxxx富婆 | 麻豆成人精品国产免费 | 国产在线一区二区三区四区五区 | 久久久久成人精品免费播放动漫 | 性史性农村dvd毛片 | 亚洲天堂2017无码 | 亚洲成av人片在线观看无码不卡 | 狠狠色噜噜狠狠狠狠7777米奇 | 久久天天躁夜夜躁狠狠 | 女人和拘做爰正片视频 | 无码纯肉视频在线观看 | 国产精品人人爽人人做我的可爱 | 一本久久伊人热热精品中文字幕 | 亚洲午夜久久久影院 | 国产精品毛片一区二区 | 精品人妻人人做人人爽 | 亚洲欧洲日本综合aⅴ在线 | 久久人妻内射无码一区三区 | 亚洲欧美中文字幕5发布 | 国产精品美女久久久久av爽李琼 | 亚洲综合在线一区二区三区 | 国产三级精品三级男人的天堂 | 亚洲午夜无码久久 | 成人女人看片免费视频放人 | 麻豆精品国产精华精华液好用吗 | 在线成人www免费观看视频 | 欧美成人家庭影院 | 99久久无码一区人妻 | 中文字幕无码乱人伦 | 麻豆果冻传媒2021精品传媒一区下载 | 国产无av码在线观看 | 国产亚洲精品精品国产亚洲综合 | 男女超爽视频免费播放 | 国产av一区二区三区最新精品 | 真人与拘做受免费视频 | 亚洲精品午夜无码电影网 | 亚洲狠狠婷婷综合久久 | 国产精品毛片一区二区 | 日日天干夜夜狠狠爱 | 国精品人妻无码一区二区三区蜜柚 | 两性色午夜视频免费播放 | 国产精品久久久久久亚洲毛片 | 日韩欧美成人免费观看 | 亚洲精品综合一区二区三区在线 | 无码人妻精品一区二区三区不卡 | 亚洲一区二区观看播放 | 性做久久久久久久久 | 久久精品人妻少妇一区二区三区 | 国产精品久久久久久亚洲毛片 | 思思久久99热只有频精品66 | 国内少妇偷人精品视频 | 成人免费视频一区二区 | 国产亚洲日韩欧美另类第八页 | 国产精品人人爽人人做我的可爱 | 领导边摸边吃奶边做爽在线观看 | 老太婆性杂交欧美肥老太 | 亚洲欧美中文字幕5发布 | 欧美高清在线精品一区 | 欧美乱妇无乱码大黄a片 | 亚洲日韩一区二区 | 国产精品资源一区二区 | 玩弄中年熟妇正在播放 | 强伦人妻一区二区三区视频18 | 欧美zoozzooz性欧美 | 亚洲精品一区二区三区在线 | 国产亚洲精品久久久久久久久动漫 | 国产免费观看黄av片 | 人人澡人人妻人人爽人人蜜桃 | 国产人妻精品一区二区三区 | 国产av无码专区亚洲a∨毛片 | 国产97色在线 | 免 | 亚洲国产精品久久久天堂 | 少妇高潮喷潮久久久影院 | 国产精品亚洲а∨无码播放麻豆 | av香港经典三级级 在线 | 一本久久a久久精品亚洲 | 撕开奶罩揉吮奶头视频 | 亚洲综合无码久久精品综合 | 国产性生交xxxxx无码 | 久久精品国产大片免费观看 | 学生妹亚洲一区二区 | 国产日产欧产精品精品app | 久久午夜无码鲁丝片秋霞 | 国产精品美女久久久网av | 在线观看免费人成视频 | 成人性做爰aaa片免费看 | 熟妇人妻中文av无码 | 亚洲综合无码久久精品综合 | 台湾无码一区二区 | 欧美人与禽zoz0性伦交 | 亚洲 a v无 码免 费 成 人 a v | 无码人妻少妇伦在线电影 | 无码国模国产在线观看 | 国产精品福利视频导航 | 一本久久伊人热热精品中文字幕 | 亚洲中文字幕av在天堂 | 精品无人区无码乱码毛片国产 | 漂亮人妻洗澡被公强 日日躁 | 国产又爽又猛又粗的视频a片 | 国产成人综合在线女婷五月99播放 | 亚洲精品国产精品乱码视色 | 国产午夜手机精彩视频 | 露脸叫床粗话东北少妇 | 又大又黄又粗又爽的免费视频 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 国产成人一区二区三区在线观看 | 动漫av网站免费观看 | 日日鲁鲁鲁夜夜爽爽狠狠 | 97久久精品无码一区二区 | 欧美野外疯狂做受xxxx高潮 | 日韩亚洲欧美中文高清在线 | 在教室伦流澡到高潮hnp视频 | 成人一在线视频日韩国产 | 97se亚洲精品一区 | 荫蒂被男人添的好舒服爽免费视频 | 成人精品视频一区二区三区尤物 | 国产婷婷色一区二区三区在线 | 亚洲色在线无码国产精品不卡 | 人人爽人人爽人人片av亚洲 | 性开放的女人aaa片 | 国产亚av手机在线观看 | 国产精品久久久久无码av色戒 | 国内揄拍国内精品人妻 | 奇米影视888欧美在线观看 | 国产午夜手机精彩视频 | 中文字幕乱妇无码av在线 | 欧美一区二区三区视频在线观看 | 亚洲中文字幕在线观看 | 女人被男人躁得好爽免费视频 | 亚洲一区二区三区四区 | 国产在线aaa片一区二区99 | 国产激情精品一区二区三区 | 亚洲精品国产品国语在线观看 | 丝袜美腿亚洲一区二区 | 国产精品人人妻人人爽 | 久久国产精品精品国产色婷婷 | 麻豆国产丝袜白领秘书在线观看 | 激情内射亚州一区二区三区爱妻 | 国产精品无码mv在线观看 | 国产一精品一av一免费 | 任你躁国产自任一区二区三区 | 国产亚洲欧美日韩亚洲中文色 | 亚洲国产精品久久久久久 | 国产欧美精品一区二区三区 | 狠狠色色综合网站 | 中文字幕精品av一区二区五区 | 欧美兽交xxxx×视频 | 色婷婷久久一区二区三区麻豆 | 无码人妻精品一区二区三区不卡 | 狠狠色噜噜狠狠狠7777奇米 | 精品无码国产自产拍在线观看蜜 | 无码av最新清无码专区吞精 | 亚洲一区二区三区含羞草 | 又黄又爽又色的视频 | 一本色道久久综合亚洲精品不卡 | 无码中文字幕色专区 | 人人澡人人妻人人爽人人蜜桃 | 欧美性猛交xxxx富婆 | 亚洲色www成人永久网址 | 台湾无码一区二区 | 麻豆国产97在线 | 欧洲 | 欧美 丝袜 自拍 制服 另类 | 国产情侣作爱视频免费观看 | 理论片87福利理论电影 | 大色综合色综合网站 | 亚洲成av人综合在线观看 | 精品熟女少妇av免费观看 | 无码人妻少妇伦在线电影 | 97夜夜澡人人爽人人喊中国片 | 奇米影视7777久久精品人人爽 | 国产免费观看黄av片 | 丁香啪啪综合成人亚洲 | 3d动漫精品啪啪一区二区中 | 免费网站看v片在线18禁无码 | 中文字幕无码人妻少妇免费 | 精品国产一区av天美传媒 | 麻豆精品国产精华精华液好用吗 | 国产在线aaa片一区二区99 | 免费国产黄网站在线观看 | 日韩精品无码一区二区中文字幕 | 中文字幕av无码一区二区三区电影 | 久在线观看福利视频 | 久久久久免费看成人影片 | 88国产精品欧美一区二区三区 | 国产人妻精品午夜福利免费 | 麻花豆传媒剧国产免费mv在线 | 熟女少妇人妻中文字幕 | 又大又黄又粗又爽的免费视频 | 在线看片无码永久免费视频 | 亚洲日本一区二区三区在线 | 少妇激情av一区二区 | 又大又硬又黄的免费视频 | 国产人妻精品一区二区三区不卡 | 日日干夜夜干 | 久久久精品人妻久久影视 | 国产福利视频一区二区 | 亚洲综合精品香蕉久久网 | 激情爆乳一区二区三区 | 伊人久久大香线蕉亚洲 | 中文字幕无码日韩欧毛 | 色狠狠av一区二区三区 | 国产熟女一区二区三区四区五区 | 无码一区二区三区在线观看 | 国产精品福利视频导航 | 日韩欧美中文字幕在线三区 | 熟女体下毛毛黑森林 | 人人妻人人澡人人爽欧美精品 | 亚洲 a v无 码免 费 成 人 a v | 精品国产av色一区二区深夜久久 | 日本一卡二卡不卡视频查询 | 免费乱码人妻系列无码专区 | 国产三级久久久精品麻豆三级 | 国产精品高潮呻吟av久久4虎 | 成人欧美一区二区三区黑人 | 国产一精品一av一免费 | 国产婷婷色一区二区三区在线 | 桃花色综合影院 | 欧美自拍另类欧美综合图片区 | 国产精品久久久午夜夜伦鲁鲁 | 国产真实伦对白全集 | 狠狠躁日日躁夜夜躁2020 | 乱码av麻豆丝袜熟女系列 | 国产香蕉尹人综合在线观看 | 99久久99久久免费精品蜜桃 | 成人无码精品一区二区三区 | 波多野结衣高清一区二区三区 | 蜜桃视频插满18在线观看 | 欧美性色19p | 国产成人精品视频ⅴa片软件竹菊 | 大色综合色综合网站 | 无码精品人妻一区二区三区av | 亚洲精品无码人妻无码 | 午夜精品久久久内射近拍高清 | 99er热精品视频 | 少妇性荡欲午夜性开放视频剧场 | 亚洲日韩一区二区三区 | 福利一区二区三区视频在线观看 | 在线观看欧美一区二区三区 | 亚洲色成人中文字幕网站 | 野外少妇愉情中文字幕 | 亚洲日本一区二区三区在线 | 久久亚洲国产成人精品性色 | 国产两女互慰高潮视频在线观看 | 强辱丰满人妻hd中文字幕 | 久久无码人妻影院 | 久久五月精品中文字幕 | 99久久久无码国产精品免费 | 免费网站看v片在线18禁无码 | 国产婷婷色一区二区三区在线 | 久久国产精品二国产精品 | 日本丰满护士爆乳xxxx | 无码精品国产va在线观看dvd | 亚洲日本在线电影 | 国产亚洲美女精品久久久2020 | 久久精品国产99精品亚洲 | 欧美第一黄网免费网站 | 国产小呦泬泬99精品 | 国内揄拍国内精品少妇国语 | 午夜精品一区二区三区在线观看 | 日韩视频 中文字幕 视频一区 | 成人无码影片精品久久久 | 奇米影视7777久久精品人人爽 | 国产在热线精品视频 | 狠狠躁日日躁夜夜躁2020 | 熟女俱乐部五十路六十路av | 特黄特色大片免费播放器图片 | 亚洲男人av香蕉爽爽爽爽 | 国产精品久久久av久久久 | 久久久精品国产sm最大网站 | 午夜福利试看120秒体验区 | 曰韩无码二三区中文字幕 | 久久久无码中文字幕久... | 国产成人午夜福利在线播放 | 久久久久亚洲精品中文字幕 | 天堂亚洲2017在线观看 | 精品国产一区二区三区四区 | 日韩人妻系列无码专区 | 欧美性黑人极品hd | 色婷婷av一区二区三区之红樱桃 | 99国产精品白浆在线观看免费 | 国产另类ts人妖一区二区 | 风流少妇按摩来高潮 | 日日躁夜夜躁狠狠躁 | 免费观看的无遮挡av | 丰满妇女强制高潮18xxxx | 精品一区二区三区无码免费视频 | 久久综合久久自在自线精品自 | 国产色在线 | 国产 | 中文精品久久久久人妻不卡 | 红桃av一区二区三区在线无码av | 日本熟妇浓毛 | 色综合视频一区二区三区 | 午夜丰满少妇性开放视频 | 亚洲欧美色中文字幕在线 | 日本护士毛茸茸高潮 | 国产精品久久久一区二区三区 | 小泽玛莉亚一区二区视频在线 | 国产片av国语在线观看 | 久久人妻内射无码一区三区 | 妺妺窝人体色www婷婷 | 亚洲精品久久久久中文第一幕 | 亚洲精品国产a久久久久久 | 中文字幕乱码亚洲无线三区 | 2019午夜福利不卡片在线 | a在线观看免费网站大全 | 国产两女互慰高潮视频在线观看 | 国产情侣作爱视频免费观看 | 精品一区二区不卡无码av | 丰满人妻翻云覆雨呻吟视频 | 免费看少妇作爱视频 | 亚洲一区二区三区国产精华液 | 久久国产精品精品国产色婷婷 | 亚洲精品无码国产 | 亚洲国产精品成人久久蜜臀 | 久久天天躁夜夜躁狠狠 | 夜夜夜高潮夜夜爽夜夜爰爰 | 日韩视频 中文字幕 视频一区 | 大乳丰满人妻中文字幕日本 | 图片区 小说区 区 亚洲五月 | 亲嘴扒胸摸屁股激烈网站 | 久久精品视频在线看15 | 国内精品人妻无码久久久影院 | 久久精品99久久香蕉国产色戒 | 国产精品久久国产三级国 | 夜夜躁日日躁狠狠久久av | 啦啦啦www在线观看免费视频 | 欧美性猛交内射兽交老熟妇 | 国产精品无码一区二区三区不卡 | 九九在线中文字幕无码 | 国产高清av在线播放 | 51国偷自产一区二区三区 | 久久久久久久久蜜桃 | 精品国产麻豆免费人成网站 | 亚洲另类伦春色综合小说 | 亚洲国产精品久久久久久 | 欧美性黑人极品hd | 亚洲欧美国产精品专区久久 | 国产人妻人伦精品 | 国产精品多人p群无码 | 久久人人爽人人人人片 | 亚洲男人av香蕉爽爽爽爽 | 在线成人www免费观看视频 | 国产精品亚洲专区无码不卡 | 欧美国产日产一区二区 | 亚洲日韩av一区二区三区四区 | 一个人看的视频www在线 | 女人被男人躁得好爽免费视频 | 性生交片免费无码看人 | 日韩精品无码一本二本三本色 | 亚洲阿v天堂在线 | 色一情一乱一伦 | 久久久久久久女国产乱让韩 | 荫蒂被男人添的好舒服爽免费视频 | 国产成人综合美国十次 | 精品一区二区不卡无码av | 中文字幕无线码 | 纯爱无遮挡h肉动漫在线播放 | 亚洲狠狠婷婷综合久久 | 色婷婷综合激情综在线播放 | 无遮挡啪啪摇乳动态图 | 网友自拍区视频精品 | 成人毛片一区二区 | 国精品人妻无码一区二区三区蜜柚 | 久久国产精品_国产精品 | 精品一区二区不卡无码av | 久久久久亚洲精品中文字幕 | 奇米影视888欧美在线观看 | 国产精品理论片在线观看 | 成人无码视频免费播放 | 十八禁真人啪啪免费网站 | 国产亚洲精品久久久久久 | 一本久道久久综合婷婷五月 | 亚洲性无码av中文字幕 | 老太婆性杂交欧美肥老太 | 伊在人天堂亚洲香蕉精品区 | 精品久久久无码中文字幕 | 国产精品香蕉在线观看 | 国产97人人超碰caoprom | 亚洲精品综合一区二区三区在线 | 黄网在线观看免费网站 | 午夜精品一区二区三区的区别 | 中文字幕人妻无码一区二区三区 | 日本熟妇乱子伦xxxx | 思思久久99热只有频精品66 | 国产免费久久久久久无码 | av在线亚洲欧洲日产一区二区 | 97久久超碰中文字幕 | 精品久久久久久人妻无码中文字幕 | 中文字幕乱码中文乱码51精品 | 日本熟妇人妻xxxxx人hd | 西西人体www44rt大胆高清 | 国产亚洲精品久久久久久 | 无码av岛国片在线播放 | 宝宝好涨水快流出来免费视频 | 无码人妻精品一区二区三区下载 | 人人澡人摸人人添 | 成年美女黄网站色大免费全看 | 美女毛片一区二区三区四区 | 国产激情艳情在线看视频 | 国产电影无码午夜在线播放 | 欧美 丝袜 自拍 制服 另类 | 无码纯肉视频在线观看 | 国产av久久久久精东av | 亚洲国产精品无码一区二区三区 | 久久久无码中文字幕久... | 奇米影视7777久久精品 | 日韩av无码中文无码电影 | 色综合视频一区二区三区 | 亚洲精品国产品国语在线观看 | 少妇无套内谢久久久久 | 暴力强奷在线播放无码 | 国产色在线 | 国产 | 亚洲精品久久久久久一区二区 | 一区二区传媒有限公司 | 亚洲国产精品久久人人爱 | 亚洲色在线无码国产精品不卡 | 久久精品女人天堂av免费观看 | 国产精品亚洲五月天高清 | 麻豆人妻少妇精品无码专区 | 亚洲精品国产第一综合99久久 | 国产熟女一区二区三区四区五区 | 成人影院yy111111在线观看 | a片在线免费观看 | 亚洲精品一区二区三区四区五区 | 国产精品第一区揄拍无码 | 国内丰满熟女出轨videos | 久久久www成人免费毛片 | 久久综合给久久狠狠97色 | 久久综合香蕉国产蜜臀av | 大色综合色综合网站 | 性生交片免费无码看人 | 欧美丰满熟妇xxxx | 久久人妻内射无码一区三区 | 骚片av蜜桃精品一区 | 日韩精品无码一本二本三本色 | 日本乱人伦片中文三区 | 无码精品国产va在线观看dvd | 高清无码午夜福利视频 | 亚洲色欲色欲天天天www | 亚洲国产av精品一区二区蜜芽 | 蜜臀aⅴ国产精品久久久国产老师 | 性史性农村dvd毛片 | 国产在线精品一区二区高清不卡 | 亚洲人成无码网www | 中文精品久久久久人妻不卡 | 欧美亚洲日韩国产人成在线播放 | 国产亚洲精品久久久久久大师 | 草草网站影院白丝内射 | 亲嘴扒胸摸屁股激烈网站 | 日本护士xxxxhd少妇 | 我要看www免费看插插视频 | 精品少妇爆乳无码av无码专区 | 一本色道婷婷久久欧美 | 亚洲精品www久久久 | 日本一卡2卡3卡四卡精品网站 | 亚洲色偷偷偷综合网 | 国产av一区二区三区最新精品 | 午夜丰满少妇性开放视频 | 国产真实乱对白精彩久久 | 美女黄网站人色视频免费国产 | 久久精品国产99精品亚洲 | 色爱情人网站 | 亚洲国产精品久久人人爱 | 成人片黄网站色大片免费观看 | 国产香蕉尹人视频在线 | 久久久久久久久蜜桃 | 亚洲欧美精品aaaaaa片 | 久久久久久久人妻无码中文字幕爆 | 大肉大捧一进一出视频出来呀 | 国内揄拍国内精品少妇国语 | 日日夜夜撸啊撸 | 正在播放东北夫妻内射 | 亚洲色在线无码国产精品不卡 | 国产偷国产偷精品高清尤物 | 99精品无人区乱码1区2区3区 | 小泽玛莉亚一区二区视频在线 | 亚洲精品一区二区三区在线观看 | 久久伊人色av天堂九九小黄鸭 | 爽爽影院免费观看 | 美女毛片一区二区三区四区 | 狠狠色欧美亚洲狠狠色www | 一个人免费观看的www视频 | 成人免费无码大片a毛片 | 国产精品久久久久久久9999 | a在线观看免费网站大全 | 欧美日韩亚洲国产精品 | 18禁黄网站男男禁片免费观看 | 免费播放一区二区三区 | 亚洲国产精品久久久久久 | 国产疯狂伦交大片 | 久在线观看福利视频 | a在线观看免费网站大全 | 色综合视频一区二区三区 | 女人被爽到呻吟gif动态图视看 | 亚洲码国产精品高潮在线 | 国产欧美亚洲精品a | 国産精品久久久久久久 | 亚洲成av人片在线观看无码不卡 | 真人与拘做受免费视频 | 国内少妇偷人精品视频免费 | 大胆欧美熟妇xx | 日韩人妻无码一区二区三区久久99 | 精品无人区无码乱码毛片国产 | 精品国产精品久久一区免费式 | 国产高潮视频在线观看 | 精品国产精品久久一区免费式 | 国产精品人人爽人人做我的可爱 | 免费观看的无遮挡av | 蜜桃臀无码内射一区二区三区 | 久久久精品成人免费观看 | 图片小说视频一区二区 | 国产亚洲视频中文字幕97精品 | 亚洲 a v无 码免 费 成 人 a v | 精品久久久久香蕉网 | 亚洲人成影院在线观看 | 一本精品99久久精品77 | 最新国产麻豆aⅴ精品无码 | 久久人人爽人人人人片 | 国产精品久久久久无码av色戒 | 日本一本二本三区免费 | 狠狠色色综合网站 | 国产疯狂伦交大片 | 久久99热只有频精品8 | 日本一卡二卡不卡视频查询 | 国产亚洲精品久久久久久国模美 | 亚洲精品综合五月久久小说 | 精品国产一区av天美传媒 | 国内综合精品午夜久久资源 | 国产午夜福利亚洲第一 | 国产亚洲日韩欧美另类第八页 | 欧美三级a做爰在线观看 | 欧美人与牲动交xxxx | 一本久道久久综合狠狠爱 | 嫩b人妻精品一区二区三区 | 在线播放免费人成毛片乱码 | 久久人妻内射无码一区三区 | 亚洲熟妇色xxxxx欧美老妇y | 小sao货水好多真紧h无码视频 | 欧美xxxx黑人又粗又长 | 小鲜肉自慰网站xnxx | 青青草原综合久久大伊人精品 | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲春色在线视频 | 娇妻被黑人粗大高潮白浆 | 日本精品人妻无码免费大全 | 国产深夜福利视频在线 | 人人妻人人澡人人爽人人精品 | 高潮毛片无遮挡高清免费视频 | 天天拍夜夜添久久精品 | 国产精品99爱免费视频 | 无码任你躁久久久久久久 | 黄网在线观看免费网站 | 亚洲综合精品香蕉久久网 | 国产舌乚八伦偷品w中 | 奇米影视7777久久精品人人爽 | 色综合天天综合狠狠爱 | 最近免费中文字幕中文高清百度 | 欧美人与禽猛交狂配 | 又色又爽又黄的美女裸体网站 | 99久久久无码国产精品免费 | 国产精品自产拍在线观看 | 中文字幕无码免费久久99 | 四虎国产精品一区二区 | 欧美国产亚洲日韩在线二区 | 亚洲精品中文字幕久久久久 | 国产亚洲日韩欧美另类第八页 | 一个人免费观看的www视频 | 伊人色综合久久天天小片 | 欧美老妇与禽交 | 在线播放免费人成毛片乱码 | aⅴ在线视频男人的天堂 | 亚洲精品午夜国产va久久成人 | 欧美freesex黑人又粗又大 | 1000部夫妻午夜免费 | 亚洲s码欧洲m码国产av | 夜夜影院未满十八勿进 | 欧美日韩一区二区综合 | 九月婷婷人人澡人人添人人爽 | 久久久精品456亚洲影院 | 正在播放老肥熟妇露脸 | 欧美熟妇另类久久久久久不卡 | 日韩 欧美 动漫 国产 制服 | 色五月五月丁香亚洲综合网 | 伊人久久大香线蕉亚洲 | 日日噜噜噜噜夜夜爽亚洲精品 | 国产精品久久久久久亚洲影视内衣 | 东京一本一道一二三区 | 免费人成网站视频在线观看 | 精品国产精品久久一区免费式 | 青草视频在线播放 | 999久久久国产精品消防器材 | 国产香蕉97碰碰久久人人 | 青春草在线视频免费观看 | 久久精品人人做人人综合试看 | 成人毛片一区二区 | 国产极品美女高潮无套在线观看 | 久久久久成人片免费观看蜜芽 | 免费人成在线视频无码 | 欧美色就是色 | 老太婆性杂交欧美肥老太 | 麻豆国产丝袜白领秘书在线观看 | a片在线免费观看 | 精品无码一区二区三区爱欲 | 永久免费观看美女裸体的网站 | 中文无码精品a∨在线观看不卡 | 中文字幕 亚洲精品 第1页 | 奇米影视7777久久精品 | www国产亚洲精品久久久日本 | 对白脏话肉麻粗话av | 午夜理论片yy44880影院 | 综合人妻久久一区二区精品 | 免费看男女做好爽好硬视频 | 99re在线播放 | 国产精品亚洲一区二区三区喷水 | 国产成人精品一区二区在线小狼 | 国产内射爽爽大片视频社区在线 | 亚洲国产av精品一区二区蜜芽 | 亚洲成a人片在线观看无码 | 国产三级久久久精品麻豆三级 | 欧美日韩色另类综合 | 无遮挡国产高潮视频免费观看 | 在线播放免费人成毛片乱码 | 欧美日韩综合一区二区三区 | 国产特级毛片aaaaaaa高清 | 又湿又紧又大又爽a视频国产 | 久久99热只有频精品8 | 99久久人妻精品免费二区 | 国产亚洲美女精品久久久2020 | 中文字幕乱妇无码av在线 | 国产明星裸体无码xxxx视频 | 性色欲网站人妻丰满中文久久不卡 | 国产成人av免费观看 | 在线а√天堂中文官网 | 国产乱人偷精品人妻a片 | 亚洲а∨天堂久久精品2021 | v一区无码内射国产 | 色偷偷人人澡人人爽人人模 | 久久亚洲精品中文字幕无男同 | 纯爱无遮挡h肉动漫在线播放 | 一本色道久久综合亚洲精品不卡 | 一个人看的视频www在线 | 乌克兰少妇性做爰 | 久热国产vs视频在线观看 | 国产精品理论片在线观看 | 国产成人无码av片在线观看不卡 | 97久久精品无码一区二区 | 亚洲成熟女人毛毛耸耸多 | 无码人妻丰满熟妇区毛片18 | 成人一在线视频日韩国产 | 人妻体内射精一区二区三四 | 人妻少妇精品视频专区 | 国产超级va在线观看视频 | 日欧一片内射va在线影院 | 永久免费精品精品永久-夜色 | 久久久婷婷五月亚洲97号色 | 女人和拘做爰正片视频 | 青青草原综合久久大伊人精品 | 欧美成人午夜精品久久久 | 熟妇激情内射com | 国产人成高清在线视频99最全资源 | 中文字幕无码免费久久9一区9 | 亚洲人成影院在线观看 | 国产成人精品视频ⅴa片软件竹菊 | 久久天天躁狠狠躁夜夜免费观看 | 男人和女人高潮免费网站 | 永久免费观看美女裸体的网站 | 最新版天堂资源中文官网 | 天天躁夜夜躁狠狠是什么心态 | 国产精品久免费的黄网站 | 大色综合色综合网站 | 亚洲日本va中文字幕 | 久久熟妇人妻午夜寂寞影院 | 亚洲国产精华液网站w | 无码免费一区二区三区 | 国产人妖乱国产精品人妖 | 精品国产成人一区二区三区 | 影音先锋中文字幕无码 | 亚洲一区二区三区国产精华液 | 人妻尝试又大又粗久久 | 女人被爽到呻吟gif动态图视看 | 少妇高潮喷潮久久久影院 | 狠狠cao日日穞夜夜穞av | 国产激情综合五月久久 | 亚洲日本一区二区三区在线 | 中文字幕色婷婷在线视频 | 荫蒂添的好舒服视频囗交 | 男人的天堂av网站 | 欧美freesex黑人又粗又大 | 精品无人区无码乱码毛片国产 | 国产激情综合五月久久 | 国产内射爽爽大片视频社区在线 | 日本一区二区三区免费播放 | 国产成人精品久久亚洲高清不卡 | 国产va免费精品观看 | 性色欲网站人妻丰满中文久久不卡 | 国产精品理论片在线观看 | 免费观看黄网站 | 亚洲精品午夜国产va久久成人 | 亚洲国产精品无码久久久久高潮 | a在线观看免费网站大全 | 妺妺窝人体色www在线小说 | 无码午夜成人1000部免费视频 | 亚洲国产高清在线观看视频 | a在线亚洲男人的天堂 | 粗大的内捧猛烈进出视频 | 国内丰满熟女出轨videos | 精品无码一区二区三区的天堂 | 国产人妻精品一区二区三区 | 亚洲成a人片在线观看日本 | 亚洲精品一区二区三区四区五区 | 日韩 欧美 动漫 国产 制服 | 国产香蕉尹人综合在线观看 | 国产农村妇女高潮大叫 | 国产黄在线观看免费观看不卡 | 亚拍精品一区二区三区探花 | 日韩精品成人一区二区三区 | 人妻夜夜爽天天爽三区 | 国产艳妇av在线观看果冻传媒 | 少妇高潮喷潮久久久影院 | 无码午夜成人1000部免费视频 | 亚洲一区二区三区含羞草 | 亚洲一区二区三区 | 老司机亚洲精品影院无码 | 色综合久久久无码网中文 | 久久久中文字幕日本无吗 | 亚洲精品国产精品乱码视色 | 帮老师解开蕾丝奶罩吸乳网站 | а√天堂www在线天堂小说 | 精品 日韩 国产 欧美 视频 | 欧美国产亚洲日韩在线二区 | 无码av岛国片在线播放 | 97精品人妻一区二区三区香蕉 | 中国女人内谢69xxxxxa片 | 精品aⅴ一区二区三区 | 亚洲中文字幕va福利 | 国产精品va在线播放 | 在线成人www免费观看视频 | 久久99精品久久久久久动态图 | 欧美人与禽猛交狂配 | 欧美大屁股xxxxhd黑色 | 国产色精品久久人妻 | 人人妻人人澡人人爽人人精品 | 日日摸天天摸爽爽狠狠97 | 久久亚洲日韩精品一区二区三区 | 亚洲中文字幕在线观看 | 亚洲日韩精品欧美一区二区 | 人人超人人超碰超国产 | 亚洲人成无码网www | 国产精品99久久精品爆乳 | 午夜无码人妻av大片色欲 | 欧美野外疯狂做受xxxx高潮 | 人妻插b视频一区二区三区 | 国产精品99久久精品爆乳 | 亚洲国产欧美日韩精品一区二区三区 | 国产乱码精品一品二品 | 激情内射亚州一区二区三区爱妻 | 国产精品无套呻吟在线 | 日韩人妻无码一区二区三区久久99 | 天天爽夜夜爽夜夜爽 | 国产亲子乱弄免费视频 | 亚洲 高清 成人 动漫 | 国产内射爽爽大片视频社区在线 | 99久久精品国产一区二区蜜芽 | 乱人伦中文视频在线观看 | 日韩人妻系列无码专区 | 成人无码视频在线观看网站 | 色妞www精品免费视频 | 成人性做爰aaa片免费看不忠 | 丰满少妇人妻久久久久久 | 激情国产av做激情国产爱 | √8天堂资源地址中文在线 | 亚洲精品久久久久久一区二区 | 99久久人妻精品免费一区 | 国产人妻人伦精品 | 疯狂三人交性欧美 | 久久精品人人做人人综合 | 日日噜噜噜噜夜夜爽亚洲精品 | 小泽玛莉亚一区二区视频在线 | 又粗又大又硬毛片免费看 | 国产高清av在线播放 | 国产亚洲精品久久久闺蜜 | 色欲久久久天天天综合网精品 | 久久久久se色偷偷亚洲精品av | 欧洲美熟女乱又伦 | 人妻夜夜爽天天爽三区 | 婷婷丁香六月激情综合啪 | 人人妻人人澡人人爽人人精品浪潮 | 国产精品毛片一区二区 | www国产亚洲精品久久久日本 | 色老头在线一区二区三区 | 亚洲精品一区二区三区四区五区 | 国产av一区二区三区最新精品 | 黄网在线观看免费网站 | 波多野结衣一区二区三区av免费 | 人妻aⅴ无码一区二区三区 | 成人欧美一区二区三区 | 日本一区二区更新不卡 | 女人被男人爽到呻吟的视频 | 国产高清不卡无码视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 中文字幕无码av激情不卡 | 99久久精品日本一区二区免费 | 国产精品永久免费视频 | 熟妇激情内射com | 精品人妻人人做人人爽夜夜爽 | 人妻插b视频一区二区三区 | 国产精华av午夜在线观看 | 国产三级精品三级男人的天堂 | 综合人妻久久一区二区精品 | 亚洲大尺度无码无码专区 | 亚洲 日韩 欧美 成人 在线观看 | 九九久久精品国产免费看小说 | 扒开双腿疯狂进出爽爽爽视频 | 亚洲国产欧美国产综合一区 | 亚洲国产一区二区三区在线观看 | 97夜夜澡人人爽人人喊中国片 | 精品久久久无码中文字幕 | 日欧一片内射va在线影院 | 丰满护士巨好爽好大乳 | 欧美人与动性行为视频 | 国产精品久久久久无码av色戒 | 成年美女黄网站色大免费全看 | 亚洲一区二区三区四区 | 四虎永久在线精品免费网址 | 国产婷婷色一区二区三区在线 | 欧美日本免费一区二区三区 | 2020久久超碰国产精品最新 | 高清无码午夜福利视频 | 成人无码视频在线观看网站 | 精品夜夜澡人妻无码av蜜桃 | 国产人妻精品午夜福利免费 | 日韩精品无码免费一区二区三区 | 国产成人精品一区二区在线小狼 | 精品人妻中文字幕有码在线 | 国产精品.xx视频.xxtv | 亚洲精品一区二区三区四区五区 | 国产特级毛片aaaaaaa高清 | 麻豆md0077饥渴少妇 | 巨爆乳无码视频在线观看 | 亚洲精品一区二区三区大桥未久 | 国产高清av在线播放 | 最新国产麻豆aⅴ精品无码 | 日日干夜夜干 | 久久99精品国产.久久久久 | 亚洲精品欧美二区三区中文字幕 | 成人无码精品一区二区三区 | 色综合久久久无码中文字幕 | 好爽又高潮了毛片免费下载 | 蜜臀av无码人妻精品 | 2020最新国产自产精品 | 久久熟妇人妻午夜寂寞影院 | 日本熟妇浓毛 | 玩弄少妇高潮ⅹxxxyw | 亚洲欧洲中文日韩av乱码 | 免费人成在线观看网站 | 成人免费视频视频在线观看 免费 | a在线观看免费网站大全 | 欧美野外疯狂做受xxxx高潮 | 老熟妇乱子伦牲交视频 | 免费看男女做好爽好硬视频 | 日本欧美一区二区三区乱码 | 乱人伦人妻中文字幕无码久久网 | 日本高清一区免费中文视频 | 久久 国产 尿 小便 嘘嘘 | 成人av无码一区二区三区 | 亚洲一区av无码专区在线观看 | 狠狠综合久久久久综合网 | 无遮挡国产高潮视频免费观看 | 亚洲精品美女久久久久久久 | 在线a亚洲视频播放在线观看 | 三级4级全黄60分钟 | 鲁大师影院在线观看 | 一区二区三区高清视频一 | 国产精华av午夜在线观看 | 波多野结衣aⅴ在线 | 亚洲色www成人永久网址 | 国产亚洲视频中文字幕97精品 | 九九久久精品国产免费看小说 | 久久久精品欧美一区二区免费 | 又大又黄又粗又爽的免费视频 | 蜜桃无码一区二区三区 | 内射巨臀欧美在线视频 | 亚洲午夜福利在线观看 | 亚洲娇小与黑人巨大交 | 日韩成人一区二区三区在线观看 | 亚洲中文字幕久久无码 | 免费无码一区二区三区蜜桃大 | 67194成是人免费无码 | 欧美日韩综合一区二区三区 | 色五月丁香五月综合五月 | 精品人妻人人做人人爽夜夜爽 | 性欧美牲交xxxxx视频 | 亚洲性无码av中文字幕 | 亚洲一区二区三区无码久久 | 亚洲成av人在线观看网址 | 久久精品中文字幕大胸 | 精品国偷自产在线 | 精品熟女少妇av免费观看 | 精品无码av一区二区三区 | 欧美三级不卡在线观看 | 国产精华av午夜在线观看 | 76少妇精品导航 | 国产综合色产在线精品 | 一个人看的www免费视频在线观看 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 88国产精品欧美一区二区三区 | 永久免费观看美女裸体的网站 | 帮老师解开蕾丝奶罩吸乳网站 | 中文字幕乱码中文乱码51精品 | 国产精品久久久久无码av色戒 | 中文字幕精品av一区二区五区 | 夜夜夜高潮夜夜爽夜夜爰爰 | 波多野结衣高清一区二区三区 | 久久久久久国产精品无码下载 | 色婷婷av一区二区三区之红樱桃 | 日韩人妻无码中文字幕视频 | 自拍偷自拍亚洲精品10p | 55夜色66夜色国产精品视频 | 国产在线aaa片一区二区99 | 一本一道久久综合久久 | 国产精品欧美成人 | 蜜臀aⅴ国产精品久久久国产老师 | 无码中文字幕色专区 | 国产av一区二区三区最新精品 | 牲欲强的熟妇农村老妇女视频 | 人妻少妇精品无码专区二区 | 青青草原综合久久大伊人精品 | 偷窥日本少妇撒尿chinese | 欧美自拍另类欧美综合图片区 | 国产va免费精品观看 | 久久人人爽人人人人片 | 欧美熟妇另类久久久久久多毛 | 国产成人精品必看 | 成人性做爰aaa片免费看不忠 | 四十如虎的丰满熟妇啪啪 | 美女张开腿让人桶 | 无码人妻久久一区二区三区不卡 | 2019nv天堂香蕉在线观看 | 国产乱子伦视频在线播放 | 欧美 丝袜 自拍 制服 另类 | 全黄性性激高免费视频 | 无码人妻丰满熟妇区五十路百度 | 亚洲精品久久久久久一区二区 | 天天综合网天天综合色 | 色狠狠av一区二区三区 | 国精品人妻无码一区二区三区蜜柚 | 国精品人妻无码一区二区三区蜜柚 | 人妻尝试又大又粗久久 | 福利一区二区三区视频在线观看 | 久久久久久久女国产乱让韩 | 少妇无码吹潮 | 国产乱人偷精品人妻a片 | 国产综合久久久久鬼色 | 久久久国产精品无码免费专区 | 青春草在线视频免费观看 | 亚洲一区av无码专区在线观看 | 日韩精品无码免费一区二区三区 | 午夜丰满少妇性开放视频 | 97夜夜澡人人爽人人喊中国片 | 丝袜美腿亚洲一区二区 | 夜先锋av资源网站 | 国产高清不卡无码视频 | 国产精品.xx视频.xxtv | 久久天天躁夜夜躁狠狠 | 亚洲国产精品久久久天堂 | 精品乱子伦一区二区三区 | 岛国片人妻三上悠亚 | 免费视频欧美无人区码 | 精品久久8x国产免费观看 | 疯狂三人交性欧美 | 欧美日韩综合一区二区三区 | 97无码免费人妻超级碰碰夜夜 | 中文字幕无线码 | 亚洲人成网站在线播放942 | 国内综合精品午夜久久资源 | 日本大香伊一区二区三区 | 精品国产麻豆免费人成网站 | 在线观看国产一区二区三区 | 人妻少妇精品无码专区动漫 | 成人免费无码大片a毛片 | 国产亚洲精品久久久久久 | 最新版天堂资源中文官网 | 美女黄网站人色视频免费国产 | 老熟妇仑乱视频一区二区 | 亚洲综合另类小说色区 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 日韩人妻无码一区二区三区久久99 | 国产成人无码av在线影院 | 一本久道久久综合婷婷五月 | 国产乱人伦偷精品视频 | 九月婷婷人人澡人人添人人爽 | 一本久道高清无码视频 | 99麻豆久久久国产精品免费 | 亚洲中文字幕成人无码 | 夜先锋av资源网站 | 亚洲精品成人av在线 | 久久久久国色av免费观看性色 | 国产真人无遮挡作爱免费视频 | 少妇高潮喷潮久久久影院 | √天堂中文官网8在线 | 强辱丰满人妻hd中文字幕 | 欧美丰满熟妇xxxx性ppx人交 | 久久亚洲精品中文字幕无男同 | 男女猛烈xx00免费视频试看 | 亚洲自偷自偷在线制服 | 99久久精品无码一区二区毛片 | 亚洲国产欧美国产综合一区 | 18无码粉嫩小泬无套在线观看 | 麻豆国产人妻欲求不满 | 丰满少妇弄高潮了www | 在线观看欧美一区二区三区 | 丰满人妻翻云覆雨呻吟视频 | 性史性农村dvd毛片 | 99麻豆久久久国产精品免费 | 欧洲极品少妇 | 久久精品国产99精品亚洲 | 亚洲无人区一区二区三区 | 丝袜足控一区二区三区 | 久久精品人人做人人综合试看 | 精品国产aⅴ无码一区二区 | 久久人人爽人人爽人人片ⅴ | 欧美丰满熟妇xxxx性ppx人交 | 国产人妻精品一区二区三区不卡 | 成人精品天堂一区二区三区 | 日韩亚洲欧美精品综合 | 无码帝国www无码专区色综合 | 亚洲无人区午夜福利码高清完整版 | 亚洲一区二区三区 | 国产成人精品视频ⅴa片软件竹菊 | 日日躁夜夜躁狠狠躁 | 精品人妻av区 | 国产片av国语在线观看 | 我要看www免费看插插视频 | 亚洲成a人一区二区三区 | 久久久精品欧美一区二区免费 | 2020久久香蕉国产线看观看 | 亚洲自偷精品视频自拍 | 精品亚洲成av人在线观看 | 成人精品天堂一区二区三区 | 色 综合 欧美 亚洲 国产 | 国色天香社区在线视频 | 国产后入清纯学生妹 | 成人免费视频视频在线观看 免费 | 久久综合狠狠综合久久综合88 | 国产精品亚洲综合色区韩国 | 在教室伦流澡到高潮hnp视频 | 久久 国产 尿 小便 嘘嘘 | 人妻人人添人妻人人爱 | 色欲人妻aaaaaaa无码 | 久久天天躁狠狠躁夜夜免费观看 | 精品欧洲av无码一区二区三区 | 久久久久久a亚洲欧洲av冫 | 狠狠色噜噜狠狠狠狠7777米奇 | 中文久久乱码一区二区 | 亚洲综合色区中文字幕 |