Redis從入門到實戰(zhàn):實戰(zhàn)篇

前言

之前只是在項目簡單使用了Redis(只是充當緩存層實現(xiàn))洗出,對Redis的體系技術(shù)沒深入了解,最近時間比較充裕图谷,所以再次復習鞏固Redis翩活,然后打算寫幾篇博客記錄以及分享所復習的Redis知識阱洪。

  1. Redis從入門到實戰(zhàn):入門篇
  2. Redis從入門到實戰(zhàn):實戰(zhàn)篇
  3. Redis從入門到實戰(zhàn):進階篇
  4. Redis從入門到實戰(zhàn):完結(jié)篇
Redis從入門到實戰(zhàn):實戰(zhàn)篇
  1. Redis Java客戶端介紹
  2. Jedis操作Redis
  3. SpringData-Redis操作Redis
  4. SpringBoot操作Redis

Redis Java客戶端介紹

Redis Java客戶端主要有三種:Jedis、Lettuce菠镇、Redisson冗荸。

Jedis
  1. Jedis是Redis的Java實現(xiàn)的客戶端,其API提供了比較全面的Redis命令的支持利耍。
  2. Jedis中的方法調(diào)用是比較底層的暴露的Redis的API蚌本,也即Jedis中的Java方法基本和Redis的API保持著一致,了解Redis的API隘梨,也就能熟練的使用Jedis程癌。
  3. Jedis使用阻塞的I/O,且其方法調(diào)用都是同步的轴猎,程序流需要等到sockets處理完I/O才能執(zhí)行嵌莉,不支持異步。Jedis客戶端實例不是線程安全的捻脖,所以需要通過連接池來使用Jedis锐峭。
  4. Jedis僅支持基本的數(shù)據(jù)類型如:String、Hash可婶、List沿癞、Set、Sorted Set矛渴。
Lettuce
  1. Lettuce是高級Redis客戶端椎扬,用于線程安全同步,異步和響應使用曙旭,支持集群盗舰,Sentinel,管道和編碼器桂躏。目前springboot默認使用的客戶端钻趋。
  2. Lettuce基于Netty框架的事件驅(qū)動的通信層,其方法調(diào)用是異步的剂习。Lettuce的API是線程安全的蛮位,所以可以操作單個Lettuce連接來完成各種操作。
Redisson
  1. Redisson實現(xiàn)了分布式和可擴展的Java數(shù)據(jù)結(jié)構(gòu)鳞绕,提供很多分布式相關(guān)操作服務失仁,例如,分布式鎖们何,分布式集合萄焦,可通過Redis支持延遲隊列。和Jedis相比,功能較為簡單拂封,不支持字符串操作茬射,不支持排序、事務冒签、管道在抛、分區(qū)等Redis特性。Redisson的宗旨是促進使用者對Redis的關(guān)注分離萧恕,從而讓使用者能夠?qū)⒕Ω械胤旁谔幚順I(yè)務邏輯上刚梭。
  2. Redisson中的方法則是進行比較高的抽象,每個方法調(diào)用可能進行了一個或多個Redis方法調(diào)用票唆。
  3. Redisson基于Netty框架的事件驅(qū)動的通信層朴读,其方法調(diào)用是異步的。Redisson的API是線程安全的走趋,所以可以操作單個Redisson連接來完成各種操作磨德。
  4. Redisson不僅提供了一系列的分布式Java常用對象,基本可以與Java的基本數(shù)據(jù)結(jié)構(gòu)通用吆视,還提供了許多分布式服務,其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service)酥宴。

Jedis操作Redis

上面介紹了三種Redis Java客戶端啦吧,接下來就使用Jedis操作Redis,首先引入Jedis依賴:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.1.0</version>
</dependency>

在使用Jedis的時候拙寡,有兩種方式可選:

  1. 單機版Jedis授滓,對應redis.clients.jedis.Jedis類。
  2. Jedis連接池肆糕,對應redis.clients.jedis.JedisPoolConfig類般堆。

單機版Jedis

單機版的Jedis就是一旦與Redis建立連接成功后,然后進行一系列對Redis的操作之后诚啃,就要關(guān)閉Redis連接對象淮摔,否則會占用系統(tǒng)資源。

