Redis__命令大全__2018-08版

为方便查阅,一篇文章介绍全部的命令,14类

1 2 3 4 5 6 7
Strings Lists Sets Hashes Sorted Sets Pub/Sub Connection
8 9 10 11 12 13 14
Server Scripting Keys HyperLogLog Geo Transactions(事务) Cluster(集群)

Strings

  • 基本字符串命令
  • 字符串在长度小于 1M 之前,扩容空间采用加倍策略,也就是保留 100% 的冗余空间。当长度超过 1M 之后,为了避免加倍后的冗余空间过大而导致浪费,每次扩容只会多分配 1M 大小的冗余空间。
命令 描述 语法
Set 指定键设置任意值。存在则覆盖
XX :只在键已经存在时,才对键进行设置操作。
NX :只在键不存在时,才对键进行设置操作
Set key value [EX seconds] [PX milliseconds] [NX|XX]
SetNX Set if Not eXists SetNX key value
SetEX 指定键设置任意值,生存时间以秒为单位 SetEX key seconds value
PSetEX 指定键设置任意值,生存时间以毫秒为单位 PSetEX key milliseconds value
MSet 指多个定键设置任意值。存在则覆盖,操作具有原子性 MSet key value [key value ...]
MSetNX 指多个定键设置任意值,不允许指定键已存在,原子操作 MSetNX key value [key value ...]
Get 返回指定键的字符串值,不存在返回nil,不是字符串则报错 Get key
MGet 同Get,只是可以指定多个键 MGet key [key ...]
Del 删除指定键,还可以删除其他类型的值 Del key [key ...]
StrLen 获取指定键的值为字符串的长度,非字符串则报错 StrLen key
  • 修改字符串命令
命令 描述 语法
Append 追加字符串,不存在建立 Append key value
GetRange 的到指定范围字符串的子串,start和end可以为负 GetRange key start end
GetSet 得到旧值,设置新值,不存在返回nil,与Incr命令配合进行计数功能 GetSet key value
SetRange 替换指定字符串的一部分,offset超过原长度时,则补0 SetRange key offset value
  • 修改数字值命令,以下命令键不存在时先赋值0,再操作
命令 描述 语法
Decr 减一 Decr key
DecrBy 减指定数,可以为负 DecrBy key decrement
Incr 加一 Incr key
IncrBy 加指定数,可以为负 IncrBy key decrement
IncrByFloat 对浮点数加指定值 IncrByFloat key decrement
  • 位图命令
命令 描述 语法
SetBit 设置或者清空指定位置的Bit值 SetBit
GetBit 获取指定位置的Bit值 GetBit
BitCount 统计字符串指定起始位置为1比特的位数 BitCount key [start end]
BItPos 获取字符串里第一个被设置为1Bit或者0Bit的位置 BItPos
Bitop 对一个或者多个二进制位进行位运算 Bitop
BitField 对指定的字符串进行位数组寻址,位值自增自减操作 BitField

Lists

  • Redis 的列表相当于 Java 语言里面的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n),这点让人非常意外。
命令 描述 语法
LPush 左边插入一个或者多个值,不存在则先创建 Push key value [value ...]
RPush 右边插入一个或者多个值 RPush key value [value ...]
LPop 左边读出并且删除一个元素,不存在返回nil LPop key
RPop 右边读出并且删除一个元素,不存在返回nil RPop key
LIndex 通过下标获取一个元素值,index可以为负 LIndex key index
LRem 列表删除指定元素,count可以为负,返回值为删除的个数 LRem key count value
LRange 获取指定范围列表元素,start和stop可以为负 LRange key start stop
LLen 获取元素个数 LLen key
LSet 设置列表指定位置的元素值 LSet key index value
LTrim 对指定列表范围的元素进行修剪,保留start和stop之间的值,删除其他,可以为负 LTrim key start stop
LInsert 在指定位置插入一个新元素 LInsert key Before|After pivot value
LPushX 只有列表存在时,从左边插入元素,返回列表长度 LPushX key value
RPopLPush 删除source右面最后一个元素,并追加到destination左边 RPopLPush source destination
RPushX 只有列表存在时,从右边插入元素 RPushX key value
BLPop 阻塞式LPop,timeout=0时为无过期时间 BLPop key [key ...] timeout
BRPop 阻塞式RPop BRPop key [key ...] timeout
BRPopLPush 阻塞式BRPopLPush BRPopLPush source destination timeout
  • LInsert Before指定元素之前插入,After指定元素之后插入。pivot为列表里面指定的值,key不存在时命令不指定,插入成功返回列表长度,pivot不存在时返回-1

