13 Redis 有序集合(sorted set)

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

实例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> ZADD runoobkey 1 redis
(integer) 1
127.0.0.1:6379> ZADD runoobkey 2 mongodb
(integer) 1
127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 1
127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 0
127.0.0.1:6379> ZADD runoobkey 4 mysql
(integer) 0
127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"

在以上实例中我们通过命令 ZADD 向 redis 的有序集合中添加了三个值并关联上分数。

Redis 有序集合命令

下表列出了 redis 有序集合的基本命令:

  • 1 Zadd

Redis Zadd 命令用于将一个或多个成员元素及其分数值加入到有序集当中。
如果某个成员已经是有序集的成员,那么更新这个成员的分数值,并通过重新插入这个成员元素,来保证该成员在正确的位置上。
分数值可以是整数值或双精度浮点数。
如果有序集合 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
当 key 存在但不是有序集类型时,返回一个错误。
注意: 在 Redis 2.4 版本以前, ZADD 每次只能添加一个元素。

# 语法
redis 127.0.0.1:6379> ZADD KEY_NAME SCORE1 VALUE1.. SCOREN VALUEN


# 返回值
被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。


# 实例
127.0.0.1:6379> ZADD myzset 1 "one"
(integer) 1
127.0.0.1:6379> ZADD myzset 1 "uno"
(integer) 1
127.0.0.1:6379> ZADD myzset 2 "two" 3 "three"
(integer) 2
127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "uno"
4) "1"
5) "two"
6) "2"
7) "three"
8) "3"
  • 2 Zcard

Redis Zcard 命令用于计算集合中元素的数量。

# 语法
redis 127.0.0.1:6379> ZCARD KEY_NAME

# 返回值
当 key 存在且是有序集类型时,返回有序集的基数。 当 key 不存在时,返回 0 。


# 实例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> ZADD myzset 1 "one"
(integer) 1
127.0.0.1:6379> ZADD myzset 2 "two"
(integer) 1
127.0.0.1:6379> ZCARD myzset
(integer) 2
  • 3 Zcount

Redis Zcount 命令用于计算有序集合中指定分数区间的成员数量。

# 语法
redis 127.0.0.1:6379> ZCOUNT key min max


# 返回值
分数值在 min 和 max 之间的成员的数量。


# 实例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> ZADD myzset 1 "hello"
(integer) 1
127.0.0.1:6379> ZADD myzset 1 "foo"
(integer) 1
127.0.0.1:6379> ZADD myzset 2 "world" 3 "bar"
(integer) 2
127.0.0.1:6379> ZCOUNT myzset 1 3
(integer) 4
127.0.0.1:6379> ZCOUNT myzset 1 2
(integer) 3
  • 4 Zincrby

Redis Zincrby 命令对有序集合中指定成员的分数加上增量 increment
可以通过传递一个负数值 increment ,让分数减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。
当 key 不存在,或分数不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。
当 key 不是有序集类型时,返回一个错误。
分数值可以是整数值或双精度浮点数。

# 语法
redis 127.0.0.1:6379> ZINCRBY key increment member


# 返回值
member 成员的新分数值,以字符串形式表示。


# 实例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> ZADD myzset 1 "one"
(integer) 1
127.0.0.1:6379> ZADD myzset 2 "two"
(integer) 1
127.0.0.1:6379> ZINCRBY myzset 2 "one"
"3"
127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "one"
4) "3"
  • 5 Zinterstore

Redis Zinterstore 命令计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。
默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和。

# 语法
redis 127.0.0.1:6379> ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

# 返回值
保存到目标结果集的的成员数量。


# 实例

# 有序集 mid_test
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> ZADD mid_test 70 "Li Lei"
(integer) 1
127.0.0.1:6379> ZADD mid_test 70 "Han Meimei"
(integer) 1
127.0.0.1:6379> ZADD mid_test 99.5 "Tom"
(integer) 1

# 另一个有序集 fin_test
redis 127.0.0.1:6379> ZADD fin_test 88 "Li Lei"
(integer) 1
redis 127.0.0.1:6379> ZADD fin_test 75 "Han Meimei"
(integer) 1
redis 127.0.0.1:6379> ZADD fin_test 99.5 "Tom"
(integer) 1

# 交集
redis 127.0.0.1:6379> ZINTERSTORE sum_point 2 mid_test fin_test
(integer) 3

# 显示有序集内所有成员及其分数值
redis 127.0.0.1:6379> ZRANGE sum_point 0 -1 WITHSCORES     
1) "Han Meimei"
2) "145"
3) "Li Lei"
4) "158"
5) "Tom"
6) "199"
  • 6 Zlexcount

Redis Zlexcount 命令在计算有序集合中指定字典区间内成员数量。

