【分布式架構(gòu)之旅-理論篇】Redis入門

前言

昨天和室友去包夜戏羽,玩了一晚上的LOL担神,跪了一整夜,但是很開心始花。從S1末開始玩LOL的我妄讯,到現(xiàn)在還是青銅孩锡,真是菜的摳腳。最近負能力滿滿的捞挥,唯有睡覺和學(xué)習(xí)才可解憂愁浮创。今天也看了慕課網(wǎng)上面的《Redis入門》,來記一下學(xué)習(xí)筆記砌函。(寫這篇文章開頭的時候應(yīng)該是一個星期之前)

DNA.png

NoSQL概述

  • NoSQL就是Not Only SQL的意思斩披,是非關(guān)系型數(shù)據(jù)庫。

  • 為什么需要NoSQL?

    • High performance - 高并發(fā)讀寫

    • Huge Storage - 海量數(shù)據(jù)的高效率存儲和訪問

    • High Scalability & High Availability - 高可擴展性和高可用性

  • NoSQL數(shù)據(jù)庫的四大分類

    • 鍵值(Key - Value)存儲:優(yōu)點是快速查詢讹俊,缺點存儲的數(shù)據(jù)缺少結(jié)構(gòu)化垦沉。

    • 列存儲:優(yōu)點是查詢比較快,擴展性比較強仍劈,缺點是功能相對局限厕倍。

    • 文檔數(shù)據(jù)庫:對應(yīng)的產(chǎn)品就是MongoDB。對數(shù)據(jù)結(jié)構(gòu)要求不是特別嚴格贩疙,查詢性能不能特別高讹弯,缺少統(tǒng)一查詢的語法。

    • 圖形數(shù)據(jù)庫:優(yōu)點是利用圖結(jié)構(gòu)相關(guān)的算法这溅,缺點是需要對整個圖進行結(jié)算才能得出結(jié)果组民,不能作為分布式的解決方案。

image.png
  • 現(xiàn)在來說說NoSQL的特點悲靴,美滋滋臭胜。
    • 易擴展
    • 靈活的數(shù)據(jù)模型
    • 高可用
    • 大數(shù)據(jù)量,高性能

Redis的概述

  • 高性能鍵值對數(shù)據(jù)庫癞尚,支持的鍵值數(shù)據(jù)類型:

    • 字符串類型 - String

    • 列表類型 - Set

    • 有序集合類型 - Sorted Set

    • 散列類型 - Hash

    • 集合類型 - List

  • Redis的應(yīng)用場景

    • 緩存

    • 任務(wù)隊列

    • 網(wǎng)站訪問統(tǒng)計

    • 應(yīng)用排行榜

    • 分布式集群架構(gòu)中的session分離


Redis在Linux上的使用

可以看我這篇文章【Linux學(xué)習(xí)】 Redis常用的一些指令


Jedis的入門

  • 我們要在Java平臺上使用redis耸三,肯定需要Jedis這個客戶端。首先在pom文件中引入Jedis的依賴
        <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
  • 普通方式創(chuàng)建Jedis對象浇揩。
    public void methodOne() {
        Jedis jedis = new Jedis("100.64.84.47", 6379);
        jedis.set("name", "cmazxiaoma");
        String value = jedis.get("name");
        System.out.println(value);
        jedis.close();
    }
  • 通過線程安全的連接池來創(chuàng)建Jedis對象仪壮。
  public void methodTwo() {
        //獲得連接池的配置對象
        JedisPoolConfig config = new JedisPoolConfig();
        //設(shè)置最大連接數(shù)
        config.setMaxTotal(30);
        //設(shè)置最大空閑連接數(shù)
        config.setMaxIdle(10);
        //獲得連接池
        JedisPool jedisPool = new JedisPool(config, "100.64.84.47", 6379);

        Jedis jedis = null;

        try {
            jedis = jedisPool.getResource();
            String value = jedis.get("name");
            System.out.println(value);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jedis != null) {
                jedis.close();
            }

            jedisPool.close();
        }
    }
}
  • 編寫測試類。
