Redis【入門】就這一篇煮剧!

Redis 概述

在我們?nèi)粘5腏ava Web開發(fā)中斥滤,無(wú)不都是使用數(shù)據(jù)庫(kù)來進(jìn)行數(shù)據(jù)的存儲(chǔ),由于一般的系統(tǒng)任務(wù)中通常不會(huì)存在高并發(fā)的情況勉盅,所以這樣看起來并沒有什么問題佑颇,可是一旦涉及大數(shù)據(jù)量的需求,比如一些商品搶購(gòu)的情景草娜,或者是主頁(yè)訪問量瞬間較大的時(shí)候漩符,單一使用數(shù)據(jù)庫(kù)來保存數(shù)據(jù)的系統(tǒng)會(huì)因?yàn)槊嫦虼疟P,磁盤讀/寫速度比較慢的問題而存在嚴(yán)重的性能弊端驱还,一瞬間成千上萬(wàn)的請(qǐng)求到來嗜暴,需要系統(tǒng)在極短的時(shí)間內(nèi)完成成千上萬(wàn)次的讀/寫操作凸克,這個(gè)時(shí)候往往不是數(shù)據(jù)庫(kù)能夠承受的,極其容易造成數(shù)據(jù)庫(kù)系統(tǒng)癱瘓闷沥,最終導(dǎo)致服務(wù)宕機(jī)的嚴(yán)重生產(chǎn)問題萎战。

NoSQL 技術(shù)

為了克服上述的問題,Java Web項(xiàng)目通常會(huì)引入NoSQL技術(shù)舆逃,這是一種基于內(nèi)存的數(shù)據(jù)庫(kù)蚂维,并且提供一定的持久化功能。

RedisMongoDB是當(dāng)前使用最廣泛的NoSQL路狮,而就Redis技術(shù)而言虫啥,它的性能十分優(yōu)越,可以支持每秒十幾萬(wàn)此的讀/寫操作奄妨,其性能遠(yuǎn)超數(shù)據(jù)庫(kù)涂籽,并且還支持集群、分布式砸抛、主從同步等配置评雌,原則上可以無(wú)限擴(kuò)展,讓更多的數(shù)據(jù)存儲(chǔ)在內(nèi)存中直焙,更讓人欣慰的是它還支持一定的事務(wù)能力景东,這保證了高并發(fā)的場(chǎng)景下數(shù)據(jù)的安全和一致性。

Redis 在 Java Web 中的應(yīng)用

Redis 在 Java Web 主要有兩個(gè)應(yīng)用場(chǎng)景:

  • 存儲(chǔ) 緩存 用的數(shù)據(jù)奔誓;
  • 需要高速讀/寫的場(chǎng)合使用它快速讀/寫斤吐;

緩存

在日常對(duì)數(shù)據(jù)庫(kù)的訪問中,讀操作的次數(shù)遠(yuǎn)超寫操作厨喂,比例大概在 1:93:7曲初,所以需要讀的可能性是比寫的可能大得多的。當(dāng)我們使用SQL語(yǔ)句去數(shù)據(jù)庫(kù)進(jìn)行讀寫操作時(shí)杯聚,數(shù)據(jù)庫(kù)就會(huì)去磁盤把對(duì)應(yīng)的數(shù)據(jù)索引取回來臼婆,這是一個(gè)相對(duì)較慢的過程。

如果我們把數(shù)據(jù)放在 Redis 中幌绍,也就是直接放在內(nèi)存之中颁褂,讓服務(wù)端直接去讀取內(nèi)存中的數(shù)據(jù),那么這樣速度明顯就會(huì)快上不少傀广,并且會(huì)極大減小數(shù)據(jù)庫(kù)的壓力颁独,但是使用內(nèi)存進(jìn)行數(shù)據(jù)存儲(chǔ)開銷也是比較大的,限于成本的原因伪冰,一般我們只是使用 Redis 存儲(chǔ)一些常用和主要的數(shù)據(jù)誓酒,比如用戶登錄的信息等。