# 语法
redis 127.0.0.1:6379> ZLEXCOUNT KEY MIN MAX


# 返回值
指定区间内的成员数量。


# 实例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e
(integer) 5
127.0.0.1:6379> ZADD myzset 0 f 0 g
(integer) 2
127.0.0.1:6379> ZLEXCOUNT myzset - +
(integer) 7
127.0.0.1:6379> ZLEXCOUNT myzset [b [f
(integer) 5
  • 7 Zrange

Redis Zrange 返回有序集中,指定区间内的成员。
其中成员的位置按分数值递增(从小到大)来排序。
具有相同分数值的成员按字典序(lexicographical order )来排列。
如果你需要成员按
值递减(从大到小)来排列,请使用 ZREVRANGE 命令。
下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。

# 语法
redis 127.0.0.1:6379> ZRANGE key start stop [WITHSCORES]


# 返回值
指定区间内,带有分数值(可选)的有序集成员的列表。

# 实例
127.0.0.1:6379> zadd myset 1 one 2  two 3  three 4  four 5  five 6  six 7  seven 
(integer) 7

127.0.0.1:6379> ZRANGE myset 0 -1 WITHSCORES                    # 显示整个有序集成员
 1) "one"
 2) "1"
 3) "two"
 4) "2"
 5) "three"
 6) "3"
 7) "four"
 8) "4"
 9) "five"
10) "5"
11) "six"
12) "6"
13) "seven"
14) "7"
             

127.0.0.1:6379> ZRANGE myset 1 2 WITHSCORES                     # 显示有序集下标区间 1 至 2 的成员
1) "two"
2) "2"
3) "three"
4) "3"

    
127.0.0.1:6379> ZRANGE myset 0 200000 WITHSCORES            # 测试 end 下标超出最大下标时的情况
 1) "one"
 2) "1"
 3) "two"
 4) "2"
 5) "three"
 6) "3"
 7) "four"
 8) "4"
 9) "five"
10) "5"
11) "six"
12) "6"
13) "seven"
14) "7"

127.0.0.1:6379> ZRANGE myset 200000 3000000 WITHSCORES      # 测试当给定区间不存在于有序集时的情况
(empty list or set)

  • 8 Zrangebylex

Redis Zrangebylex 通过字典区间返回有序集合的成员。

# 语法
redis 127.0.0.1:6379> ZRANGEBYLEX key min max [LIMIT offset count]


# 返回值
指定区间内的元素列表。


# 实例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g
(integer) 7
127.0.0.1:6379>  ZRANGEBYLEX myzset - [c
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> ZRANGEBYLEX myzset - (c
1) "a"
2) "b"
127.0.0.1:6379> ZRANGEBYLEX myzset [aaa (g
1) "b"
2) "c"
3) "d"
4) "e"
5) "f"
127.0.0.1:6379> ZRANGEBYLEX myzset [a (g
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
  • 9 Zrangebyscore

Redis Zrangebyscore 返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大)次序排列。
具有相同分数值的成员按字典序来排列(该属性是有序集提供的,不需要额外的计算)。
默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。
举个例子:
ZRANGEBYSCORE zset (1 5
返回所有符合条件 1 < score <= 5 的成员,而
ZRANGEBYSCORE zset (5 (10
则返回所有符合条件 5 < score < 10 的成员。

# 语法
redis 127.0.0.1:6379> ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]


# 返回值
指定区间内,带有分数值(可选)的有序集成员的列表。


# 实例

127.0.0.1:6379> ZADD salary 2500 jack                                # 测试数据
(integer) 1 
127.0.0.1:6379> ZADD salary 5000 tom
(integer) 1
127.0.0.1:6379>  ZADD salary 12000 peter
(integer) 1

127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf                       # 显示整个有序集
1) "jack"
2) "tom"
3) "peter"


127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf WITHSCORES           # 显示整个有序集及成员的 score 值
1) "jack"
2) "2500"
3) "tom"
4) "5000"
5) "peter"
6) "12000"

127.0.0.1:6379> ZRANGEBYSCORE salary -inf 5000 WITHSCORES           # 显示工资 <=5000 的所有成员
1) "jack"
2) "2500"
3) "tom"
4) "5000"

127.0.0.1:6379> ZRANGEBYSCORE salary (5000 400000               # 显示工资大于 5000 小于等于 400000 的成员
1) "peter"
  • 10 Zrank

Redis Zrank 返回有序集中指定成员的排名。其中有序集成员按分数值递增(从小到大)顺序排列。

# 语法
redis 127.0.0.1:6379> ZRANK key member

# 返回值
如果成员是有序集 key 的成员,返回 member 的排名。 如果成员不是有序集 key 的成员,返回 nil 。