Hashes

基本操作
命令 描述 语法
HSet 插入一个键值对,存在则重写 HSet key field value
HGet 返回指定键的一个值 HGet key field
HMSet 插入一个或者多个键值对 HMSet key field value [field value ...]
HMGet 返回指定键的一个或者多个值 HMGet key field [field ...]
HGetAll 返回所有的键值对,键值对作为数组元素奇偶排列 HGetAll key
HExists 返回是否存在指定的标志 HExists key field
HDel 删除指定键值对 HDel key field [field ...]
HLen 包含的键值对数量 HLen key
HSetNX 仅对指定散列表的新键设置值,已存在时无操作 HSetNX key field value
HStrLen 返回散列表指定键的字符串长度 HStrLen key field
HVals 返回散列表所有的键的值 HVals key
HIncrBy 对散列表指定的键的整型值进行增量操作,不存在时先赋0,再操作 HIncrBy key field increment
HIncrByFloat 对散列表指定的键的浮点型值进行增量操作,不存在时先赋0,再操作 HIncrByFloat key field increment
HKeys 返回指定散列表表的所有键名 HKeys key
HScan 增量迭代返回列表中的指定键值对 同SScan

Sets

  • Redis 的集合相当于 Java 语言里面的 HashSet,它内部的键值对是无序的唯一的。它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值NULL。
基本命令
命令 描述 语法
SAdd 添加一个或者多个元素到集合,存在则忽略添加 SAdd Key member [member ...]
SMembers 返回集合的所有元素 SMembers Key
SRem 删除集合中指定的元素,不存在则忽略 SRem key member [member ...]
SCard 返回集合中元素数量 SCard key
SRandMember 从集合中随机返回一个或者多个元素 SRandMember key [count]
SMove 把集合中一个元素移动到另外一个集合,原集合不存在则忽略,目标集合存在则只删除源集合 SMove source destination member
SPop 从集合中随机删除并返回一个或者多个元素 SPop key [count]
SIsMember 集合成员是否存在,存在返回1,否则为0 SIsMember key member
SScan 增量迭代返回集合元素 SScan key cursor [MATCH patttern] [COUNT count]
  • SRandMember count < 0 并且绝对值大于全部个数则返回值里面会出现一个元素多次出现情况,key不存在返回nil
  • SScan和SMembers:SScan和SMembers在高并发大集合时存在性能问题,SScan可以避免,但是SScan存在时效性,元素返回多次的可能,每次最多返回十几个元素
合并交差
命令 描述 语法
SUnion 并,不重复 SUnion key [key ...]
SUnionStore 带存储的并 SUnionStore destination key [key ...]
SInter SInter key [key ...]
SInterStore 带存储的交 SInterStore destination key [key ...]
SDiff 差集,前面key减去后面的key SDiff key [key ...]
SDiffStore 带存储的差集 SDiff destination key [key ...]

ZSets

  • zset 可能是 Redis 提供的最为特色的数据结构,它也是在面试中面试官最爱问的数据结构。它类似于 Java 的 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。它的内部实现用的是一种叫做「跳跃列表」的数据结构。...
