redis 在 php 中的应用(key篇)

KEY(键)

Redis DEL 命令用于删除已存在的键。不存在的 key 会被忽略。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
// The first case 删除单独的 key
$redis->set('w3ckey','redis');
var_dump($redis->get('w3ckey'));     // 返回 redis
$redis ->del('w3ckey');              // 删除该key,若需要获取返回值,则返回值为 int(1)
var_dump($redis->get('w3ckey'));     // 返回 boolean(false)

// The second case 删除一个不存在的 key
if(!$redis->exists('fake_key'))
{
    var_dump($redis->del('fake_key'));   // 返回 int();
}

// The third case 同时删除多个 key
$array_mset = array(
  'key1' => 'val1',
  'key2' => 'val2',
  'key3' => 'val3',
);
$redis->mset($array_mset);           // 使用 mset 同时存储多个值
$array_mget = array('key1', 'key2', 'key3');
var_dump($redis->mget($array_mget)); // 返回 array (size=3)0 => string 'val1' (length=4) 1 => string 'val2' (length=4) 2 => string 'val3' (length=4)
$redis -> del($array_mget);          // 同时删除多个值
var_dump($redis->mget($array_mget)); // 返回 array (size=3) 0 => boolean false 1 => boolean false 2 => boolean false

2、EXISTS

Redis EXISTS 命令用于检查给定 key 是否存在。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->set('w3ckey','redis');
var_dump($redis->exists('w3ckey'));   // boolean true
$redis ->del('w3ckey');
var_dump($redis->exists('w3ckey'));   // boolean(false)

3、EXPIRE

Redis Expire 命令用于设置 key 的过期时间。key 过期后将不再可用。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->set('w3ckey','redis');
$redis->expire('w3ckey',20);      // 设置 w3ckey 的剩余生存时间为 20s
sleep(2);
var_dump($redis->TTL('w3ckey'));  // 查看给定 key 的剩余生存时间,int 18
$redis->expire('w3ckey',30);      // 更新 w3ckey 的剩余生存时间为 30s
sleep(3);
var_dump($redis->TTL('w3ckey'));  // int 27

4、EXPIREAT

Redis Expireat 命令用于以 UNIX 时间戳(unix timestamp)格式设置 key 的过期时间。key 过期后将不再可用。EXPIREAT的作用和EXPIRE一样,都用于为key设置生存时间。不同在于EXPIREAT命令接受的时间参数是UNIX时间戳(unix timestamp)。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->set('w3ckey','redis');
$redis->expireAt('w3ckey',time()+10);      // 设置 w3ckey 的剩余生存时间为 10s 后过期
sleep(3);
var_dump($redis->TTL('w3ckey'));           // 查看给定 key 的剩余生存时间,int 7

5、KEYS

Redis Keys 命令用于查找所有符合给定模式 pattern 的 key 。

(1)KEYS * 命中数据库中所有key。
(2)KEYS h?llo 命中hello, hallo and hxllo等。
(3)KEYS h*llo 命中hllo和heeeeello等。
(4)KEYS h[ae]llo 命中hello和hallo,但不命中hillo。
(5)特殊符号用""隔开

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->flushAll();
$array_mset_keys = array(
    'one' => 1,
    'two' => 2,
    'three' => 3,
    'four' => 4,
);
$redis -> mset($array_mset_keys);
// KEYS * 命中数据库中所有key。
var_dump($redis -> keys('*'));   
 // array (size=4) 0 => string 'four' (length=4) 1 => string 'two' (length=3) 2 => string 'three' (length=5) 3 => string 'one' (length=3)

// KEYS *o* 命中所有包含 "o" 的key。
var_dump($redis -> keys('*o*')); 
 // array (size=4) 0 => string 'four' (length=4) 1 => string 'two' (length=3) 2 => string 'one' (length=3)

// KEYS 0?? 命中 "o" 后面有几个问号就命中几位数。
var_dump($redis->keys("o??"));   
 //array (size=1) 0 => string 'one' (length=3)