一般而言在使用 Redis 進(jìn)行存儲(chǔ)的時(shí)候,我們需要從以下幾個(gè)方面來考慮:

  • 業(yè)務(wù)數(shù)據(jù)常用嗎靠柑?命中率如何寨辩?如果命中率很低,就沒有必要寫入緩存歼冰;
  • 該業(yè)務(wù)數(shù)據(jù)是讀操作多靡狞,還是寫操作多?如果寫操作多隔嫡,頻繁需要寫入數(shù)據(jù)庫(kù)甸怕,也沒有必要使用緩存;
  • 業(yè)務(wù)數(shù)據(jù)大小如何腮恩?如果要存儲(chǔ)幾百兆字節(jié)的文件梢杭,會(huì)給緩存帶來很大的壓力,這樣也沒有必要秸滴;

在考慮了這些問題之后武契,如果覺得有必要使用緩存,那么就使用它缸榛!使用 Redis 作為緩存的讀取邏輯如下圖所示:

從上圖我們可以知道以下兩點(diǎn):

  1. 當(dāng)第一次讀取數(shù)據(jù)的時(shí)候吝羞,讀取 Redis 的數(shù)據(jù)就會(huì)失敗兰伤,此時(shí)就會(huì)觸發(fā)程序讀取數(shù)據(jù)庫(kù)内颗,把數(shù)據(jù)讀取出來,并且寫入 Redis 中敦腔;
  2. 當(dāng)第二次以及以后需要讀取數(shù)據(jù)時(shí)均澳,就會(huì)直接讀取 Redis,讀到數(shù)據(jù)后就結(jié)束了流程符衔,這樣速度就大大提高了找前。

從上面的分析可以知道,讀操作的可能性是遠(yuǎn)大于寫操作的判族,所以使用 Redis 來處理日常中需要經(jīng)常讀取的數(shù)據(jù)躺盛,速度提升是顯而易見的,同時(shí)也降低了對(duì)數(shù)據(jù)庫(kù)的依賴形帮,使得數(shù)據(jù)庫(kù)的壓力大大減少槽惫。

分析了讀操作的邏輯,下面我們來看看寫操作的流程

從流程可以看出辩撑,更新或者寫入的操作界斜,需要多個(gè) Redis 的操作,如果業(yè)務(wù)數(shù)據(jù)寫次數(shù)遠(yuǎn)大于讀次數(shù)那么就沒有必要使用 Redis合冀。

關(guān)于使用內(nèi)存存儲(chǔ)數(shù)據(jù)各薇,我知道谷歌好像就是把所有互聯(lián)網(wǎng)的數(shù)據(jù)都存儲(chǔ)在內(nèi)存條的,所以才會(huì)有如此高質(zhì)量君躺、高效的搜索峭判,但它畢竟是谷歌...

高速讀/寫的場(chǎng)合

在如今的互聯(lián)網(wǎng)中开缎,越來越多的存在高并發(fā)的情況,比如天貓雙11朝抖、搶紅包啥箭、搶演唱會(huì)門票等,這些場(chǎng)合都是在某一個(gè)瞬間或者是某一個(gè)短暫的時(shí)刻有成千上萬(wàn)的請(qǐng)求到達(dá)服務(wù)器治宣,如果單純的使用數(shù)據(jù)庫(kù)來進(jìn)行處理急侥,就算不崩,也會(huì)很慢的侮邀,輕則造成用戶體驗(yàn)極差用戶量流失坏怪,重則數(shù)據(jù)庫(kù)癱瘓,服務(wù)宕機(jī)绊茧,而這樣的場(chǎng)合都是不允許的铝宵!

所以我們需要使用 Redis 來應(yīng)對(duì)這樣的高并發(fā)需求的場(chǎng)合,我們先來看看一次請(qǐng)求操作的流程圖