public class JedisDemo1Test {
    private JedisDemo1 demo;

    @Before
    public void setUp() {
        demo = new JedisDemo1();
    }

    @Test
    public void methodOne() throws Exception {
        demo.methodOne();
    }

    @Test
    public void methodTwo() throws Exception {
        demo.methodTwo();
    }

}
  • 運行Test Case胳徽,測試成功积锅。

    image.png

  • 我們在Xshell軟件,輸入get name指令膜廊,也可以看到輸出cmazxiaoma

    image.png


Redis的數(shù)據(jù)結(jié)構(gòu)

String

  • Key定義的注意點:

    • 不要過長淫茵。
    • 不要過短爪瓜。
    • 統(tǒng)一的命名規(guī)范。
  • 存儲String

    • 二進制安全的匙瘪,存入和獲取的數(shù)據(jù)相同铆铆。
    • Value最多可以容納的數(shù)據(jù)長度是512M蝶缀。
  • 存儲String常用的命令:

    • 賦值


      image.png
    • 取值


      image.png
    • 刪除


      image.png
    • 數(shù)值增減

如果屬性不存在的話,那么integer類型默認為0薄货。

image.png

如果name屬性的值不能轉(zhuǎn)換成integer類型翁都,那么會拋出ERR is not an integer or out of range異常。

image.png

decr指令也是一樣的谅猾。

image.png

  • 擴展命令
    incrby柄慰、decrby也是一樣的,很簡單税娜。
    image.png

append指令可以拼接字符串坐搔。

image.png

如果append key cmazxiaoma。這個key不存在的話敬矩,首先會創(chuàng)建這個key概行,然后存入cmazxiaoma內(nèi)容,接著輸出cmazxiaoma弧岳。

image.png


Hash

  • 賦值凳忙,可以使用hset myhash key value單一賦值、hmset myhash key value key value多次賦值禽炬。

    image.png

  • 取值涧卵,可以用hget myhash key單一取值、hmget myhash key key 多個取值瞎抛、hgetall取出所有key所對應(yīng)的值艺演。

    image.png

  • 刪除 ,可以用hdel myhash key刪除單一的key

    image.png

hdel myhash key key刪除多個的key桐臊。

image.png

del myhash刪除myhash中所有的key胎撤。

image.png

  • 數(shù)值增減,hincrby myhash key 100

    image.png

  • 使用hexists myhash key 判斷key是否在myhash中存在断凶,存在返回1伤提,不存在返回0

    image.png

  • hlen myhash獲取myhash中存在key的數(shù)量认烁。

    image.png

  • hkeys myhash獲取myhash中所有的key肿男。

    image.png

  • hvals myhash獲取myhash中所有的values

    image.png


List

  • 存儲list:

    • ArrayList使用數(shù)組方式
    • LinkedList使用雙向鏈表方式
  • 兩端添加

    • 使用lpush a b c 命令在左端添加却嗡,那么c肯定是在最左端舶沛。
      image.png
    • 使用rpush a b c命令在右端添加,那么c肯定是在最右端窗价。
      image.png
  • 兩端彈出

    • 使用lpop mylist彈出mylist中頭部元素如庭、rpop mylist2彈出mylist2尾部中的元素。它們都是3撼港。
      image.png
    • 我們接著來查看mylist坪它、mylist2骤竹。
      image.png
  • 查看列表
    • 使用lrange mylist 0 5來查看mylist列表,mylist插入的方式從頭結(jié)點開始添加的往毡,那么輸出肯定是321abc蒙揣。
      image.png
    • 使用lrange mylist2 0 5查看mylist2列表,mylist2插入的方式是從最右端添加的开瞭,那么輸出肯定是abc123
      image.png