// KEYS t[wh]* 命中 "t" 后面跟了 "w" , "h" 或者 "wh" 的key。
var_dump($redis->keys("t[wh]*")); 
//array (size=2) 0 => string 'two' (length=3) 1 => string 'three' (length=5)

6、MOVE

Redis Keys 命令用于将当前数据库(默认为0)的key移动到给定的数据库db当中。如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定key,或者key不存在于当前数据库,那么MOVE没有任何效果。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->flushAll();

// This first case: key 存在于当前数据库
$redis -> select(0);                            // redis 默认使用数据库0,这里在显示指定一次
$redis -> set('favorite_fruit','pineapple');    // 确保 key 值存在
if($redis -> move('favorite_fruit',1)){         // 将 favorite_fruit 移动到数据库 1 中, int 1
    $redis -> select(1);                        // 选择数据库 1
    var_dump($redis -> get('favorite_fruit'));  // string pineapple
}

// This second case: key 不存在
$redis -> select(0);
if(! $redis->exists('fake_key')){               // key 不存在
    $redis -> move('fake_key',1);               // 将 favorite_fruit 移动到数据库 1 中, int 0
}
$redis -> select(1);
var_dump($redis->exists('fake_key'));           // boolean (false)

// This third case: 源数据库和目标数据库有相同的 key
$redis -> select(0);
$redis -> set('favorite_singer','Jay Chou');    // db0 和 db1 有相同的 key : favorite_singer
$redis -> select(1);
$redis -> set('favorite_singer','Xu Wei');
$redis -> select(0);
$redis -> move('favorite_singer',1);            // 将 favorite_fruit 移动到数据库 1 中, int 0
echo $redis -> get('favorite_singer');          // db0 的值没有发生改变,string Jay Chou
$redis -> select(1);
echo $redis -> get('favorite_singer');          // db1 的值没有发生改变,string Xu Wei

7、PERSIST

Redis PERSIST 命令用于移除给定 key 的过期时间,使得 key 永不过期。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->flushAll();

// This first case: key 存在且设置了过期时间
$redis -> set('favorite_fruit','pineapple');
$redis -> expire('favorite_fruit',20);
sleep(2);
echo $redis -> ttl('favorite_fruit')."</br>";    // 18
$redis -> persist('favorite_fruit');             // 移除过期时间
echo $redis -> ttl('favorite_fruit');            // -1 ,表示成功移除过期时间

// This second case: key 不存在
$redis -> select(0);
if(! $redis->exists('fake_key')){               // key 不存在
    var_dump($redis -> persist('fake_key'));    // boolean false
}

// This third case: key 存在但是没有设置过期时间
$redis -> select(0);
$redis -> set('favorite_singer','Jay Chou');
var_dump($redis -> persist('favorite_singer'));  // boolean false

8、TTL

Redis TTL 命令以秒为单位返回 key 的剩余过期时间。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->flushAll();

// This first case: key 存在且设置了过期时间
$redis -> set('favorite_fruit','pineapple');
$redis -> expire('favorite_fruit',20);
sleep(2);
echo $redis -> ttl('favorite_fruit')."</br>";    // 18

// This second case: key 不存在
$redis -> select(0);
if(! $redis->exists('fake_key')){               // key 不存在
    var_dump($redis -> ttl('fake_key'));        // int -2
}

// This third case: key 存在但是没有设置过期时间
$redis -> select(0);
$redis -> set('favorite_singer','Jay Chou');
var_dump($redis -> ttl('favorite_singer'));     // int -1

9、RANDOMKEY

Redis RANDOMKEY 命令从当前数据库中随机返回一个 key (不删除) 。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);

// This first case: 数据库不为空
$array_mset_randomkey = array(
    'fruit' => 'pineapple',
    'food' => 'beef',
    'drink' => 'beer'
);
$redis -> mset($array_mset_randomkey);
var_dump($redis -> randomKey());        // string 'food' ,随机返回一个 key
var_dump($redis -> keys('*'));          // 查看数据库里所有的 key ,验证 randomKey 不删除任何 key