@Test
public void jedis(){
    Jedis jedis = null;
    try {
        jedis = new Jedis("localhost",6379);//設置地址和端口
//            jedis.auth(PASSWORD);//如果redis服務器配置了需要密碼始赎,此處必須設置
        jedis.select(5);//選擇指定數(shù)據(jù)庫
        //存儲集合到redis和橙,并取出
        jedis.lpush("names","xxxq","xxq","xq");
        System.out.println(jedis.lrange("names", 0, -1));
    }finally {
        jedis.close();
    }
}

Jedis連接池

以前我們使用MySQL、Oracle等關(guān)系型數(shù)據(jù)庫的時候造垛,都會使用數(shù)據(jù)庫連接池魔招,比如:C3P0、Druid等等五辽。在Jedis中办斑,也提供了一個Redis連接池來管理Redis連接對象,就是redis.clients.jedis.JedisPool杆逗,還有一個對Jedis連接池配置的類:redis.clients.jedis.JedisPoolConfig乡翅,下面我們對它進行配置鳞疲。

  1. 配置連接池需要一些參數(shù),把這些參數(shù)單獨放在一個配置文件中:redis.properties
    redis.host = xxx
    redis.port = 6379
    redis.password = xxx
    redis.timeout = 5000
    redis.maxTotal = 100
    redis.maxIdle = 20
    redis.minIdle = 5
    
  2. 下面封裝一個Jedis連接池工具類峦朗,簡化后續(xù)的開發(fā)工作建丧。
    public class JedisPoolUtils {
        private static JedisPool  pool = null;
    
        /**
         *  讀取屬性配置文件,配置Jedis連接池
         */
        static {
            Properties properties = new Properties();
            try {
                properties.load(JedisPoolUtils.class.getClassLoader().getResourceAsStream("redis.properties"));
            } catch (IOException e) {
                e.printStackTrace();
            }
            JedisPoolConfig poolConfig = new JedisPoolConfig();
            int maxIdle = new Integer(properties.getProperty("redis.maxIdle"));
            int minIdle = new Integer(properties.getProperty("redis.minIdle"));
            int maxTotal = new Integer(properties.getProperty("redis.maxTotal"));
            poolConfig.setMaxIdle(maxIdle);
            poolConfig.setMinIdle(minIdle);
            poolConfig.setMaxTotal(maxTotal);
            //設置主機
            String host = properties.getProperty("redis.host");
            //設置端口號
            int port = new Integer(properties.getProperty("redis.port"));
            //創(chuàng)建Jedis連接池
            pool = new JedisPool(poolConfig,host,port);
        }
        
        /**
            獲取單機版Jedis
        */
        public static Jedis getJedis(){
            return pool.getResource();
        }
    }
    
  3. 使用Jedis連接池創(chuàng)建單機版Jedis波势,測試是否配置成功翎朱。使用Jedis連接池,我們不需要手動關(guān)閉Jedis連接對象尺铣。
    public class JedisPoolTest{
        public static void main(String[] args) {
            Jedis jedis = JedisPoolUtils.getJedis();
            System.out.println("Redis服務正在運行:"+jedis.ping());
            //set命令
            jedis.set("name", "zwq");
            System.out.println(jedis.get("name"));
        }
    }
    
    執(zhí)行結(jié)果:
        Redis服務正在運行:PONG
        zwq
    