image.png
  • 獲取列表元素的個數(shù)

    • 使用llen mylist命令
      image.png
  • 擴展命令

    • 使用lpushx mylist x懒震,使插入的元素在頭部位置。

      image.png

    • 使用rpushx mylist x惩阶,使插入的元素在尾部位置挎狸。

      image.png

    • 使用lrem mylist count elementcount代表是刪除的次數(shù)断楷,element代表是需要刪除的元素锨匆。如果count > 0 代表刪除的方式從頭到尾,刪除countelement冬筒,count < 0代表刪除的方式從尾到頭恐锣,刪除countelement。如果count = 0舞痰,刪除mylist中所有和element相同的元素土榴。

      image.png

      image.png

    • lrem mylist 2 test1

      image.png

    • lrem mylist -2 test1

      image.png

    • lrem mylist 0 cmazxiaoma

      image.png

    • 在某一個下標位置插入元素。lset mylist index element

      image.png

    • 在目標元素之前插入指定的元素响牛。linsert mylist before helloworl before_helloworld

      image.png

      image.png

    • 在目標元素之后插入指定的元素玷禽。linsert mylist helloworld after after_helloworld

      image.png

    • 彈出mylist中最后一個元素,并插入到mylist中的頭部呀打。rpoplpush mylist mylist

      image.png

    • rpoplpush使用場景

      image.png


Set

List類型不同的是矢赁,Set集合中不允許出現(xiàn)重復(fù)的元素。

  • 添加/刪除元素
    • 添加 sadd myset a b c贬丛,如果我們重復(fù)添加相同的元素撩银,肯定是不成功的。比如sadd myset a豺憔。
      image.png
    • 刪除 srem myset a额获,刪除myset中的a元素。
      image.png
    • 查看myset中的元素恭应。smembers myset
      image.png
    • 查看指定元素是否是myset中的成員抄邀。sismember myset a,返回0代表不存在昼榛,返回1代表存在境肾。
      image.png
  • 獲得集合中的元素, smembers myset

  • 集合中的差集運算,sdiff myset2 mysetmyset2中元素有b,c,d准夷。myset中元素有b,c。它們之間的差集運算結(jié)果應(yīng)該為d莺掠。

    image.png

    • 集合中的交集運算衫嵌,sinter myset2 myset,應(yīng)該輸出cb彻秆。

      image.png

    • 集合中的并集運算楔绞,sunion myset2 myset,應(yīng)該輸出cbd唇兑。

      image.png

  • 擴展命令

    • scard myset 查看myset有多少個元素酒朵。

      image.png

    • srandmember myset 隨機返回myset中的一個元素。

      image.png

    • sdiffstore new_myset myset2 mysetmysetmyset2差集元素的結(jié)果存儲到new_myset中扎附。(sinterstore, sunionstore也是一樣的用法)

      image.png

  • Set使用場景

    • 跟蹤一些唯一性的數(shù)據(jù)蔫耽。
    • 用于維護數(shù)據(jù)對象之間的關(guān)聯(lián)關(guān)系。

SortedSet

SortedSet中的成員在集合中的位置是有序的留夜。

  • 添加元素 zadd mysort 70 cmazxiaoma 80 xiaoma 100 doudou

    image.png

  • 獲得元素

    • zcard mysort 獲得mysort中所有元素的個數(shù)

      image.png

    • 獲得mysortnamecmazxiaoma對應(yīng)的成績咙边。zscore mysort cmazxiaoma

      image.png

  • 刪除元素誓焦,zrem mysort cmazxiaoma deli doudou xiaoma

    image.png

  • 范圍查詢 zrange mysort 0 -1,輸出的key是按成績正序排列。

    image.png

    • 如果輸出的數(shù)據(jù)項要帶上成績的話搞挣,指令應(yīng)該是zrange mysort 0 -1 withscores

      image.png

    • 如果輸出的數(shù)據(jù)項想按成績逆序排序,那么就應(yīng)該zrevrange mysort 0 -1 withscores

      image.png

    • 如果想按排名范圍進行刪除的話壹瘟,那么應(yīng)該zremrangebyrank mysort 0 2

      image.png

    • 如果想按成績范圍進行刪除的話阅签,那么應(yīng)該zremrangebyscore mysort 0 10。顧名思義刪除成績在0-10之內(nèi)的數(shù)據(jù)項枕面。

      image.png

  • 擴展命令

    • 查看分數(shù)在0-10之內(nèi)的學(xué)生信息愿卒,zrangebyscore mysort 0 10 withscores

      image.png

    • 查看分數(shù)在0-100之內(nèi)且在第1行-第2行的學(xué)生信息。zrangebyscore mysort 0 100 withscores limit 0 2

      image.png

    • cmazxiaoma的成績加100分膊畴。zincrby mysort cmazxiaoma 100

      image.png

    • 查看成績0-10之間的學(xué)生的個數(shù)掘猿。zcount mysort 0 10

      image.png

  • Sorted Set使用場景

    • 如大型在線游戲積分排行榜

    • 構(gòu)建索引數(shù)據(jù)