我們來進(jìn)一步闡述這個(gè)過程:

  1. 當(dāng)一個(gè)請(qǐng)求到達(dá)服務(wù)器時(shí)华畏,只是把業(yè)務(wù)數(shù)據(jù)在 Redis 上進(jìn)行讀寫鹏秋,而沒有對(duì)數(shù)據(jù)庫(kù)進(jìn)行任何的操作,這樣就能大大提高讀寫的速度亡笑,從而滿足高速響應(yīng)的需求侣夷;
  2. 但是這些緩存的數(shù)據(jù)仍然需要持久化,也就是存入數(shù)據(jù)庫(kù)之中仑乌,所以在一個(gè)請(qǐng)求操作完 Redis 的讀/寫之后百拓,會(huì)去判斷該高速讀/寫的業(yè)務(wù)是否結(jié)束,這個(gè)判斷通常會(huì)在秒殺商品為0晰甚,紅包金額為0時(shí)成立衙传,如果不成立,則不會(huì)操作數(shù)據(jù)庫(kù)厕九;如果成立蓖捶,則觸發(fā)事件將 Redis 的緩存的數(shù)據(jù)以批量的形式一次性寫入數(shù)據(jù)庫(kù),從而完成持久化的工作扁远。

Redis 的安裝

訪問地址:https://github.com/ServiceStack/redis-windows/tree/master/downloads

把 Redis 下載下來后找到一個(gè)合適的地方解壓俊鱼,就能得到如下圖所示的目錄(這里空格被替換成了%20...):

為了方便啟動(dòng),我們?cè)谠撃夸浵滦陆ㄒ粋€(gè) startup.cmd 的文件穿香,然后將以下內(nèi)容寫入文件:

redis-server redis.windows.conf

這個(gè)命令其實(shí)就是在調(diào)用 redis-server.exe 命令來讀取 redis.window.conf 的內(nèi)容亭引,我們雙擊剛才創(chuàng)建好的 startup.cmd 文件,就能成功的看到 Redis 啟動(dòng):

上圖的提示信息告訴了我們:① Redis 當(dāng)前的版本為 3.0.503皮获;② Redis 運(yùn)行在 6379 端口焙蚓;③ Redis 進(jìn)程的 PID 為 14748;④ 64 位。

我們可以打開同一個(gè)文件夾下的 redis-cli.exe 文件购公,這是 Redis 自帶的一個(gè)客戶端工具萌京,它可以用來連接到我們當(dāng)前的 Redis 服務(wù)器,我們做以下測(cè)試:

如此宏浩,我們便在 Windows 的環(huán)境下安裝好了 Redis知残。


在 Java 中使用 Redis

第一步:添加 Jedis 依賴

想要在 Java 中使用 Redis 緩存,需要添加相關(guān)的Jar包依賴比庄,打開Maven倉(cāng)庫(kù)的網(wǎng)站:https://mvnrepository.com/ 求妹,搜索Jedis:

把它導(dǎo)入工程中去就可以啦,下面我們來對(duì)Redis的寫入性能做一下測(cè)試:

@Test
public void redisTester() {
    Jedis jedis = new Jedis("localhost", 6379, 100000);
    int i = 0;
    try {
        long start = System.currentTimeMillis();// 開始毫秒數(shù)
        while (true) {
            long end = System.currentTimeMillis();
            if (end - start >= 1000) {// 當(dāng)大于等于1000毫秒(相當(dāng)于1秒)時(shí)佳窑,結(jié)束操作
                break;
            }
            i++;
            jedis.set("test" + i, i + "");
        }
    } finally {// 關(guān)閉連接
        jedis.close();
    }
    // 打印1秒內(nèi)對(duì)Redis的操作次數(shù)
    System.out.println("redis每秒操作:" + i + "次");
}
-----------測(cè)試結(jié)果-----------
redis每秒操作:10734次

據(jù)說 Redis 的性能能達(dá)到十萬(wàn)級(jí)別制恍,我不敢相信我的臺(tái)式機(jī)電腦只有十分之一不到的性能,雖然說這里不是流水線的操作神凑,會(huì)造成一定的影響净神,但我還是不信邪,我查到了官方的性能測(cè)試方法:

首先在Redis根目錄下召喚Cmd:具體方法是按住【Shift】點(diǎn)擊右鍵