SpringData-Redis操作Redis

  1. Jedis支持五種數(shù)據(jù)類型(string/hash/list/set/zset/)的操作拴曲,但在Java中我們卻通常以類對象為主,所以在實際項目中凛忿,我們需要將Redis存儲的五種數(shù)據(jù)類型與Java對象之間進行切換澈灼,我們可以自己編寫一些工具類,實現(xiàn)兩者之間的轉(zhuǎn)換店溢,但是涉及到許多對象的時候叁熔,這其中無論工作量還是工作難度都是很大的,所以總體來說床牧,就操作對象而言荣回,使用原生的Jedis還是挺難的,好在Spring對這些進行了封裝和支持戈咳,也就是SpringData-Redis心软。
  2. 引入SpringData-Redis依賴
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
        <version>2.2.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.1.0</version>
    </dependency>
    
  3. 接下來我們使用Spring配置Jedis連接池。
    #redis.properties配置文件
    redis.host = xxx
    redis.port = 6379
    redis.password = xxx
    redis.timeout = 5000
    redis.maxTotal = 100
    redis.maxIdle = 20
    redis.minIdle = 5
    
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:p="http://www.springframework.org/schema/p" 
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">
    
        <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
            <!--Redis服務地址-->
            <property name="hostName" value="${redis.host}"/>
            <!--端口號-->
            <property name="port" value="${redis.port}"/>
            <!--如果有密碼則需要配置密碼-->
            <!--<property name="password" value="${redis.password}"/>-->
            <!--連接池配置-->
            <property name="poolConfig" ref="poolConfig"/>
        </bean>
    
        <bean id="redisTemplate"
              class="org.springframework.data.redis.core.RedisTemplate"
              p:connection-factory-ref="connectionFactory"/>
    
        <!--加載屬性文件-->
        <context:property-placeholder location="classpath:redis.properties"/>
    
        <!--Spring整合配置著蛙,連接池配置-->
        <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
            <!--最大連接數(shù)-->
            <property name="maxTotal" value="${redis.maxTotal}"/>
            <!--最大空閑數(shù)-->
            <property name="maxIdle" value="${redis.maxIdle}"/>
            <!--最大等待時間-->
            <property name="maxWaitMillis" value="20000"/>
            <!--最小空閑數(shù)-->
            <property name="minIdle" value="${redis.minIdle}"/>
        </bean>
    </beans>
    
  4. 上面配置了RedisTemplate删铃,因為普通的Redis連接對象沒有辦法直接將Java對象直接存入Redis內(nèi)存中,我們需要替代的方案:將對象序列化(可以簡單的理解為實現(xiàn)Serializable接口)踏堡。我們可以把對象序列化之后存入Redis緩存中猎唁,然后在取出的時候又通過轉(zhuǎn)換器,將序列化之后的對象反序列化回對象暂吉,這樣就完成了我們的要求胖秒。RedisTemplate可以幫助我們完成這份工作,它會找到對應的序列化器去轉(zhuǎn)換Redis的鍵值慕的。
  5. 創(chuàng)建用戶實體類阎肝,實現(xiàn)Serializable接口。
    @Data
    public class User implements Serializable {
        private String name;
        private Integer age;
    }
    
  6. 測試Spring配置是否成功肮街。
    @Test
    public void springDataRedis(){
        ApplicationContext context = new ClassPathXmlApplicationContext("redis.xml");
        RedisTemplate template = context.getBean(RedisTemplate.class);
        User user = new User();
        user.setName("zhangsan");
        user.setAge(22);
        template.opsForValue().set("zhangsan",user);
        User u = (User) template.opsForValue().get("zhangsan");
        System.out.println(u);
    }
    運行結(jié)果:
        User(name=zhangsan, age=22)
    
  7. 從運行結(jié)果來看风题,SpringData-Redis已經(jīng)自動幫我們序列化對象與反序列化對象了,使用起來非常簡便。但是當我們查看Redis服務器的時候沛硅,發(fā)現(xiàn)存入的數(shù)據(jù)亂碼了眼刃,如下圖所示:


    在這里插入圖片描述
  8. 上面說了RedisTemplate通過序列化器來轉(zhuǎn)換Redis的鍵值,而RedisTemplate默認采用的是JDK的序列化策略摇肌,保存的key和value都是采用此序列化器完成的擂红。出現(xiàn)上面問題說明就是JDK序列化器在序列化與反序列化時編碼問題,我們可以更改RedisTemplate序列化器围小,除了JDK序列化器JdkSerializationRedisSerializer昵骤,還有一個字符串序列化器StringRedisSerializer,因為Redis的key都是字符串類型肯适,所以我們將key的序列化器改為StringRedisSerializer变秦,而Value使用默認的JdkSerializationRedisSerializer欺旧。
  9. 接下來按照上面總結(jié)的原因來更改上面配置文件:redis.xml
    <bean id="redisTemplate"
                  class="org.springframework.data.redis.core.RedisTemplate"
                  p:connection-factory-ref="connectionFactory"
                p:keySerializer-ref="stringSerializer"
                p:valueSerializer-ref="jdkSerializer"/>
        
    <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" id="stringSerializer"/>
    <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" id="jdkSerializer"/>
    
    在這里插入圖片描述

    從上圖來看羽历,修改序列化器之后礼患,key已經(jīng)不再亂碼了页屠,但是值又亂碼了。按照上面的分析可以將value的序列化器改為StringRedisSerializer就不會亂碼了咸灿。