命令 描述 语法
ZAdd 有序集合添加键值对 ZAdd key [NX|XX] [CH] [INCR] score member [score member ...]
ZRange 返回指定范围有序集合的键或键值对 ZRange key start stop [WRRHSCORES]
ZCount 返回有序集合指定值范围的个数 ZCount key min max
ZRem 删除有序集合指定键值对 ZRem key member [member ...]
ZCard 返回有序集合键值对个数 ZCard key
ZIncrBy 对有序集合指定键的值进行增量操作 ZIncrBy key increment member
ZLexCount 返回有序集合指定键范围的个数 ZLexCount min max
ZScore 返回游戏集合指定键对应的值 ZScore key member
ZRank 返回有序集合指定值排名序号 ZRank key member
ZUnionStore 带存储功能的多有序集合并运算 ZUnionStore destination key [key ...] [WEIGHTS weight] [SUM|MIN|MAX]
ZinterStore 带存储功能的多有序集合交运算 ZinterStore destination key [key ...] [WEIGHTS weight] [SUM|MIN|MAX]
ZremRangeByLex 在同值情况下,删除指定范围的键值对 ZremRangeByLex key min max
ZrangeByLex 在同值情况下,返回指定范围的键值对 ZrangeByLex key min max [LIMIT offset count]
ZrangeByScore 返回指定范围有序集的键或键值对列表 ZrangeByScore key min max [WITHSCORES] [LIMIT offset count]
ZremRangeByScore 删除指定大小范围的键值对 ZremRangeByScore key min max
ZremRangeByRank 删除指定小标范围的键值对 ZremRangeByRank
ZrevRange 返回指定值下标范围的固定排序键或键值对列表 ZrevRange key start stop [WITHSCORES]
ZrevRangeByLex 同值情况下返回指定键范围倒序键或键值对列表 ZrevRangeByLex key max min [WITHSCORES] [LIMIT offset count]
ZrevRangeByScore 返回指定大小范围的固定排序键或键值对列表 ZrevRangeByScore key max min [WITHSCORES] [LIMIT offset count]
ZrevRank 返回指定键在有序集合的排名 ZrevRankkey member
ZScan 增量迭代返回所有有序集合中的键值对列表 ZScan cursor [MATCH pattern] [COUNT count]

HyperLogLog

命令 描述 语法
PFAdd 添加到HyperLogLog PFAdd key element [element ...]
PFCount 返回指定key的近似基数 PFCount key [key ...]
PFMerge 将多个添加到HyperLogLog合并成一个 PFMerge destkey sourcekey [sourcekey ...]
  • pf 的内存占用为12k

GeoHash

命令 描述 语法
GEOAdd 将指定的空间元素添加到指定的key里,返回新添加的元素个数,不包括更新的元素个数 GEOAdd key longitude latitude member [longitude latitude member ...]
GEODist 返回指定位置之间的距离,unit为返回的距离单位(m,km,mi,ft) GEODist key member1 member2 [unit]
GEOHash 返回一个标准的地理空间GEOHash字符串 GEOHash key member member2 [member ...]
GEOPos 返回地理空间的经纬度 GEOPos key member [member ...]
GEORadius 查询指定半径内所有的地理空间元素的集合 GEORadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
GEORadiusByMember 查询指定半径匹配到的地理空间元素 GEORadiusByMember key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

GEORadius

  • WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
  • WITHCOORD: 将位置元素的经度和维度也一并返回。
  • WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
  • ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
  • DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。

Pub/Sub

命令 描述 语法
Publish 发布信息到指定频道,channel频道名,返回值为收到消息的客户端数量 Publish channel message
Subscribe 订阅指定频道信息 Publish channel [channel ...]
PSubscribe 订阅指定模式的频道信息 PSubscribe pattern [pattern ...]
PunSubscribe 退订指定模式,并返回相关信息 PunSubscribe pattern [pattern ...]
UnSubscribe 退订指定频道信息 UnSubscribe channel [channel ...]
PubSub 统计Pub/Sub子系统状态的数量 subcommand [argument [argument ...]]
  • Pub/Sub的缺点就是客户端一放下线,下线后信息无法继续接收,部分信息丢失
  • PubSub subcommand为子命令,包括Channels、NumSub、NumPat。argument为对应参数
    PubSub Channels [pattern] 累出当前活动的频道,活跃为有至少一个订阅者
    PubSub NumSub [channel ...] 返回指定频道的订阅数量
    PubSub NumPat 返回指定模式的订阅数量

Connection(连接命令)

命令 描述 语法
Auth 验证 Auth password
Echo 客户端返回输入的字符串 Echo message
Ping 测试连通性 Ping 字符串
Quit 关闭连接 Quit
Select 选择一个数据库,下标值从0开始,一个新连接默认连接的数据库是DB0。 Select index

Server