Redis中的通用命令

  • key * 獲取所有redis中的key

    image.png

  • keys my* 獲取所有redis中以my開頭的key

    image.png

  • exists mylist 查看redis中是否存在mylist,0代表不存在唇跨,1代表存在稠通。

    image.png

  • rename name new_name 給名字為name的數(shù)據(jù)結(jié)構(gòu)重命名為new_name

    image.png

  • expire new_name 10 設(shè)置redisnew_name過期時間,通過ttl new_name看到其距離過期的時間买猖。

    image.png

  • type mylist改橘,可以查看mylist對應(yīng)的數(shù)據(jù)結(jié)構(gòu)類型。

    image.png


Redis的事務(wù)

  • Redis相關(guān)的特性:

    • 多數(shù)據(jù)庫

    • Redis事務(wù)

  • 一個Redis最多可以提供16個數(shù)據(jù)庫玉控,下標分別是0-15飞主。客戶端默認連接的是第0號數(shù)據(jù)。我們可以通過select index來選擇數(shù)據(jù)庫碌识。

    image.png

  • 我們想把第0號的數(shù)據(jù)庫中某些key移動到第1號數(shù)據(jù)庫里面碾篡,那么我們該怎么做呢。通過move cmazxiaoma_test_mayday_5 1就可以完成筏餐。

    image.png

  • 我們可以通過multi开泽、execdiscard來完成事務(wù)操作魁瞪。事務(wù)執(zhí)行期間穆律,Redis不會為其他客戶端提供任何服務(wù),以保證事務(wù)中的所有命令原子執(zhí)行导俘。multi相當(dāng)于開啟事務(wù)峦耘,exec相當(dāng)于提交,discard相當(dāng)于回滾旅薄。

  • 首先我們在第一個客戶端進行如下操作辅髓。我們在第一個客戶端開啟了事務(wù),在事務(wù)中我們incr num 2次少梁,按理來說利朵,get num 應(yīng)該等于4

    redis第一個客戶端.png

  • 我們在第二個客戶端輸入get num猎莲,發(fā)現(xiàn)num還是2绍弟。那么證明了我們的結(jié)論:事務(wù)執(zhí)行期間,Redis不會為其他客戶端提供任何服務(wù)著洼,以保證事務(wù)中的所有命令原子執(zhí)行樟遣。

    image.png

  • 如果我們在第一個客戶端提交了事務(wù)。


    image.png
  • 接著我們在第二個客戶端get num身笤,發(fā)現(xiàn)可以num的值得到了更新豹悬。

    image.png

  • 我們可以演示一下回滾操作,首先set user cmazxiaoma液荸,接著開啟事務(wù)瞻佛,在事務(wù)中set user xiaoma,然后進行回滾操作娇钱,發(fā)現(xiàn) get user 依然是cmazxiaoma伤柄。

    image.png


Redis的持久化