// This second case: 数据库为空
$redis->flushAll();                     // 清空数据库里的数据
var_dump($redis -> randomKey());        // boolean false

10、RENAME

Redis Rename 命令用于修改 key 的名称 。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->flushAll();

// This first case: key 存在且 newkey 不存在 ,成功改名
$redis -> set('fruit','pineapple');
$redis -> rename('fruit','favorite_fruit');     // 重命名
var_dump($redis -> exists('fruit'));            // boolean false, 原来的 key 已经不存在
var_dump($redis -> exists('favorite_fruit'));   // boolean true, key 变成了 newkey

// This second case: key 不存在 ,返回错误
$redis->flushAll();
if(! $redis ->exists('fake_key'))
{
    var_dump($redis -> rename('fake_key','never_exists'));  // boolean false
}

// This third case: key 和 newkey 相同 ,返回错误
$redis -> set('favorite_singer','Jay Chou');
var_dump($redis -> rename('favorite_singer','favorite_singer')); // boolean false

// This fourth case: newkey 已经存在, 覆盖
$redis -> set('PC','SONY');
$redis -> set('personal_computer','lenovo');
var_dump($redis -> rename('PC','personal_computer'));       // boolean true
var_dump($redis -> get('personal_computer'));               // string SONY

11、RENAMENX

Redis Renamenx 命令用于在新的 key 不存在时修改 key 的名称 。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);
$redis->flushAll();

// This first case: key 存在且 newkey 不存在 ,成功改名
$redis -> set('fruit','pineapple');
$redis -> renameNx('fruit','favorite_fruit');     // 重命名
var_dump($redis -> exists('fruit'));            // boolean false, 原来的 key 已经不存在
var_dump($redis -> exists('favorite_fruit'));   // boolean true, key 变成了 newkey

// This second case: newkey已经存在,改名失败
$redis -> set('PC','SONY');
$redis -> set('personal_computer','lenovo');
var_dump($redis -> renameNx('PC','personal_computer'));       // boolean false
var_dump($redis -> get('PC'));                                // string SONY
var_dump($redis -> get('personal_computer'));                 // string lenovo

12、TYPE

Redis Type 命令用于返回 key 所储存的值的类型。

<?php
$redis = new redis();
$redis->connect('127.0.0.1',6379);

// This first case: key 不存在 ,返回 int(0)
$redis->flushAll();
var_dump($redis -> type('fake_key'));           // int(0)

// This second case: 字符串类型 ,返回 int(1)
$redis -> set('favorite_fruit','banana');
var_dump($redis -> type('favorite_fruit'));     // int(1)

// This third case: 集合类型 , 返回 int(2)
$redis -> sAdd('favorite_singer','Jay Chou');
var_dump($redis -> type('favorite_singer'));     // int(2)

// This fourth case: 列表类型 , 返回 int(3)
$redis -> lPush('program','PHP');
var_dump($redis -> type('program'));            // int(3)

// This fifth case: 有序类型 , 返回 int(4)
$redis -> zAdd('pats','0','dog');
$redis -> zAdd('pats','1','cat');
$redis -> zAdd('pats','1','pig');
$redis -> zAdd('pats','2','fox');
var_dump($redis -> zRange('pats',0,-1));        // array (size=4) 0 => string 'dog' (length=3) 1 => string 'cat' (length=3) 2 => string 'pig' (length=3) 3 => string 'fox' (length=3)
var_dump($redis -> type('pats'));               // int(4)

// This sixth case: 哈希类型 , 返回 int(5)
$redis -> hSet('website','baidu','www.baidu.com');
var_dump($redis -> hGet('website','baidu'));    // string www.baidu.com
var_dump($redis -> type('website'));            // int(5)

13、sort