# 实例

127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES                    # 显示所有成员及其 score 值
1) "jack"
2) "2500"
3) "tom"
4) "5000"
5) "peter"
6) "12000"

127.0.0.1:6379> ZRANK salary tom                     # 显示 tom 的薪水排名,第二
(integer) 1
  • 11 Zrem

Redis Zrem 命令用于移除有序集中的一个或多个成员,不存在的成员将被忽略。
当 key 存在但不是有序集类型时,返回一个错误。
注意: 在 Redis 2.4 版本以前, ZREM 每次只能删除一个元素。

# 语法
redis 127.0.0.1:6379> ZREM key member [member ...]


# 返回值
被成功移除的成员的数量,不包括被忽略的成员。


# 实例

# 测试数据

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> zadd myzset 8 eight 9 nine 10 ten
(integer) 3
127.0.0.1:6379> zrange myzset 0 -1
1) "eight"
2) "nine"
3) "ten"
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "eight"
2) "8"
3) "nine"
4) "9"
5) "ten"
6) "10"


# 移除单个元素
127.0.0.1:6379> zrem myzset nine
(integer) 1

127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "eight"
2) "8"
3) "ten"
4) "10"


# 移除多个元素

127.0.0.1:6379> zrem myzset eight ten
(integer) 2
127.0.0.1:6379> zrange myzset 0 -1 withscores
(empty list or set)


# 移除不存在元素

127.0.0.1:6379> zrem myzset seven
(integer) 0
  • 12 Zremrangebylex

Redis Zremrangebylex 命令用于移除有序集合中给定的字典区间的所有成员。

# 语法
redis 127.0.0.1:6379> ZREMRANGEBYLEX key min max

# 返回值
被成功移除的成员的数量,不包括被忽略的成员。


# 实例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> ZADD myzset 0 aaaa 0 b 0 c 0 d 0 e
(integer) 5
127.0.0.1:6379> ZADD myzset 0 foo 0 zap 0 zip 0 ALPHA 0 alpha
(integer) 5
127.0.0.1:6379> ZRANGE myzset 0 -1
 1) "ALPHA"
 2) "aaaa"
 3) "alpha"
 4) "b"
 5) "c"
 6) "d"
 7) "e"
 8) "foo"
 9) "zap"
10) "zip"
127.0.0.1:6379> ZREMRANGEBYLEX myzset [alpha [omega
(integer) 6
127.0.0.1:6379> ZRANGE myzset 0 -1
1) "ALPHA"
2) "aaaa"
3) "zap"
4) "zip"
  • 13 Zremrangebyrank

Redis Zremrangebyrank 命令用于移除有序集中,指定排名(rank)区间内的所有成员。

# 语法
redis 127.0.0.1:6379> ZREMRANGEBYRANK key start stop

# 返回值
被移除成员的数量。

# 实例

127.0.0.1:6379> ZADD salary 2000 jack
(integer) 1
127.0.0.1:6379> ZADD salary 5000 tom
(integer) 1
127.0.0.1:6379> ZADD salary 3500 peter
(integer) 1
127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES  
1) "jack"
2) "2000"
3) "peter"
4) "3500"
5) "tom"
6) "5000"
127.0.0.1:6379>  ZREMRANGEBYRANK salary 0 1             # 移除下标 0 至 1 区间内的成员
(integer) 2
127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES           # 有序集只剩下一个成员
1) "tom"
2) "5000"
  • 14 Zremrangebyscore

Redis Zremrangebyscore 命令用于移除有序集中,指定分数(score)区间内的所有成员。

# 语法
redis 127.0.0.1:6379> ZREMRANGEBYSCORE key min max


# 返回值
被移除成员的数量。


# 实例
redis 127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES          # 显示有序集内所有成员及其 score 值
1) "tom"
2) "2000"
3) "peter"
4) "3500"
5) "jack"
6) "5000"

redis 127.0.0.1:6379> ZREMRANGEBYSCORE salary 1500 3500      # 移除所有薪水在 1500 到 3500 内的员工
(integer) 2

redis> ZRANGE salary 0 -1 WITHSCORES          # 剩下的有序集成员
1) "jack"
2) "5000"
  • 15 Zrevrange

Redis Zrevrange 命令返回有序集中,指定区间内的成员。
其中成员的位置按分数值递减(从大到小)来排列。
具有相同分数值的成员按字典序的逆序(reverse lexicographical order)排列。
除了成员按分数值递减的次序排列这一点外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一样。

# 语法
redis 127.0.0.1:6379> ZREVRANGE key start stop [WITHSCORES]


# 返回值
指定区间内,带有分数值(可选)的有序集成员的列表。