SpringBoot操作Redis

上面我們已經(jīng)介紹了原生Jedis操作Redis與SpringData-Redis操作Redis郑趁,雖然沒有講大量的API齐饮,但是我們已經(jīng)學會怎么使用了纬凤,剩下的就是大家自己來操作API實現(xiàn)效果了饺窿。接下來再介紹在SpringBoot中如何操作Redis。不管是SpringData-Redis移斩,還是在SpringBoot中,都是通過RedisTemplate操作Redis绢馍,只不過SpringBoot做了更多的封裝向瓷,讓我們操作Redis更加簡便。接下來先介紹RedisTemplate舰涌。

RedisTemplate

  1. RedisTemplate只是提供操作Redis的模板API猖任,底層還是使用Redis Java客戶端來實現(xiàn)。


    在這里插入圖片描述
  2. 這里說一個細節(jié)瓷耙,SpringBoot2.0之前默認是使用Jedis客戶端底層實現(xiàn)朱躺,SpringBoot2.0之后就改為使用Lettuce客戶端底層實現(xiàn),如果需要在SpringBoot2.0之后使用Jedis搁痛,則需要排除Lettuce依賴长搀,如下所示:
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
        <exclusions>
            <exclusion>
                <groupId>io.lettuce</groupId>
                <artifactId>lettuce-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  3. 接下來配置Redis連接池,SpringBoot省去了繁雜的XML配置鸡典,直接在application.properties配置即可源请。
    #redis配置
    #Redis服務器地址
    spring.redis.host=127.0.0.1
    #Redis服務器連接端口
    spring.redis.port=6379
    # Redis服務器連接密碼(默認為空)
    spring.redis.password=
    #Redis數(shù)據(jù)庫索引(默認為0)
    spring.redis.database=0  
    #連接池最大連接數(shù)(使用負值表示沒有限制)
    spring.redis.jedis.pool.max-active=50
    #連接池最大阻塞等待時間(使用負值表示沒有限制)
    spring.redis.jedis.pool.max-wait=3000ms
    #連接池中的最大空閑連接
    spring.redis.jedis.pool.max-idle=20
    #連接池中的最小空閑連接
    spring.redis.jedis.pool.min-idle=2
    #連接超時時間(毫秒)
    spring.redis.timeout=5000ms
    
  4. 編寫測試代碼,測試配置是否成功。
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class AppTest {
    
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
    
        @Test
        public void test(){
            stringRedisTemplate.opsForValue().set("name","zwq");
            System.out.println(stringRedisTemplate.opsForValue().get("name"));
        }
    }
    運行結(jié)果:
        zwq
    
  5. 上面使用的是StringRedisTemplate谁尸,它繼承了RedisTemplate舅踪,從名字看它就是支持Value為String類型的讀寫操作,也就是Value使用了StringRedisSerializer序列化器良蛮,截圖驗證:


    在這里插入圖片描述

    在這里插入圖片描述
  6. 我們驗證讀寫對象會不會出現(xiàn)之前使用SpriingData-Redis的亂碼問題抽碌,編寫一個用戶實體類
    @Data
    public class User implements Serializable {
        private String name;
        private Integer age;
    }
    
  7. 上面都已經(jīng)配置好了,所以直接編寫測試代碼即可决瞳。
    @Test
    public void saveUser(){
        User user = new User();
        user.setName("zhangsan");
        user.setAge(22);
        redisTemplate.opsForValue().set("zhangsan",user);
        User zhangsan = (User) redisTemplate.opsForValue().get("zhangsan");
        System.out.println(zhangsan);
    }
    運行結(jié)果:
        User(name=zhangsan, age=22)
    
  8. 在程序代碼中讀寫也是沒問題货徙,但是寫入到Redis服務器上就亂碼了。


    在這里插入圖片描述
  9. 這個原因也是序列化與反序列化過程中產(chǎn)生的問題瞒斩,接下來開始指定序列化器破婆。在SpringBoot中沒有了xml配置,所以需要編寫一個配置類來配置序列化器胸囱,如下代碼:
    @Configuration
    public class RedisCnfig {
    
        @Autowired
        RedisConnectionFactory factory;
    
        @Bean
        public RedisTemplate<Object, Object> redisTemplate() {
            RedisTemplate redisTemplate = new RedisTemplate();
            redisTemplate.setConnectionFactory(factory);
            //StringRedisSerializer序列化器
            StringRedisSerializer stringRedisSerializer =new StringRedisSerializer();
            //JdkSerializationRedisSerializer序列化器
            JdkSerializationRedisSerializer jdkRedisSerializer = new JdkSerializationRedisSerializer();
            redisTemplate.setValueSerializer(jdkRedisSerializer);
            redisTemplate.setKeySerializer(stringRedisSerializer);
            redisTemplate.afterPropertiesSet();
            return redisTemplate;
        }
    }
    
  10. 再執(zhí)行上面測試代碼祷舀,發(fā)現(xiàn)key已經(jīng)不亂碼了,而Value還是出現(xiàn)亂碼烹笔。


    在這里插入圖片描述
  11. 通過把Value的序列化器修改為JSON序列化器裳扯,也就是對象與JSON之間的轉(zhuǎn)換,這樣就可以解決亂碼的問題谤职。
    @Configuration
    public class RedisCnfig {
    
        @Autowired
        RedisConnectionFactory factory;
    
        @Bean
        public RedisTemplate<Object, Object> redisTemplate() {
            RedisTemplate redisTemplate = new RedisTemplate();
            redisTemplate.setConnectionFactory(factory);
            //StringRedisSerializer序列化器
            StringRedisSerializer stringRedisSerializer =new StringRedisSerializer();
            //JdkSerializationRedisSerializer序列化器
            JdkSerializationRedisSerializer jdkRedisSerializer = new JdkSerializationRedisSerializer();
            //Json序列化器
            GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
    //        redisTemplate.setValueSerializer(jdkRedisSerializer);
            redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
            redisTemplate.setKeySerializer(stringRedisSerializer);
            redisTemplate.afterPropertiesSet();
            return redisTemplate;
        }
    }
    
    除了改配置之外饰豺,還需要引入下面依賴。
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.5.4</version>
    </dependency>
    
  12. 再執(zhí)行上面的測試代碼允蜈,發(fā)現(xiàn)Key冤吨、Value都不會亂碼了。


    在這里插入圖片描述