返回或保存给定列表、集合、有序集合 key 中经过排序的元素。
排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较。

1、sort key ,若保存的值是数字,返回列表值从小到大的结果

//  sort key ,按从小到大进行排序
$redis -> flushAll();
$redis -> lPush('number',1.5);
$redis -> lPush('number',18);
$redis -> lPush('number',75);
$redis -> lPush('number',38);
var_dump($redis -> sort('number'));    
// array (size=4) 
//  0 => string '1.5' (length=3) 
//  1 => string '18' (length=2) 
//  2 => string '38' (length=2) 
//  3 => string '75' (length=2)

2、 若保存的是字符串,使用sort(key,array('ALPHA'=>TRUE))进行排序(按字母表顺序)

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);

//  若保存的是字符串,使用sort(key,array('ALPHA'=>TRUE))进行排序(按字母表顺序)
$redis -> flushAll();
$redis -> lPush('website','www.baidu.com');
$redis -> lPush('website','www.google.com');
$redis -> lPush('website','www.tencent.com');
$redis -> lPush('website','www.firefox.com');
var_dump($redis -> sort('website', array('ALPHA'=>TRUE)));
//  array (size=4)
//      0 => string 'www.baidu.com' (length=13)
//      1 => string 'www.firefox.com' (length=15)
//      2 => string 'www.google.com' (length=14)
//      3 => string 'www.tencent.com' (length=15)

3、排序之后返回的元素可以通过LIMIT修饰符进行限制

使用sort(key,array('LIMIT'=>array(offset,count)))

LIMIT修饰符接受两个参数:offset 和 count。

offset指定要跳过的元素数量,count指定跳过offset个指定的元素之后,要返回多少个对象。

(1)排序的值为数字:

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);

//  若排序之后返回的元素数量可以通过LIMIT修饰符进行限制,使用sort(key,array('LIMIT'=>array(offset,count)))
//  LIMIT修饰符接受两个参数:offset和count。
// offset指定要跳过的元素数量,count指定跳过offset个指定的元素之后,要返回多少个对象。
$redis -> flushAll();
$redis -> lPush('rank',5);  //1
$redis -> lPush('rank',55); //7
$redis -> lPush('rank',52); //6
$redis -> lPush('rank',25); //4
$redis -> lPush('rank',24); //3
$redis -> lPush('rank',37); //5
$redis -> lPush('rank',13); //2
$redis -> lPush('rank',87); //8
$redis_sort_option = array('LIMIT' => array(2,5));      // 正序排序,跳过 2 个元素,跳过之后返回 5 个元素
var_dump($redis -> sort('rank', $redis_sort_option));
//  array (size=5)
//      0 => string '24' (length=2)
//      1 => string '25' (length=2)
//      2 => string '37' (length=2)
//      3 => string '52' (length=2)
//      4 => string '55' (length=2)

$redis_sort_desc = array('LIMIT' => array(2,5),'SORT'=>'desc');      // 逆序排序,跳过 2 个元素,跳过之后返回 5 个元素
var_dump($redis -> sort('rank', $redis_sort_desc));
//  array (size=5)
//      0 => string '52' (length=2)
//      1 => string '37' (length=2)
//      2 => string '25' (length=2)
//      3 => string '24' (length=2)
//      4 => string '13' (length=2)

(2)排序的值为字符串

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);