然后輸入命令:【redis-benchmark -n 100000 -q】:來同時(shí)執(zhí)行10萬(wàn)個(gè)請(qǐng)求測(cè)試性能

好吧溉委,我同時(shí)在我的筆記本上測(cè)試了一下鹃唯,結(jié)果更加慘淡...low啊low...

第二步:使用 Redis 連接池

跟數(shù)據(jù)庫(kù)連接池相同,Java Redis也同樣提供了類redis.clients.jedis.JedisPool來管理我們的Reids連接池對(duì)象瓣喊,并且我們可以使用redis.clients.jedis.JedisPoolConfig來對(duì)連接池進(jìn)行配置坡慌,代碼如下:

JedisPoolConfig poolConfig = new JedisPoolConfig();
// 最大空閑數(shù)
poolConfig.setMaxIdle(50);
// 最大連接數(shù)
poolConfig.setMaxTotal(100);
// 最大等待毫秒數(shù)
poolConfig.setMaxWaitMillis(20000);
// 使用配置創(chuàng)建連接池
JedisPool pool = new JedisPool(poolConfig, "localhost");
// 從連接池中獲取單個(gè)連接
Jedis jedis = pool.getResource();
// 如果需要密碼
//jedis.auth("password");

Redis 只能支持六種數(shù)據(jù)類型(string/hash/list/set/zset/hyperloglog)的操作,但在 Java 中我們卻通常以類對(duì)象為主型宝,所以在需要 Redis 存儲(chǔ)的五中數(shù)據(jù)類型與 Java 對(duì)象之間進(jìn)行轉(zhuǎn)換八匠,如果自己編寫一些工具類絮爷,比如一個(gè)角色對(duì)象的轉(zhuǎn)換趴酣,還是比較容易的,但是涉及到許多對(duì)象的時(shí)候坑夯,這其中無(wú)論工作量還是工作難度都是很大的岖寞,所以總體來說,就操作對(duì)象而言柜蜈,使用 Redis 還是挺難的仗谆,好在 Spring 對(duì)這些進(jìn)行了封裝和支持。

第三步:在 Spring 中使用 Redis

上面說到了 Redis 無(wú)法操作對(duì)象的問題淑履,無(wú)法在那些基礎(chǔ)類型和 Java 對(duì)象之間方便的轉(zhuǎn)換隶垮,但是在 Spring 中,這些問題都可以通過使用RedisTemplate得到解決秘噪!

想要達(dá)到這樣的效果狸吞,除了 Jedis 包以外還需要在 Spring 引入 spring-data-redis 包:https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis

這里把2.0.7最新版本標(biāo)紅的意思是:別老想著使用最新的Jar包,特別是涉及到框架的一些東西,筆者用實(shí)際的操作體驗(yàn)告訴你們蹋偏,引入該版本的包是會(huì)導(dǎo)致Jar包沖突的(也就是莫名其妙的錯(cuò)誤)便斥,我乖乖換回了1.7.2的版本,代碼就通了...我們來看看怎么做吧:

(1)第一步:使用Spring配置JedisPoolConfig對(duì)象

大部分的情況下威始,我們還是會(huì)用到連接池的枢纠,于是先用 Spring 配置一個(gè) JedisPoolConfig 對(duì)象:

<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <!--最大空閑數(shù)-->
    <property name="maxIdle" value="50"/>
    <!--最大連接數(shù)-->
    <property name="maxTotal" value="100"/>
    <!--最大等待時(shí)間-->
    <property name="maxWaitMillis" value="20000"/>
</bean>

(2)第二步:為連接池配置工廠模型

好了,我們現(xiàn)在配置好了連接池的相關(guān)屬性黎棠,那么具體使用哪種工廠實(shí)現(xiàn)呢晋渺?在Spring Data Redis中有四種可供我們選擇的工廠模型,它們分別是:

  • JredisConnectionFactory
  • JedisConnectionFactory
  • LettuceConnectionFactory
  • SrpConnectionFactory

我們這里就簡(jiǎn)單配置成JedisConnectionFactory:

<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <!--Redis服務(wù)地址-->
    <property name="hostName" value="localhost"/>
    <!--端口號(hào)-->
    <property name="port" value="6379"/>
    <!--如果有密碼則需要配置密碼-->
    <!--<property name="password" value="password"/>-->
    <!--連接池配置-->
    <property name="poolConfig" ref="poolConfig"/>
</bean>

(3)第三步:配置RedisTemplate

普通的連接根本沒有辦法直接將對(duì)象直接存入 Redis 內(nèi)存中脓斩,我們需要替代的方案:將對(duì)象序列化(可以簡(jiǎn)單的理解為繼承Serializable接口)些举。我們可以把對(duì)象序列化之后存入Redis緩存中,然后在取出的時(shí)候又通過轉(zhuǎn)換器俭厚,將序列化之后的對(duì)象反序列化回對(duì)象户魏,這樣就完成了我們的要求:

RedisTemplate可以幫助我們完成這份工作,它會(huì)找到對(duì)應(yīng)的序列化器去轉(zhuǎn)換Redis的鍵值:

<bean id="redisTemplate"
      class="org.springframework.data.redis.core.RedisTemplate"
      p:connection-factory-ref="connectionFactory"/>

筆者從《JavaEE互聯(lián)網(wǎng)輕量級(jí)框架整合開發(fā)》中了解到挪挤,這一步需要配置單獨(dú)的序列化器去支撐這一步的工作叼丑,但是自己在測(cè)試當(dāng)中,發(fā)現(xiàn)只要我們的POJO類實(shí)現(xiàn)了Serializable接口扛门,就不會(huì)出現(xiàn)問題...所以我直接省略掉了配置序列化器這一步...

(4)第四步:編寫測(cè)試

首先編寫好支持我們測(cè)試的POJO類:

/**
 * @author: @我沒有三顆心臟
 * @create: 2018-05-30-下午 22:31
 */
public class Student implements Serializable{

    private String name;
    private int age;

    /**
     * 給該類一個(gè)服務(wù)類用于測(cè)試
     */
    public void service() {
        System.out.println("學(xué)生名字為:" + name);
        System.out.println("學(xué)生年齡為:" + age);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

然后編寫測(cè)試類:

@Test
public void test() {
    ApplicationContext context =
            new ClassPathXmlApplicationContext("applicationContext.xml");
    RedisTemplate redisTemplate = context.getBean(RedisTemplate.class);
    Student student = new Student();
    student.setName("我沒有三顆心臟");
    student.setAge(21);
    redisTemplate.opsForValue().set("student_1", student);
    Student student1 = (Student) redisTemplate.opsForValue().get("student_1");
    student1.service();
}

運(yùn)行可以成功看到結(jié)果:

第四步:在 SpringBoot 中使用 Redis

(1)在SpringBoot中添加Redis依賴:

<!-- Radis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

(2)添加配置文件:

在SpringBoot中使用.properties或者.yml都可以鸠信,這里給出.properties的例子,因?yàn)樽约旱?code>.yml文件看上去感覺亂糟糟的:

# REDIS (RedisProperties)
# Redis數(shù)據(jù)庫(kù)索引(默認(rèn)為0)
spring.redis.database=0
# Redis服務(wù)器地址
spring.redis.host=localhost
# Redis服務(wù)器連接端口
spring.redis.port=6379
# Redis服務(wù)器連接密碼(默認(rèn)為空)
spring.redis.password=
# 連接池最大連接數(shù)(使用負(fù)值表示沒有限制)
spring.redis.pool.max-active=8
# 連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒有限制)
spring.redis.pool.max-wait=-1
# 連接池中的最大空閑連接
spring.redis.pool.max-idle=8
# 連接池中的最小空閑連接
spring.redis.pool.min-idle=0
# 連接超時(shí)時(shí)間(毫秒)
spring.redis.timeout=0

(3)測(cè)試訪問:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest()
public class ApplicationTests {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    public void test() throws Exception {

