1. 程式人生 > >Redis實時快取的一點小總結

Redis實時快取的一點小總結

筆者最近在寫一個關於部落格系統的畢業設計,其中用到了Reis實時快取,對於一個部落格首頁資訊來說,需要分頁展示一些部落格資訊,而這些資訊的變化性不是很大,所以採用Reis實時快取可以有效緩解資料庫訪問壓力;

對於筆者的部落格系統中的Reis實時快取來說,筆者考慮的最佳Redis資料型別是字串和連結串列。

首先來分析下二者的優劣:

字串型別:可以將分頁資料按照“頁數-資料(list集合)”的形式儲存,這樣做的優點在於操作簡單,而缺點也很明顯,如果某篇部落格發生改動,則需要將該頁資料全部取出,修改後再存入,而對於刪除的資料補齊則更加麻煩,假設頁數為10頁,每頁10條資料,那麼第一頁的第一篇部落格刪除的話需要補齊9次資料(第二頁的第一條資料補至第一頁最後一條,第三頁的。。。);

連結串列型別:可以將所有的資料以連結串列形式存入一個key,每次查詢分頁資料按照range方法設定下標範圍來取值,這樣做的優點在於修改資料很靈活,不需要訪問大量資料,而缺點則在於訪問中間位置的資料比較繁瑣(leftPop和rigthPop方法只能首尾刪除,而remove(count,value)方法則可以直接刪除,count代表刪除的值的個數,value代表值,這麼設計的原因是值可以重複);

分析完二者優劣之後開始介紹二者的使用方式:

字串型別:

    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("test1")
    public Object test1()
    {
        // 存值
        redisTemplate.opsForValue().set("key",new Object());
        // 取值
        Object obj=redisTemplate.opsForValue().get("key");
        System.out.print(obj);
        return redisTemplate.toString();
    }

連結串列型別:

    @GetMapping("test2")
    public Object test2()
    {
        // 將連結串列繫結到一個key,這樣的話不需要每次指定key
        BoundListOperations listOps = redisTemplate.boundListOps("key_1");
        // 右邊插入,相當於尾部插入
        listOps.rightPush("張三");
        listOps.rightPush("李四");
        listOps.rightPush("王五");
        // 左邊插入,相當於頭部插入
        listOps.leftPush("項羽");
        listOps.rightPush("李四");
        listOps.rightPush("李四");

        // 刪除前2個‘李四’
        listOps.remove(2, "李四");

        // 根據下標範圍取值,以取出全部資料為例
        List list = listOps.range(0, listOps.size() - 1);
//        不繫結的情況
//        ListOperations listOperations = redisTemplate.opsForList();
//        listOperations.rightPush("key_1", "張三");
//        listOperations.rightPush("key_1", "李四");
//        listOperations.rightPush("key_1", "王五");
//        listOperations.leftPush("key_1", "項羽u");
//        return "list長度=" + listOperations.size("key_1");
        return list;
    }