//  若排序之后返回的元素数量可以通过LIMIT修饰符进行限制,使用sort(key,array('LIMIT'=>array(offset,count)))
//  LIMIT修饰符接受两个参数:offset和count。
// offset指定要跳过的元素数量,count指定跳过offset个指定的元素之后,要返回多少个对象。
$redis -> flushAll();
$redis -> lPush('website','www.baidu.com');     //2
$redis -> lPush('website','www.tencent.com');   //7
$redis -> lPush('website','www.firefox.com');   //3
$redis -> lPush('website','www.wangyi.com');    //8
$redis -> lPush('website','www.google.com');    //4
$redis -> lPush('website','www.software.com');  //6
$redis -> lPush('website','www.12306.cn');      //1
$redis -> lPush('website','www.hao123.com');    //5
$redis_sort_option = array('LIMIT' => array(0,5),'ALPHA'=>TRUE);      // 正序排序,如果是字符串的话需要加 "ALPHA"=>TRUE ,跳过 0 个元素,跳过之后返回 5 个元素
var_dump($redis -> sort('website', $redis_sort_option));
//  array (size=5)
//      0 => string 'www.12306.cn' (length=12)
//      1 => string 'www.baidu.com' (length=13)
//      2 => string 'www.firefox.com' (length=15)
//      3 => string 'www.google.com' (length=14)
//      4 => string 'www.hao123.com' (length=14)

$redis_sort_desc = array('LIMIT' => array(0,5),'SORT'=>'desc','ALPHA'=>TRUE);      // 逆序排序,跳过 0 个元素,跳过之后返回 5 个元素
var_dump($redis -> sort('website', $redis_sort_desc));
//  array (size=5)
//      0 => string 'www.wangyi.com' (length=14)
//      1 => string 'www.tencent.com' (length=15)
//      2 => string 'www.software.com' (length=16)
//      3 => string 'www.hao123.com' (length=14)
//      4 => string 'www.google.com' (length=14)

4、使用外部 key 进行排序

有时候会希望使用外部的key作为权重来比较元素,代替默认的对比方法)。

假设现在有用户(user)数据如下:

id name password level
1 Kangkang Kangkang123 5
4 Michael Michael123 3
2 Jane Jane123 2
3 Maria Maria123 7
  id 保存在 key 名为 user_id 的列表中;

name 保存在 username_{id} 的 key 中;

password 保存在 userpassword_{id} 的 key 中;

level 保存在 userlevel_{id} 的 key 中。

(1)首先将数据加入到数据库中

<?php
$redis = new redis();
$redis -> connect('127.0.0.1',6379);
$redis -> flushAll();

// kangkang
$redis -> lPush('user_id',1);
$redis -> set('username_1','Kangkang');
$redis -> set('userpassword_1','Kangkang123');
$redis -> set('userlevel_1',5);

// Michael
$redis -> lPush('user_id',4);
$redis -> set('username_4','Michael');
$redis -> set('userpassword_4','Michael123');
$redis -> set('userlevel_4',3);

// Jane
$redis -> lPush('user_id',2);
$redis -> set('username_2','Jane');
$redis -> set('userpassword_2','Jane123');
$redis -> set('userlevel_2',2);

// Maria
$redis -> lPush('user_id',3);
$redis -> set('username_3','Maria');
$redis -> set('userpassword_3','Maria123');
$redis -> set('userlevel_3',7);

(2)如果希望按 level 从大到小的顺序排序,可以这样做:

// 按 level 从大到小排序 id
$array_sort_option = array(
    'BY' => 'userlevel_*',
    'SORT' => 'DESC',
);
var_dump($redis -> sort('user_id',$array_sort_option));
//  array (size=4)
//      0 => string '3' (length=1)
//      1 => string '1' (length=1)
//      2 => string '4' (length=1)
//      3 => string '2' (length=1)

// 有时候只是返回相应的id没有什么用,你可能更希望排序后返回id对应的用户名,GET 可以帮忙实现
$array_sort_option = array(
    'BY' => 'userlevel_*',
    'SORT' => 'DESC',
    'GET' => 'username_*'
);
var_dump($redis -> sort('user_id',$array_sort_option));
//  array (size=4)
//      0 => string 'Maria' (length=5)
//      1 => string 'Kangkang' (length=8)
//      2 => string 'Michael' (length=7)
//      3 => string 'Jane' (length=4)