        // 保存字符串
        stringRedisTemplate.opsForValue().set("aaa", "111");
        Assert.assertEquals("111", stringRedisTemplate.opsForValue().get("aaa"));

    }
}

通過上面這段極為簡(jiǎn)單的測(cè)試案例演示了如何通過自動(dòng)配置的StringRedisTemplate對(duì)象進(jìn)行Redis的讀寫操作论寨,該對(duì)象從命名中就可注意到支持的是String類型星立。原本是RedisTemplate<K, V>接口,StringRedisTemplate就相當(dāng)于RedisTemplate<String, String>的實(shí)現(xiàn)葬凳。

運(yùn)行測(cè)試绰垂,如果一切成功則不會(huì)報(bào)錯(cuò),如果我們沒有拿到或者拿到的數(shù)不是我們想要的 “111” 火焰,那么則會(huì)報(bào)錯(cuò)劲装,這是使用Assert的好處(下面是我改成112之后運(yùn)行報(bào)錯(cuò)的結(jié)果):

(4)存儲(chǔ)對(duì)象:

這一步跟上面使用Spring一樣,只需要將POJO類實(shí)現(xiàn)Serializable接口就可以了昌简,我這里就貼一下測(cè)試代碼:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest()
public class ApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void test() throws Exception {

        User user = new User();
        user.setName("我沒有三顆心臟");
        user.setAge(21);

        redisTemplate.opsForValue().set("user_1", user);
        User user1 = (User) redisTemplate.opsForValue().get("user_1");

        System.out.println(user1.getName());
    }
}

仍然沒有任何問題:

參考文章:
1.https://www.cnblogs.com/ityouknow/p/5748830.html
2.http://blog.didispace.com/springbootredis/


在Redis中操作集合

引用文章:http://www.reibang.com/p/29aaac3172b5

直接黏上兩段簡(jiǎn)單的示例代碼:

在Redis中操作List

// list數(shù)據(jù)類型適合于消息隊(duì)列的場(chǎng)景:比如12306并發(fā)量太高占业,而同一時(shí)間段內(nèi)只能處理指定數(shù)量的數(shù)據(jù)!必須滿足先進(jìn)先出的原則纯赎,其余數(shù)據(jù)處于等待
@Test
public void listPushResitTest() {
    // leftPush依次由右邊添加
    stringRedisTemplate.opsForList().rightPush("myList", "1");
    stringRedisTemplate.opsForList().rightPush("myList", "2");
    stringRedisTemplate.opsForList().rightPush("myList", "A");
    stringRedisTemplate.opsForList().rightPush("myList", "B");
    // leftPush依次由左邊添加
    stringRedisTemplate.opsForList().leftPush("myList", "0");
}

@Test
public void listGetListResitTest() {
    // 查詢類別所有元素
    List<String> listAll = stringRedisTemplate.opsForList().range("myList", 0, -1);
    logger.info("list all {}", listAll);
    // 查詢前3個(gè)元素
    List<String> list = stringRedisTemplate.opsForList().range("myList", 0, 3);
    logger.info("list limit {}", list);
}

@Test
public void listRemoveOneResitTest() {
    // 刪除先進(jìn)入的B元素
    stringRedisTemplate.opsForList().remove("myList", 1, "B");
}

@Test
public void listRemoveAllResitTest() {
    // 刪除所有A元素
    stringRedisTemplate.opsForList().remove("myList", 0, "A");
}

在Redis中操作Hash

@Test
public void hashPutResitTest() {
    // map的key值相同谦疾,后添加的覆蓋原有的
    stringRedisTemplate.opsForHash().put("banks:12600000", "a", "b");
}

@Test
public void hashGetEntiresResitTest() {
    // 獲取map對(duì)象
    Map<Object, Object> map = stringRedisTemplate.opsForHash().entries("banks:12600000");
    logger.info("objects:{}", map);
}

@Test
public void hashGeDeleteResitTest() {
    // 根據(jù)map的key刪除這個(gè)元素
    stringRedisTemplate.opsForHash().delete("banks:12600000", "c");
}

@Test
public void hashGetKeysResitTest() {
    // 獲得map的key集合
    Set<Object> objects = stringRedisTemplate.opsForHash().keys("banks:12600000");
    logger.info("objects:{}", objects);
}