命令 描述 语法
Client List 获得客户端连接信息及其数量列表 Client List
Client SetName 设置当前链接的名称 Client SetName name
Client GetName 获取当前列表的名称 Client GetName
Client Kill 关闭客户端链接 Client Kill [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]
Client Pause 暂停处理客户端请求,timeout为暂停的时间 Client Pause timeout
Command 返回redis所有命令 Command
Command Cound 统计redis所有命令总数 Command Cound
Command GetKeys 获得指定命令的所有键 Command GetKeys
Command Info 获得指定命令的详细使用信息 Command Info command-name [command-name ...]
Config Get 获取服务器端配置文件参数的值,paramenter为radis配置文件里的参数名 Config Get paramenter
Config ResetStat 复位再分配使用Info命令报告的统计 Config ResetStat
Config Set 设置配置文件中的指定参数的值 Config Set paramenter value
Config Rewrite 重写内存中的配置文件 Config Rewrite
BGRewriterAof 异步重写追加文件命令 BGRewriterAof
BGRSave 异步保存数据集到磁盘上 BGRSave
LastSave 获得最后一次同步磁盘的时间 LastSave
Save 同步数据到磁盘上 Save
DBSize 返回数据库实例里数据存储对象个数 DBSize
Debug Object 数据存储对象调试命令 Debug Object key
Debug SegFault 让Redis崩溃 Debug SegFault
FlushAll 删除所有数据库所有数据 FlushAll
FlushDB 删除当前数据库所有数据 FlushDB
Iofo 返回redis服务器的各种信息和统计数据 Iofo [section]
Monitor 持续返回服务器端处理的每条命令信息 Monitor
Role 返回主从实例所属的角色 Role
ShutDown 异步保存数据到磁盘,并关闭服务器Redis ShutDown [NOSAVE] [SAVE]
SlaveOf 将当前服务器转变为指定服务器的从属服务器 SlaveOf host port
SlowLog 管理Redis的慢速记录日志 SlowLog subcommang [argument]
SYNC 用于复制功能的内部命令 SYNC
Time 返回当前服务器时间 Time
  • Client List
  • Client Kill:[ip:port]指定客户端ip、端口号;[ID client-id]指定的客户端唯一id;TYPE指定一种特殊类型的客户端;[ADDR ip:port]为指定客户端ip、端口;SKIPME选择一种开关

Scripting(脚本命令)

命令 描述 语法
EVal 执行Lua脚本,numkeys为key的个数,key拜师在脚本中用到的键 EVal script numkeys key [key ...] arg [arg ...]
EValSha 根据给定的校验码,执行服务器端Lua脚本命令 EValSha sha1 numkeys key [key ...] arg [arg ...]
Script Load 把Lua脚本代码加载到服务缓存上,并不执行 Script Load script
Script Flush 从脚本缓存中移除所有脚本 Script Flush
Script Exists 查看指定的脚本是否已经被保存到缓存中 Script Exists script [script ...]
Script Kill 终止当前正在运行的Lua脚本 Script Kill

Keys(键命令)

命令 描述 语法
Del 删除key指定的数据存储对象 Del key [key ...]
Dump 序列化给定的key Dump key
Exists 检查指定key是否存在 Exists key [key ...]
Expire 设置key的过期时间,秒 Expire key seconds
ExpireAt 设置key的过期时间,秒用时间戳 ExpireAt key timestamp
keys 查找所有符合模式的key keys pattern
Migrate 原子性的的把当前的key转移到指定数据库(可指定服务器)COPY为保留当前数据,REPLACE是否替换目标数据库中的key Migrate host port key destinatoon-db timeout [COPY] [REPLACE]
Move 将当前数据库的key转移到指定数据库内(本机中) Move key db
Object 以内部调试方式给出key的内部信息 Object subcommand [arguments [arguments ...]]
Persist 移除key的过期时间 Persist key
PExpire 设置key的过期时间,毫秒 PExpire key milliseconds
PExpireAt 设置key的过期时间,毫秒用时间戳 PExpireAt key milliseconds-timestamp
RandomKey 从数据库随机返回一个key RandomKey
Rename 将指定key重命名,允许重复key Rename key newkey
RenameNX 将指定key重命名不存在的key RenameNX key newkey
Restore 反序列化指定key Restore key ttl serialized-value [REPLACE]
Scan 增量迭代返回当前数据库中key的数组列表 Scan cursor [MATCH pattern] [COUNT count]
Sort 对指定key对象进行排序并返回或者保存到目标key Sort key [BY pattern] [LIMIT offset count] [GET pattern] [ASC|DESC] [ALPHA] STORE destination
TTL 秒返回key的剩余生存时间 TTL key
PTTL 毫秒返回key的剩余生存时间 PTTL key
Type 返回当前key的数据结构类型 Type key
Wait 阻塞当前客户端到指定从服务器端的写操作 Wait numslaves timeout
  • 序列化生成的值有以下几个特点:

    • 它带有 64 位的校验和,用于检测错误,RESTORE 在进行反序列化之前会先检查校验和。
    • 值的编码格式和 RDB 文件保持一致。
    • RDB 版本会被编码在序列化值当中,如果因为 Redis 的版本不同造成 RDB 格式不兼容,那么 Redis 会拒绝对这个值进行反序列化操作。
    • 序列化的值不包括任何生存时间信息
  • Migrate COPY为保留当前数据,REPLACE是否替换目标数据库中的key