Redis的性能體現(xiàn)在它把數(shù)據(jù)都保存在內(nèi)存當(dāng)中。我們把內(nèi)存中的數(shù)據(jù)同步到硬盤當(dāng)中的操作稱之為持久化文搂。

  • Redis持久化方式:

    • RDB方式适刀,在指定的時間內(nèi),把內(nèi)存中的數(shù)據(jù)快照寫入到硬盤當(dāng)中煤蹭。

    • AOF方式笔喉,將以日志的形式記錄服務(wù)器所處理的每一個操作取视。當(dāng)Redis服務(wù)器啟動之初,它會讀取該aof文件常挚,會重新構(gòu)建我們的數(shù)據(jù)庫作谭。保證我們啟動之后,保證數(shù)據(jù)的完整性奄毡。

    • 無持久化丢早,我們可以通過配置禁止Redis服務(wù)器的持久化,我們認為Redis就是緩存的一種機制了秧倾。

    • 同時使用。

  • RDB

    • 默認情況下傀缩,每隔一段時間redis服務(wù)器程序會自動對數(shù)據(jù)庫做一次遍歷那先,把內(nèi)存快照寫在一個叫做"dump.rdb"的文件里,這個持久化機制叫做SNAPSHOT赡艰。有了SNAPSHOT后售淡,如果服務(wù)器宕機,重新啟動redis服務(wù)器時慷垮,redis會自動加載"dump.rdb",將數(shù)據(jù)庫狀態(tài)恢復(fù)上一次SNAPSHOT的狀態(tài)揖闸。

    • Redis服務(wù)器初始化過程中,設(shè)定了定時時間料身,每隔一段時間就會觸發(fā)持久化操作汤纸,進入定時事件處理程序中,就會fork出子進程來進行持久化操作芹血。

    • Redis服務(wù)器預(yù)設(shè)了save指令贮泞,客戶端可要求服務(wù)器進程中斷服務(wù),執(zhí)行持久化操作幔烛。

    • 我們可以通過vim /etc/redis.conf打開配置文件啃擦,可以看到以下配置。

      image.png

    • 同時我們還可以看到內(nèi)存快照輸出在file文件名饿悬。

      image.png

    優(yōu)缺點:

    • 如果數(shù)據(jù)集很大令蛉,RDB相對于AOF啟動效率很更高。

    • 如果想保證數(shù)據(jù)的高可用性狡恬,最大限度的避免數(shù)據(jù)的丟失珠叔,RDB將不是一個好的選擇。因為系統(tǒng)在定時持久化操作之前弟劲,還沒來得及在硬盤寫入數(shù)據(jù)就發(fā)生宕機的話运杭,就造成了數(shù)據(jù)的丟失。

    • RDB通過fork出子線程來完成數(shù)據(jù)持久化操作函卒,如果當(dāng)數(shù)據(jù)集很大的時候辆憔,可能會導(dǎo)致服務(wù)器停止幾百ms撇眯,或者幾s

RDB.png
  • AOF(append only file):

  • 對于Redis服務(wù)器而言虱咧,其缺省的機制是RDB熊榛,如果需要使用AOF,則需要修改appendonly no改成appendonly yes腕巡。Redis在每一次收到數(shù)據(jù)修改的命令之后玄坦,都會將其追加到AOF文件中。在Redis下一次重新啟動時绘沉,需要加載AOF文件中的信息來構(gòu)建最新的數(shù)據(jù)到內(nèi)存中煎楣。

    image.png

    image.png

  • 可以記錄服務(wù)器的所有寫操作。在服務(wù)器重新啟動時车伞,會把所有的寫操作重新執(zhí)行一遍從而實現(xiàn)數(shù)據(jù)的備份择懂。當(dāng)寫操作集過大(比原有的數(shù)據(jù)集還大),Redis會重寫寫操作集另玖。

  • 帶來更好的數(shù)據(jù)安全性困曙,有3種同步策略,每秒同步谦去,每修改同步慷丽,不同步。 每秒同步也是異步完成的鳄哭,效率也非常高要糊。缺點是一旦系統(tǒng)發(fā)生宕機的現(xiàn)象,那么這一秒中的修改的數(shù)據(jù)就會發(fā)生丟失妆丘。每修改同步杨耙,我們可以視為同步持久化。每一次發(fā)生數(shù)據(jù)的變化飘痛,就會立即的記錄在磁盤珊膜,這種效率很低,但是很安全宣脉。

  • 采用append追加的模式车柠,就算系統(tǒng)發(fā)生宕機,也不會影響我們?nèi)罩疚募幸呀?jīng)存在的內(nèi)容塑猖。然而我們本次操作中竹祷,只寫入了一半數(shù)據(jù)就出現(xiàn)了系統(tǒng)崩潰的問題。在Redis下一次啟動之前羊苟,我們可以通過"redis-check-aof --fix <filename>"命令來修復(fù)壞損的AOF文件塑陵,解決數(shù)據(jù)一致性的問題。

  • 對于相同數(shù)量的數(shù)據(jù)集而言蜡励,AOF文件通常要大于RDB文件令花。

  • AOF在運行效率上往往會慢于RDB阻桅。