@Test
public void hashGetValueListResitTest() {
    // 獲得map的value列表
    List<Object> objects = stringRedisTemplate.opsForHash().values("banks:12600000");
    logger.info("objects:{}", objects);
}

@Test
public void hashSize() { // 獲取map對(duì)象大小
    long size = stringRedisTemplate.opsForHash().size("banks:12600000");
    logger.info("size:{}", size);
}

總結(jié)

在網(wǎng)上看到了關(guān)于MySQL的性能測(cè)試,讀寫操作大概就每秒1000以下的樣子犬金,而且這還和引擎相關(guān)念恍,所以可以看出Redis確實(shí)能在性能方面幫助許多

歡迎轉(zhuǎn)載碎紊,轉(zhuǎn)載請(qǐng)注明出處!
簡(jiǎn)書ID:@我沒有三顆心臟
github:wmyskxz
歡迎關(guān)注公眾微信號(hào):wmyskxz_javaweb
分享自己的Java Web學(xué)習(xí)之路以及各種Java學(xué)習(xí)資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末樊诺,一起剝皮案震驚了整個(gè)濱河市仗考,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌词爬,老刑警劉巖秃嗜,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異顿膨,居然都是意外死亡锅锨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門恋沃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來必搞,“玉大人,你說我怎么就攤上這事囊咏∷≈蓿” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵梅割,是天一觀的道長(zhǎng)霜第。 經(jīng)常有香客問我,道長(zhǎng)户辞,這世上最難降的妖魔是什么泌类? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮底燎,結(jié)果婚禮上刃榨,老公的妹妹穿的比我還像新娘。我一直安慰自己双仍,他們只是感情好枢希,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著殊校,像睡著了一般晴玖。 火紅的嫁衣襯著肌膚如雪读存。 梳的紋絲不亂的頭發(fā)上为流,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音让簿,去河邊找鬼敬察。 笑死,一個(gè)胖子當(dāng)著我的面吹牛尔当,可吹牛的內(nèi)容都是我干的莲祸。 我是一名探鬼主播蹂安,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼锐帜!你這毒婦竟也來了田盈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缴阎,失蹤者是張志新(化名)和其女友劉穎允瞧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛮拔,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡述暂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了建炫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畦韭。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肛跌,靈堂內(nèi)的尸體忽然破棺而出艺配,到底是詐尸還是另有隱情,我是刑警寧澤衍慎,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布妒挎,位于F島的核電站,受9級(jí)特大地震影響西饵,放射性物質(zhì)發(fā)生泄漏酝掩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一眷柔、第九天 我趴在偏房一處隱蔽的房頂上張望期虾。 院中可真熱鬧,春花似錦驯嘱、人聲如沸镶苞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茂蚓。三九已至,卻和暖如春剃幌,著一層夾襖步出監(jiān)牢的瞬間聋涨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工负乡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牍白,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓抖棘,卻偏偏與公主長(zhǎng)得像茂腥,于是被迫代替她去往敵國(guó)和親狸涌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理最岗,服務(wù)發(fā)現(xiàn)帕胆,斷路器,智...
    卡卡羅2017閱讀 134,672評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,826評(píng)論 6 342
  • Block Block作為日常開發(fā)中必備的一種開發(fā)技巧,通過日常的使用和學(xué)習(xí),在此對(duì) Block的基本概念,使用語(yǔ)...
    cr7aa閱讀 433評(píng)論 0 2
  • 今天帶晨晨同學(xué)去上早教課歼捐,提前了一個(gè)小時(shí)到,陪她各種玩晨汹,爬滑梯豹储,看書,玩玩具淘这,躲貓貓剥扣,她喜歡坐在地上去看早教班里那...
    作家維憶閱讀 334評(píng)論 0 0
  • R(閱讀原文片段)用“三個(gè)F”創(chuàng)建有效的心理表征 為了在沒有導(dǎo)師的時(shí)候有效地練習(xí)某種技能,牢牢記住以下三個(gè)F铝穷,將是...
    孟君婷Connie閱讀 480評(píng)論 1 51