總結(jié)

  1. 這樣就把Java操作Redis的技術(shù)講完了饶套,還是和上面說了漩蟆,這里講的API比較少,我們還是得自己敲妓蛮,把API練熟悉了怠李,才能把Redis運用自如,雖然我也還沒把Redis運用自如蛤克。
  2. 大家覺得OK的話捺癞,不妨來個??或者關(guān)注也行。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末构挤,一起剝皮案震驚了整個濱河市髓介,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌筋现,老刑警劉巖版保,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呜笑,死亡現(xiàn)場離奇詭異,居然都是意外死亡彻犁,警方通過查閱死者的電腦和手機叫胁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汞幢,“玉大人驼鹅,你說我怎么就攤上這事∩瘢” “怎么了输钩?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仲智。 經(jīng)常有香客問我买乃,道長,這世上最難降的妖魔是什么钓辆? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任剪验,我火速辦了婚禮,結(jié)果婚禮上前联,老公的妹妹穿的比我還像新娘功戚。我一直安慰自己,他們只是感情好似嗤,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布啸臀。 她就那樣靜靜地躺著,像睡著了一般烁落。 火紅的嫁衣襯著肌膚如雪乘粒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天伤塌,我揣著相機與錄音谓厘,去河邊找鬼。 笑死寸谜,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的属桦。 我是一名探鬼主播熊痴,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼聂宾!你這毒婦竟也來了果善?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤系谐,失蹤者是張志新(化名)和其女友劉穎巾陕,沒想到半個月后讨跟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡鄙煤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年晾匠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梯刚。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡凉馆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出亡资,到底是詐尸還是另有隱情澜共,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布锥腻,位于F島的核電站嗦董,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瘦黑。R本人自食惡果不足惜京革,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望供璧。 院中可真熱鬧存崖,春花似錦、人聲如沸睡毒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽演顾。三九已至供搀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钠至,已是汗流浹背葛虐。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留棉钧,地道東北人屿脐。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像宪卿,于是被迫代替她去往敵國和親的诵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354