# 实例

127.0.0.1:6379> ZRANGE salary 0 -1 withscores                   # 递增排列
1) "jack"
2) "2000"
3) "peter"
4) "3500"
5) "tom"
6) "5000"
127.0.0.1:6379> ZREVRANGE salary 0 -1 WITHSCORES                 # 递减排列
1) "tom"
2) "5000"
3) "peter"
4) "3500"
5) "jack"
6) "2000"


  • 16 Zrevrangebyscore

Redis Zrevrangebyscore 返回有序集中指定分数区间内的所有的成员。有序集成员按分数值递减(从大到小)的次序排列。
具有相同分数值的成员按字典序的逆序(reverse lexicographical order )排列。
除了成员按分数值递减的次序排列这一点外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一样。

# 语法
redis 127.0.0.1:6379> ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]


# 返回值
指定区间内,带有分数值(可选)的有序集成员的列表。

# 实例
127.0.0.1:6379> ZADD salary 10086 jack
(integer) 1
127.0.0.1:6379> ZADD salary 5000 tom
(integer) 1
127.0.0.1:6379> ZADD salary 7500 peter
(integer) 1
127.0.0.1:6379> ZADD salary 3500 joe
(integer) 1

127.0.0.1:6379> ZREVRANGEBYSCORE salary +inf -inf   # 逆序排列所有成员
1) "jack"
2) "peter"
3) "tom"
4) "joe"

127.0.0.1:6379> ZREVRANGEBYSCORE salary 10000 2000  # 逆序排列薪水介于 10000 和 2000 之间的成员
1) "peter"
2) "tom"
3) "joe"
  • 17 Zrevrank

Redis Zrevrank 命令返回有序集中成员的排名。其中有序集成员按分数值递减(从大到小)排序。
排名以 0 为底,也就是说, 分数值最大的成员排名为 0 。
使用 ZRANK 命令可以获得成员按分数值递增(从小到大)排列的排名。

# 语法
redis 127.0.0.1:6379> ZREVRANK key member


# 返回值
如果成员是有序集 key 的成员,返回成员的排名。 如果成员不是有序集 key 的成员,返回 nil 。


# 实例

127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES     # 测试数据
1) "jack"
2) "2000"
3) "changyue"
4) "2500"
5) "peter"
6) "3500"
7) "tom"
8) "5000"

127.0.0.1:6379> ZREVRANK salary peter       # peter 的工资排第二
(integer) 1
127.0.0.1:6379> ZREVRANK salary tom         # tom 的工资最高
(integer) 0

  • 18 Zscore

Redis Zscore 命令返回有序集中,成员的分数值。 如果成员元素不是有序集 key 的成员,或 key 不存在,返回 nil 。

# 语法
redis 127.0.0.1:6379> ZSCORE key member


# 返回值
成员的分数值,以字符串形式表示。


# 实例

127.0.0.1:6379>  ZRANGE salary 0 -1 WITHSCORES            # 测试数据
1) "jack"
2) "2000"
3) "changyue"
4) "2500"
5) "peter"
6) "3500"
7) "tom"
8) "5000"
127.0.0.1:6379> ZSCORE salary peter                       # 注意返回值是字符串
"3500"
  • 19 Zunionstore

Redis Zunionstore 命令计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。
默认情况下,结果集中某个成员的分数值是所有给定集下该成员分数值之和 。

# 语法
redis 127.0.0.1:6379> ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]


# 返回值
保存到 destination 的结果集的成员数量。


# 实例
127.0.0.1:6379> zadd pro 0 zero 1 one 2 two
(integer) 3
127.0.0.1:6379> zadd other 3 three 4 four 5 five
(integer) 3

127.0.0.1:6379> zrange pro 0 -1
1) "zero"
2) "one"
3) "two"
127.0.0.1:6379> zrange other 0 -1
1) "three"
2) "four"
3) "five"

127.0.0.1:6379> ZUNIONSTORE salary 2 pro other  WEIGHTS 1 3
(integer) 6

127.0.0.1:6379> zrange salary 0 -1 withscores
 1) "zero"
 2) "0"
 3) "one"
 4) "1"
 5) "two"
 6) "2"
 7) "three"
 8) "9"
 9) "four"
10) "12"
11) "five"
12) "15"
  • 20 Zscan

Redis Zscan 命令用于迭代有序集合中的元素(包括元素成员和元素分值)

# 语法
redis 127.0.0.1:6379> redis 127.0.0.1:6379> ZSCAN key cursor [MATCH pattern] [COUNT count]


# 返回值
返回的每个元素都是一个有序集合元素,一个有序集合元素由一个成员(member)和一个分值(score)组成。


# 实例

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

推荐阅读更多精彩内容