Transactions(事务)

命令 描述 语法
Multi 标记一个事务块的开始 Multi
Exec 执行所有事务块内的命令 Exec
Discard 取消事务 Discard
Watch 监事一个或者多个key Watch key [key ...]
UnWatch 取消WATCH命令对所有key的监视 Un Watch
  • Redis 的事务根本不能算「原子性」,而仅仅是满足了事务的「隔离性」,隔离性中的串行化——当前执行的事务有着不被其它事务打断的权利。
  • watch 会在事务开始之前盯住 1 个或多个关键变量,当事务执行时,也就是服务器收到了 exec 指令要顺序执行缓存的事务队列时,Redis 会检查关键变量自 watch 之后,是否被修改了 (包括当前事务所在的客户端)。如果关键变量被人动过了,exec 指令就会返回 null 回复告知客户端事务执行失败,这个时候客户端一般会选择重试。...
  • Redis 禁止在 multi 和 exec 之间执行 watch 指令,而必须在 multi 之前做好盯住关键变量,否则会出错。

Cluster(集群)

  • Hash Slots:Redis数据分片
  • Node:节点
  • Gossip:Redis节点之间通信协议
命令 描述 语法
Cluster Info 获取redis集群相关所有命令 Cluster Info
Cluster Meet 实现集群节点之间的通信 Cluster Meet ip:port
Cluster Replicate 把Master节点改成Slave节点 Cluster Replicate node-id
Cluster nodes 列出当前集群的所有节点 Cluster nodes
Cluster Forget 移除指定节点 Cluster Forget node-id
Cluster Reset 重新设置集合节点 Cluster Reset [HARD|SOFT]
Cluster SaveConfig 将节点的配置文件保存到磁盘 Cluster SaveConfig
Cluster Set-Config-Epoch 将新节点设置特定的新的配置时间标志 Cluster Set-Config-Epoch config-epoch
Cluster Slaves 提供为指定主节点相关的从从节点信息列表 Cluster Slaves node-id
Cluster Count-Failure-Reports 返回指定节点的故障报告数量 Cluster Count-Failure-Reports node-id
Cluster FailOver 手动从节点变为主节点 Cluster FailOver [FORCE|TAKEOVER]
ReadOnly 集群吗中的从节点开启只读模式 ReadOnly
ReadWrite 禁止读取请求跳转到集群的从节点 ReadWrite
Cluster AddSlots 把Hash插槽分配给街搜命令的服务器节点 Cluster AddSlots slot [slot ...]
Cluster SetSlot 设置节点的插槽信息 Cluster SetSlot slot IMPORTING|MIGRATING|STABLE|NODE [node-id]
Cluster GetKeysSinslot 返回链接节点指定Hash Slot 里的key Cluster GetKeysSinslot slot count
Cluster DelSlots 删除当前节点的指定插槽 Cluster DelSlots slot [slot ...]
Cluster Slots 返回与插槽相关的节点信息 Cluster Slots
Cluster KeySlot 计算key应该被放置在那个插槽上 Cluster KeySlot key
Cluster CountKeySinSlot 返回当前节点指定插槽中键的数量 Cluster CountKeySinSlot key
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容