歡迎光臨
每天分享高質量文章

Jedis 對 Redis 的操作詳解

點擊上方“芋道原始碼”,選擇“置頂公眾號”

技術文章第一時間送達!

原始碼精品專欄

 

來源:http://t.cn/Ewxyoze

1. JedisUtil2. 鍵操作3. 字串操作4. 位元組串4. 整數和浮點數5. 串列6. 集合(Set)7. 散列8. 排序sort


本篇主要闡述Jedis對redis的五大型別的操作:字串、串列、散列、集合、有序集合。

1. JedisUtil

這裡的測試用例採用junit4進行運行,準備代碼如下:

    private static final String ipAddr = "10.10.195.112";
    private static final int port = 6379;
    private static Jedis jedis= null;

    @BeforeClass
    public static void init()
    
{
        jedis = JedisUtil.getInstance().getJedis(ipAddr, port);
    }

    @AfterClass
    public static void close()
    
{
        JedisUtil.getInstance().closeJedis(jedis,ipAddr, port);
    }

其中JedisUtil是對jedis做的簡單封裝,代碼如下:

import org.apache.log4j.Logger;

import java.util.HashMap;
import java.util.Map;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisUtil
{
    private Logger logger = Logger.getLogger(this.getClass().getName());

    private JedisUtil(){}

    private static class RedisUtilHolder{
        private static final JedisUtil instance = new JedisUtil();
    }

    public static JedisUtil getInstance(){
        return RedisUtilHolder.instance;
    }

    private static Map maps = new HashMap();

    private static JedisPool getPool(String ip, int port){
        String key = ip+":"+port;
        JedisPool pool = null;
        if(!maps.containsKey(key))
        {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxActive(RedisConfig.MAX_ACTIVE);
            config.setMaxIdle(RedisConfig.MAX_IDLE);
            config.setMaxWait(RedisConfig.MAX_WAIT);
            config.setTestOnBorrow(true);
            config.setTestOnReturn(true);

            pool = new JedisPool(config,ip,port,RedisConfig.TIMEOUT);
            maps.put(key, pool);
        }
        else
        {
            pool = maps.get(key);
        }
        return pool;
    }

    public Jedis getJedis(String ip, int port)
    
{
        Jedis jedis = null;
        int count = 0;
        do
        {
            try
            {
                jedis = getPool(ip,port).getResource();
            }
            catch (Exception e)
            {
                logger.error("get redis master1 failed!",e);
                getPool(ip,port).returnBrokenResource(jedis);
            }
        }
        while(jedis == null && count        return jedis;
    }

    public void closeJedis(Jedis jedis, String ip, int port){
        if(jedis != null)
        {
            getPool(ip,port).returnResource(jedis);
        }
    }
}

public class RedisConfig
{
    //可用連接實體的最大數目,預設值為8;
    //如果賦值為-1,則表示不限制;如果pool已經分配了maxActive個jedis實體,則此時pool的狀態為exhausted(耗盡)。
    public static int MAX_ACTIVE = 1024;

    //控制一個pool最多有多少個狀態為idle(空閑的)的jedis實體,預設值也是8。
    public static int MAX_IDLE = 200;

    //等待可用連接的最大時間,單位毫秒,預設值為-1,表示永不超時。如果超過等待時間,則直接丟擲JedisConnectionException;
    public static int MAX_WAIT = 10000;

    public static int TIMEOUT = 10000;

    public static int RETRY_NUM = 5;
}

2. 鍵操作

@Test public void testKey() throws InterruptedException
    
{
        System.out.println("清空資料:"+jedis.flushDB());
        System.out.println("判斷某個鍵是否存在:"+jedis.exists("username"));
        System.out.println("新增的鍵值對:"+jedis.set("username""zzh"));
        System.out.println(jedis.exists("name"));
        System.out.println("新增的鍵值對:"+jedis.set("password""password"));
        System.out.print("系統中所有的鍵如下:");
        Set keys = jedis.keys("*");
        System.out.println(keys);
        System.out.println("刪除鍵password:"+jedis.del("password"));
        System.out.println("判斷鍵password是否存在:"+jedis.exists("password"));
        System.out.println("設置鍵username的過期時間為5s:"+jedis.expire("username"5));
        TimeUnit.SECONDS.sleep(2);
        System.out.println("查看鍵username的剩餘生存時間:"+jedis.ttl("username"));
        System.out.println("移除鍵username的生存時間:"+jedis.persist("username"));
        System.out.println("查看鍵username的剩餘生存時間:"+jedis.ttl("username"));
        System.out.println("查看鍵username所儲存的值的型別:"+jedis.type("username"));
    }

輸出結果:

清空資料:OK
判斷某個鍵是否存在:false
新增<'username','zzh'>的鍵值對:OK
false
新增<'password','password'>的鍵值對:OK
系統中所有的鍵如下:[username, password]
刪除鍵password:1
判斷鍵password是否存在:false
設置鍵username的過期時間為5s:1
查看鍵username的剩餘生存時間:3
移除鍵username的生存時間:1
查看鍵username的剩餘生存時間:-1
查看鍵username所儲存的值的型別:string

3. 字串操作

在Redis裡面,字串可以儲存三種型別的值:

  • 位元組串(byte string)

  • 整數

  • 浮點數

4. 位元組串

@Test public void testString() throws InterruptedException
    
{
        jedis.flushDB();
        System.out.println("===========增加資料===========");
        System.out.println(jedis.set("key1","value1"));
        System.out.println(jedis.set("key2","value2"));
        System.out.println(jedis.set("key3""value3"));
        System.out.println("刪除鍵key2:"+jedis.del("key2"));
        System.out.println("獲取鍵key2:"+jedis.get("key2"));
        System.out.println("修改key1:"+jedis.set("key1""value1Changed"));
        System.out.println("獲取key1的值:"+jedis.get("key1"));
        System.out.println("在key3後面加入值:"+jedis.append("key3""End"));
        System.out.println("key3的值:"+jedis.get("key3"));
        System.out.println("增加多個鍵值對:"+jedis.mset("key01","value01","key02","value02","key03","value03"));
        System.out.println("獲取多個鍵值對:"+jedis.mget("key01","key02","key03"));
        System.out.println("獲取多個鍵值對:"+jedis.mget("key01","key02","key03","key04"));
        System.out.println("刪除多個鍵值對:"+jedis.del(new String[]{"key01","key02"}));
        System.out.println("獲取多個鍵值對:"+jedis.mget("key01","key02","key03"));

        jedis.flushDB();
        System.out.println("===========新增鍵值對防止改寫原先值==============");
        System.out.println(jedis.setnx("key1""value1"));
        System.out.println(jedis.setnx("key2""value2"));
        System.out.println(jedis.setnx("key2""value2-new"));
        System.out.println(jedis.get("key1"));
        System.out.println(jedis.get("key2"));

        System.out.println("===========新增鍵值對並設置有效時間=============");
        System.out.println(jedis.setex("key3"2"value3"));
        System.out.println(jedis.get("key3"));
        TimeUnit.SECONDS.sleep(3);
        System.out.println(jedis.get("key3"));

        System.out.println("===========獲取原值,更新為新值==========");//GETSET is an atomic set this value and return the old value command.
        System.out.println(jedis.getSet("key2""key2GetSet"));
        System.out.println(jedis.get("key2"));

        System.out.println("獲得key2的值的字串:"+jedis.getrange("key2"24));
    }

輸出結果:

===========增加資料===========
OK
OK
OK
刪除鍵key2:1
獲取鍵key2:null
修改key1:OK
獲取key1的值:value1Changed
在key3後面加入值:9
key3的值:value3End
增加多個鍵值對:OK
獲取多個鍵值對:[value01, value02, value03]
獲取多個鍵值對:[value01, value02, value03, null]
刪除多個鍵值對:2
獲取多個鍵值對:[null, null, value03]
===========新增鍵值對防止改寫原先值==============
1
1
0
value1
value2
===========新增鍵值對並設置有效時間=============
OK
value3
null
===========獲取原值,更新為新值==========
value2
key2GetSet
獲得key2的值的字串:y2G

4. 整數和浮點數

@Test public void testNumber()
    
{
        jedis.flushDB();
        jedis.set("key1""1");
        jedis.set("key2""2");
        jedis.set("key3""2.3");
        System.out.println("key1的值:"+jedis.get("key1"));
        System.out.println("key2的值:"+jedis.get("key2"));
        System.out.println("key1的值加1:"+jedis.incr("key1"));
        System.out.println("獲取key1的值:"+jedis.get("key1"));
        System.out.println("key2的值減1:"+jedis.decr("key2"));
        System.out.println("獲取key2的值:"+jedis.get("key2"));
        System.out.println("將key1的值加上整數5:"+jedis.incrBy("key1"5));
        System.out.println("獲取key1的值:"+jedis.get("key1"));
        System.out.println("將key2的值減去整數5:"+jedis.decrBy("key2"5));
        System.out.println("獲取key2的值:"+jedis.get("key2"));
    }

輸出結果:

key1的值:1
key2的值:2
key1的值加1:2
獲取key1的值:2
key2的值減1:1
獲取key2的值:1
將key1的值加上整數5:7
獲取key1的值:7
將key2的值減去整數5:-4
獲取key2的值:-4

在redis2.6或以上版本中有這個命令:incrbyfloat,即將鍵儲存的值加上浮點數amount,jedis-2.1.0中不支持這一操作。

5. 串列

@Test public void testList()
{
    jedis.flushDB();
    System.out.println("===========添加一個list===========");
    jedis.lpush("collections""ArrayList""Vector""Stack""HashMap""WeakHashMap""LinkedHashMap");
    jedis.lpush("collections""HashSet");
    jedis.lpush("collections""TreeSet");
    jedis.lpush("collections""TreeMap");
    System.out.println("collections的內容:"+jedis.lrange("collections"0, -1));//-1代表倒數第一個元素,-2代表倒數第二個元素
    System.out.println("collections區間0-3的元素:"+jedis.lrange("collections",0,3));
    System.out.println("===============================");
    // 刪除串列指定的值 ,第二個引數為刪除的個數(有重覆時),後add進去的值先被刪,類似於出棧
    System.out.println("刪除指定元素個數:"+jedis.lrem("collections"2"HashMap"));
    System.out.println("collections的內容:"+jedis.lrange("collections"0, -1));
    System.out.println("刪除下表0-3區間之外的元素:"+jedis.ltrim("collections"03));
    System.out.println("collections的內容:"+jedis.lrange("collections"0, -1));
    System.out.println("collections串列出棧(左端):"+jedis.lpop("collections"));
    System.out.println("collections的內容:"+jedis.lrange("collections"0, -1));
    System.out.println("collections添加元素,從串列右端,與lpush相對應:"+jedis.rpush("collections""EnumMap"));
    System.out.println("collections的內容:"+jedis.lrange("collections"0, -1));
    System.out.println("collections串列出棧(右端):"+jedis.rpop("collections"));
    System.out.println("collections的內容:"+jedis.lrange("collections"0, -1));
    System.out.println("修改collections指定下標1的內容:"+jedis.lset("collections"1"LinkedArrayList"));
    System.out.println("collections的內容:"+jedis.lrange("collections"0, -1));
    System.out.println("===============================");
    System.out.println("collections的長度:"+jedis.llen("collections"));
    System.out.println("獲取collections下標為2的元素:"+jedis.lindex("collections"2));
    System.out.println("===============================");
    jedis.lpush("sortedList""3","6","2","0","7","4");
    System.out.println("sortedList排序前:"+jedis.lrange("sortedList"0, -1));
    System.out.println(jedis.sort("sortedList"));
    System.out.println("sortedList排序後:"+jedis.lrange("sortedList"0, -1));
}

輸出結果:

===========添加一個list===========
collections的內容:[TreeMap, TreeSet, HashSet, LinkedHashMap, WeakHashMap, HashMap, Stack, Vector, ArrayList]
collections區間0-3的元素:[TreeMap, TreeSet, HashSet, LinkedHashMap]
===============================
刪除指定元素個數:1
collections的內容:[TreeMap, TreeSet, HashSet, LinkedHashMap, WeakHashMap, Stack, Vector, ArrayList]
刪除下表0-3區間之外的元素:OK
collections的內容:[TreeMap, TreeSet, HashSet, LinkedHashMap]
collections串列出棧(左端):TreeMap
collections的內容:[TreeSet, HashSet, LinkedHashMap]
collections添加元素,從串列右端,與lpush相對應:4
collections的內容:[TreeSet, HashSet, LinkedHashMap, EnumMap]
collections串列出棧(右端):EnumMap
collections的內容:[TreeSet, HashSet, LinkedHashMap]
修改collections指定下標1的內容:OK
collections的內容:[TreeSet, LinkedArrayList, LinkedHashMap]
===============================
collections的長度:3
獲取collections下標為2的元素:LinkedHashMap
===============================
sortedList排序前:[4, 7, 0, 2, 6, 3]
[0, 2, 3, 4, 6, 7]
sortedList排序後:[4, 7, 0, 2, 6, 3]

Redis中還有阻塞式的串列彈出命令以及在串列之間移動元素的命令:blpop, brpop, rpoplpush, brpoplpush等。

6. 集合(Set)

@Test public void testSet()
    
{
        jedis.flushDB();
        System.out.println("============向集合中添加元素============");
        System.out.println(jedis.sadd("eleSet""e1","e2","e4","e3","e0","e8","e7","e5"));
        System.out.println(jedis.sadd("eleSet""e6"));
        System.out.println(jedis.sadd("eleSet""e6"));
        System.out.println("eleSet的所有元素為:"+jedis.smembers("eleSet"));
        System.out.println("刪除一個元素e0:"+jedis.srem("eleSet""e0"));
        System.out.println("eleSet的所有元素為:"+jedis.smembers("eleSet"));
        System.out.println("刪除兩個元素e7和e6:"+jedis.srem("eleSet""e7","e6"));
        System.out.println("eleSet的所有元素為:"+jedis.smembers("eleSet"));
        System.out.println("隨機的移除集合中的一個元素:"+jedis.spop("eleSet"));
        System.out.println("隨機的移除集合中的一個元素:"+jedis.spop("eleSet"));
        System.out.println("eleSet的所有元素為:"+jedis.smembers("eleSet"));
        System.out.println("eleSet中包含元素的個數:"+jedis.scard("eleSet"));
        System.out.println("e3是否在eleSet中:"+jedis.sismember("eleSet""e3"));
        System.out.println("e1是否在eleSet中:"+jedis.sismember("eleSet""e1"));
        System.out.println("e1是否在eleSet中:"+jedis.sismember("eleSet""e5"));
        System.out.println("=================================");
        System.out.println(jedis.sadd("eleSet1""e1","e2","e4","e3","e0","e8","e7","e5"));
        System.out.println(jedis.sadd("eleSet2""e1","e2","e4","e3","e0","e8"));
        System.out.println("將eleSet1中刪除e1並存入eleSet3中:"+jedis.smove("eleSet1""eleSet3""e1"));
        System.out.println("將eleSet1中刪除e2並存入eleSet3中:"+jedis.smove("eleSet1""eleSet3""e2"));
        System.out.println("eleSet1中的元素:"+jedis.smembers("eleSet1"));
        System.out.println("eleSet3中的元素:"+jedis.smembers("eleSet3"));
        System.out.println("============集合運算=================");
        System.out.println("eleSet1中的元素:"+jedis.smembers("eleSet1"));
        System.out.println("eleSet2中的元素:"+jedis.smembers("eleSet2"));
        System.out.println("eleSet1和eleSet2的交集:"+jedis.sinter("eleSet1","eleSet2"));
        System.out.println("eleSet1和eleSet2的並集:"+jedis.sunion("eleSet1","eleSet2"));
        System.out.println("eleSet1和eleSet2的差集:"+jedis.sdiff("eleSet1","eleSet2"));//eleSet1中有,eleSet2中沒有
    }

輸出結果:

============向集合中添加元素============
8
1
0
eleSet的所有元素為:[e3, e4, e1, e2, e0, e8, e7, e6, e5]
刪除一個元素e0:1
eleSet的所有元素為:[e3, e4, e1, e2, e8, e7, e6, e5]
刪除兩個元素e7和e6:2
eleSet的所有元素為:[e3, e4, e1, e2, e8, e5]
隨機的移除集合中的一個元素:e5
隨機的移除集合中的一個元素:e2
eleSet的所有元素為:[e3, e4, e1, e8]
eleSet中包含元素的個數:4
e3是否在eleSet中:true
e1是否在eleSet中:true
e1是否在eleSet中:false
=================================
8
6
將eleSet1中刪除e1並存入eleSet3中:1
將eleSet1中刪除e2並存入eleSet3中:1
eleSet1中的元素:[e3, e4, e0, e8, e7, e5]
eleSet3中的元素:[e1, e2]
============集合運算=================
eleSet1中的元素:[e3, e4, e0, e8, e7, e5]
eleSet2中的元素:[e3, e4, e1, e2, e0, e8]
eleSet1和eleSet2的交集:[e3, e4, e0, e8]
eleSet1和eleSet2的並集:[e3, e4, e1, e2, e0, e8, e7, e5]
eleSet1和eleSet2的差集:[e7, e5]

關於Set還有一些其他命令:srandmember, sdiffstore, sinterstore, sunionstore等。

7. 散列

 @Test public void testHash()
    
{
        jedis.flushDB();
        Map map = new HashMap<>();
        map.put("key1","value1");
        map.put("key2","value2");
        map.put("key3","value3");
        map.put("key4","value4");
        jedis.hmset("hash",map);
        jedis.hset("hash""key5""value5");
        System.out.println("散列hash的所有鍵值對為:"+jedis.hgetAll("hash"));//return Map
        System.out.println("散列hash的所有鍵為:"+jedis.hkeys("hash"));//return Set
        System.out.println("散列hash的所有值為:"+jedis.hvals("hash"));//return List
        System.out.println("將key6儲存的值加上一個整數,如果key6不存在則添加key6:"+jedis.hincrBy("hash""key6"6));
        System.out.println("散列hash的所有鍵值對為:"+jedis.hgetAll("hash"));
        System.out.println("將key6儲存的值加上一個整數,如果key6不存在則添加key6:"+jedis.hincrBy("hash""key6"3));
        System.out.println("散列hash的所有鍵值對為:"+jedis.hgetAll("hash"));
        System.out.println("刪除一個或者多個鍵值對:"+jedis.hdel("hash""key2"));
        System.out.println("散列hash的所有鍵值對為:"+jedis.hgetAll("hash"));
        System.out.println("散列hash中鍵值對的個數:"+jedis.hlen("hash"));
        System.out.println("判斷hash中是否存在key2:"+jedis.hexists("hash","key2"));
        System.out.println("判斷hash中是否存在key3:"+jedis.hexists("hash","key3"));
        System.out.println("獲取hash中的值:"+jedis.hmget("hash","key3"));
        System.out.println("獲取hash中的值:"+jedis.hmget("hash","key3","key4"));
    }

輸出結果:

散列hash的所有鍵值對為:{key4=value4, key3=value3, key5=value5, key2=value2, key1=value1}
散列hash的所有鍵為:[key4, key3, key5, key2, key1]
散列hash的所有值為:[value4, value3, value1, value2, value5]
將key6儲存的值加上一個整數,如果key6不存在則添加key6:6
散列hash的所有鍵值對為:{key4=value4, key3=value3, key6=6, key5=value5, key2=value2, key1=value1}
將key6儲存的值加上一個整數,如果key6不存在則添加key6:9
散列hash的所有鍵值對為:{key4=value4, key3=value3, key6=9, key5=value5, key2=value2, key1=value1}
刪除一個或者多個鍵值對:1
散列hash的所有鍵值對為:{key4=value4, key3=value3, key6=9, key5=value5, key1=value1}
散列hash中鍵值對的個數:5
判斷hash中是否存在key2:false
判斷hash中是否存在key3:true
獲取hash中的值:[value3]
獲取hash中的值:[value3, value4]

有序集合

@Test public void testSortedSet()
    
{
        jedis.flushDB();
        Map map = new HashMap<>();
        map.put(1.2,"key2");
        map.put(4.0"key3");
        map.put(5.0,"key4");
        map.put(0.2,"key5");
        System.out.println(jedis.zadd("zset"3,"key1"));
        System.out.println(jedis.zadd("zset",map));
        System.out.println("zset中的所有元素:"+jedis.zrange("zset"0, -1));
        System.out.println("zset中的所有元素:"+jedis.zrangeWithScores("zset"0, -1));
        System.out.println("zset中的所有元素:"+jedis.zrangeByScore("zset"0,100));
        System.out.println("zset中的所有元素:"+jedis.zrangeByScoreWithScores("zset"0,100));
        System.out.println("zset中key2的分值:"+jedis.zscore("zset""key2"));
        System.out.println("zset中key2的排名:"+jedis.zrank("zset""key2"));
        System.out.println("刪除zset中的元素key3:"+jedis.zrem("zset""key3"));
        System.out.println("zset中的所有元素:"+jedis.zrange("zset"0, -1));
        System.out.println("zset中元素的個數:"+jedis.zcard("zset"));
        System.out.println("zset中分值在1-4之間的元素的個數:"+jedis.zcount("zset"14));
        System.out.println("key2的分值加上5:"+jedis.zincrby("zset"5"key2"));
        System.out.println("key3的分值加上4:"+jedis.zincrby("zset"4"key3"));
        System.out.println("zset中的所有元素:"+jedis.zrange("zset"0, -1));
    }

輸出結果:

1
4
zset中的所有元素:[key5, key2, key1, key3, key4]
zset中的所有元素:[[[107, 101, 121, 53],0.2], [[107, 101, 121, 50],1.2], [[107, 101, 121, 49],3.0], [[107, 101, 121, 51],4.0], [[107, 101, 121, 52],5.0]]
zset中的所有元素:[key5, key2, key1, key3, key4]
zset中的所有元素:[[[107, 101, 121, 53],0.2], [[107, 101, 121, 50],1.2], [[107, 101, 121, 49],3.0], [[107, 101, 121, 51],4.0], [[107, 101, 121, 52],5.0]]
zsetkey2的分值:1.2
zsetkey2的排名:1
刪除zset中的元素key3:1
zset中的所有元素:[key5, key2, key1, key4]
zset中元素的個數:4
zset中分值在1-4之間的元素的個數:2
key2的分值加上5:6.2
key3的分值加上4:4.0
zset中的所有元素:[key5, key1, key3, key4, key2]

有序集合還有諸如zinterstore, zunionstore, zremrangebyscore, zremrangebyrank, zrevrank, zrevrange, zrangebyscore等命令。

8. 排序sort

@Test public void testSort()
    
{
        jedis.flushDB();
        jedis.lpush("collections""ArrayList""Vector""Stack""HashMap""WeakHashMap""LinkedHashMap");
        System.out.println("collections的內容:"+jedis.lrange("collections"0, -1));
        SortingParams sortingParameters = new SortingParams();
        System.out.println(jedis.sort("collections",sortingParameters.alpha()));
        System.out.println("===============================");
        jedis.lpush("sortedList""3","6","2","0","7","4");
        System.out.println("sortedList排序前:"+jedis.lrange("sortedList"0, -1));
        System.out.println("升序:"+jedis.sort("sortedList", sortingParameters.asc()));
        System.out.println("升序:"+jedis.sort("sortedList", sortingParameters.desc()));
        System.out.println("===============================");
        jedis.lpush("userlist""33");
        jedis.lpush("userlist""22");
        jedis.lpush("userlist""55");
        jedis.lpush("userlist""11");
        jedis.hset("user:66""name""66");
        jedis.hset("user:55""name""55");
        jedis.hset("user:33""name""33");
        jedis.hset("user:22""name""79");
        jedis.hset("user:11""name""24");
        jedis.hset("user:11""add""beijing");
        jedis.hset("user:22""add""shanghai");
        jedis.hset("user:33""add""guangzhou");
        jedis.hset("user:55""add""chongqing");
        jedis.hset("user:66""add""xi'an");
        sortingParameters = new SortingParams();
        sortingParameters.get("user:*->name");
        sortingParameters.get("user:*->add");
        System.out.println(jedis.sort("userlist",sortingParameters));
    }

輸出結果:

collections的內容:[LinkedHashMap, WeakHashMap, HashMap, Stack, Vector, ArrayList]
[ArrayList, HashMap, LinkedHashMap, Stack, Vector, WeakHashMap]
===============================
sortedList排序前:[470263]
升序:[023467]
升序:[764320]
===============================
[24, beijing, 79, shanghai, 33, guangzhou, 55, chongqing]



如果你對 Dubbo / Netty 等等原始碼與原理感興趣,歡迎加入我的知識星球一起交流。長按下方二維碼噢

目前在知識星球更新了《Dubbo 原始碼解析》目錄如下:

01. 除錯環境搭建
02. 專案結構一覽
03. 配置 Configuration
04. 核心流程一覽

05. 拓展機制 SPI

06. 執行緒池

07. 服務暴露 Export

08. 服務取用 Refer

09. 註冊中心 Registry

10. 動態編譯 Compile

11. 動態代理 Proxy

12. 服務呼叫 Invoke

13. 呼叫特性 

14. 過濾器 Filter

15. NIO 服務器

16. P2P 服務器

17. HTTP 服務器

18. 序列化 Serialization

19. 集群容錯 Cluster

20. 優雅停機

21. 日誌適配

22. 狀態檢查

23. 監控中心 Monitor

24. 管理中心 Admin

25. 運維命令 QOS

26. 鏈路追蹤 Tracing

… 一共 69+ 篇

目前在知識星球更新了《Netty 原始碼解析》目錄如下:

01. 除錯環境搭建
02. NIO 基礎
03. Netty 簡介
04. 啟動 Bootstrap

05. 事件輪詢 EventLoop

06. 通道管道 ChannelPipeline

07. 通道 Channel

08. 位元組緩衝區 ByteBuf

09. 通道處理器 ChannelHandler

10. 編解碼 Codec

11. 工具類 Util

… 一共 61+ 篇

目前在知識星球更新了《資料庫物體設計》目錄如下:


01. 商品模塊
02. 交易模塊
03. 營銷模塊
04. 公用模塊

… 一共 17+ 篇


目前在知識星球更新了《Spring 原始碼解析》目錄如下:


01. 除錯環境搭建
02. IoC Resource 定位
03. IoC BeanDefinition 載入

04. IoC BeanDefinition 註冊

05. IoC Bean 獲取

06. IoC Bean 生命周期

… 一共 35+ 篇


原始碼不易↓↓↓

點贊支持老艿艿↓↓

赞(0)

分享創造快樂