// 若不但希望获取用户名,还希望连用户的密码也一并列出,可以使用以下命令,可以多次地、有序地使用 GET 操作来获取更多外部 key
$array_sort_option = array(
    'BY' => 'userlevel_*',
    'SORT' => 'DESC',
    'GET' => array('#','username_*','userpassword_*')   // 注意GET操作是有序的,GET username_* GET userpassword_* 和 GET userpassword_* GET username_*返回的结果位置不同, '#',为当前元素
);
var_dump($redis -> sort('user_id',$array_sort_option));
//  array (size=12)
//      0 => string '3' (length=1)
//      1 => string 'Maria' (length=5)
//      2 => string 'Maria123' (length=8)
//      3 => string '1' (length=1)
//      4 => string 'Kangkang' (length=8)
//      5 => string 'Kangkang123' (length=11)
//      6 => string '4' (length=1)
//      7 => string 'Michael' (length=7)
//      8 => string 'Michael123' (length=10)
//      9 => string '2' (length=1)
//      10 => string 'Jane' (length=4)
//      11 => string 'Jane123' (length=7)

(3)只获取对象而不排序(若希望获取外部对象而又不希望引起排序开销时使用,BY修饰符可以将一个不存在的key当作权重,让SORT跳过排序操作)。

// 此处无论是 ASC 还是 DESC 都无效,是按照先 lpush 的user_id 在走后,后 lpush 的user_id 在最前
if(!$redis -> exists('fake_key')){
    $array_sort_option1 = array(
        'BY' => 'fake_key',
        'GET' => array('#','username_*','userpassword_*')
    );
    var_dump($redis -> sort('user_id',$array_sort_option1));
}
//  array (size=12)
//      0 => string '3' (length=1)
//      1 => string 'Maria' (length=5)
//      2 => string 'Maria123' (length=8)
//      3 => string '2' (length=1)
//      4 => string 'Jane' (length=4)
//      5 => string 'Jane123' (length=7)
//      6 => string '4' (length=1)
//      7 => string 'Michael' (length=7)
//      8 => string 'Michael123' (length=10)
//      9 => string '1' (length=1)
//      10 => string 'Kangkang' (length=8)
//      11 => string 'Kangkang123' (length=11)

(4)保存排序结果

默认情况下,SORT操作只是简单地返回排序结果,如果你希望保存排序结果,可以给 STORE 选项指定一个key作为参数,排序结果将以列表的形式被保存到这个key上。(若指定key已存在,则覆盖。)

// 使用 STORE 之后,可以将结果以 list 的形式保存在 STORE 所定义的 key 中。
$array_sort_option = array(
    'BY' => 'userlevel_*',
    'SORT' => 'DESC',
    'GET' => array('#','username_*','userpassword_*'),
    'STORE' => 'userinfo_sort_by_level'
);
var_dump($redis -> sort('user_id',$array_sort_option));     // int 12
var_dump($redis -> lRange('userinfo_sort_by_level',0,-1));
//  array (size=12)
//      0 => string '3' (length=1)
//      1 => string 'Maria' (length=5)
//      2 => string 'Maria123' (length=8)
//      3 => string '1' (length=1)
//      4 => string 'Kangkang' (length=8)
//      5 => string 'Kangkang123' (length=11)
//      6 => string '4' (length=1)
//      7 => string 'Michael' (length=7)
//      8 => string 'Michael123' (length=10)
//      9 => string '2' (length=1)
//      10 => string 'Jane' (length=4)
//      11 => string 'Jane123' (length=7)

一个有趣的用法是将SORT结果保存,用EXPIRE为结果集设置生存时间,这样结果集就成了SORT操作的一个缓存。这样就不必频繁地调用SORT操作了,只有当结果集过期时,才需要再调用一次SORT操作。

有时候为了正确实现这一用法,你可能需要加锁以避免多个客户端同时进行缓存重建(也就是多个客户端,同一时间进行SORT操作,并保存为结果集),具体参见SETNX命令。

转载,出处http://www.cnblogs.com/chrdai/p/6825684.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容