AOF.png
  • RDBAOF的區(qū)別
    前者是保存了數(shù)據(jù)本身,而后者是記錄了數(shù)據(jù)的變更兼都。

尾言

這篇文章最后在網(wǎng)吧完成的嫂沉,勿以善小而不為。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扮碧,一起剝皮案震驚了整個濱河市趟章,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慎王,老刑警劉巖蚓土,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赖淤,居然都是意外死亡蜀漆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門漫蛔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人旧蛾,你說我怎么就攤上這事莽龟。” “怎么了锨天?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵毯盈,是天一觀的道長。 經(jīng)常有香客問我病袄,道長搂赋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任益缠,我火速辦了婚禮脑奠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘幅慌。我一直安慰自己宋欺,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布胰伍。 她就那樣靜靜地躺著齿诞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骂租。 梳的紋絲不亂的頭發(fā)上祷杈,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音渗饮,去河邊找鬼但汞。 笑死宿刮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的特占。 我是一名探鬼主播糙置,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼是目!你這毒婦竟也來了谤饭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤懊纳,失蹤者是張志新(化名)和其女友劉穎揉抵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗤疯,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡冤今,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了茂缚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戏罢。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖脚囊,靈堂內(nèi)的尸體忽然破棺而出龟糕,到底是詐尸還是另有隱情,我是刑警寧澤悔耘,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布讲岁,位于F島的核電站,受9級特大地震影響衬以,放射性物質(zhì)發(fā)生泄漏缓艳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一看峻、第九天 我趴在偏房一處隱蔽的房頂上張望阶淘。 院中可真熱鬧,春花似錦互妓、人聲如沸舶治。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霉猛。三九已至,卻和暖如春珠闰,著一層夾襖步出監(jiān)牢的瞬間惜浅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工伏嗜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坛悉,地道東北人伐厌。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像裸影,于是被迫代替她去往敵國和親挣轨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 分布式緩存技術(shù)PK:選擇Redis還是Memcached? 經(jīng)平臺同意授權(quán)轉(zhuǎn)載 作者:田京昆(騰訊后臺研發(fā)工程師)...
    meng_philip123閱讀 68,928評論 7 60
  • 1 Redis介紹1.1 什么是NoSql為了解決高并發(fā)、高可擴展彤委、高可用鞭铆、大數(shù)據(jù)存儲問題而產(chǎn)生的數(shù)據(jù)庫解決方...
    克魯?shù)吕?/span>閱讀 5,296評論 0 36
  • 1.1 資料 ,最好的入門小冊子焦影,可以先于一切文檔之前看车遂,免費。 作者Antirez的博客斯辰,Antirez維護的R...
    JefferyLcm閱讀 17,059評論 1 51
  • 我一說我想吃榴蓮其他人都說臭舶担,臭腳丫味。我就不禁想問下椒涯,“你們吃過了嗎柄沮?” 這么美味的水果回梧,讓我狼吞虎咽的吃完废岂,想...
    雷云玲閱讀 257評論 2 1
  • 今年的執(zhí)考由之前7月,改回6月狱意,少了一個多月的復(fù)習(xí)時間……………… 今年沒什么特別的盼頭湖苞,只求執(zhí)助考必過! 好了详囤,...
    小黃皇冠閱讀 204評論 6 2