redis

nosql概念

NoSQL(not only sql)泛指非關系型的數據庫。 由于傳統的關系數據庫在應付web2.0網站,特別是超大規模和高并發的網站,例如搜索引擎,微博,電商等等,暴露了很多難以克服的問題,例如,查詢速度慢,擴展性差,不支持高并發等等。 NoSQL數據庫是為了解決高并發、高可擴展、高可用、大數據存儲問題而產生的解決方案。

NoSQL特點,使用場景

  • 數據模型比較簡單

  • 需要靈活性更強的IT系統

  • 對數據庫性能要求較高

  • 不需要高度的數據一致性

2 redis簡介

  • 高性能

  • 可擴展

  • 內存存儲

  • key/value數據存儲方式

3 redis入門

  • string(字符串)
1.png
  • hash(哈希)相當于HashMap
2.png
  • list(列表)相當于LinkedList
3.png
  • set(集合)相當于HashSet
4.png
  • zset(有序集合)相當于TreeSet
5.png
  • key操作
6.png

持久化簡介

為應對拉閘限電,系統當機等事故,redis使用持久化技術來避免災難性后果。

redis有兩種持久化方法:RDB、AOF

rdb方式

rdb:在指定的時間間隔對數據進行快照存儲
- 數據保存在硬盤上的一個dump.rdb文件中,如果刪除將失去備份
- rdb方式的配置參數在redis.conf中,具體請查看官方文檔

優點:速度快,并且異步執行,不影響正常功能

缺點:間隔期間,若服務器異常,將有數據丟失

aof方式

aof:記錄每次寫操作,當服務器重啟的時候會重新執行這些命令來恢復原始的數據

優點:不會有數據丟失

缺點:若備份指令很多,恢復數據很慢

事務

redis事務的3個指令

- multi開啟事務

- exec提交事務

- watch監視某個鍵是否被修改,若在事務提交前有被其他客戶端所改動,事務將失敗

java操作redis事務

        Jedis jedis=new Jedis("127.0.0.1", 6379);
        //開啟事務
        Transaction tx = jedis.multi();
        //執行語句
        tx.set("goodname", "褲子");
        tx.set("goodprice", "100");
        tx.get("goodname");
        //提交事務,并且返回結果
        List<Object> exec = tx.exec();
        System.out.println(exec);
        jedis.close();

6 訂閱與發布

7.png

應用場景

1、微博的關注與取消關注

2、向主服務器獲取任務,然后執行任務

3、web聊天程序,例如webQQ

7 redis主從

一臺主服務器,配置一臺或者多臺從服務器

作用:數據備份、故障轉移、讀寫分離

8.png

redis集群

集群:多臺服務器一起工作

作用:提高存儲容量,分布式計算,主從同步,故障轉移

9 整合redis

整合的原則

- redis服務在整個架構中充當緩存

- 先從緩存獲取數據,獲取失敗再從關系型數據庫獲取

- 更新關系型數據庫時,緩存也要更新或者刪除

- redis不能影響正常的SSM工作

步驟

1、編寫redis接口

2、編寫單機版RedisPool和集群版RedisCluster

具體請看RedisPool和RedisCluster工具類

3、在service層調用對應的方法

    public List<AppInfo> selectAppInfoList(){
        //先查詢緩存
        String string = redisPool.hget(Const.APP_INFO_LIST, "appinfolist:"+userId);
        if(!StringUtils.isEmpty(string)){
            System.out.println("-----------redis 獲取緩存數據----------");
            return JsonUtils.readValue(string, new TypeReference<List<AppInfo>>() {});
        }
        //查詢mysql數據庫
        AppInfoExample example=new AppInfoExample();
        example.createCriteria().andUserIdEqualTo(userId);
        List<AppInfo> list = appInfoMapper.selectByExample(example);    
        //將數據放入緩存
        redisPool.hset(Const.APP_INFO_LIST, "appinfolist:"+userId,JsonUtils.toJSon(list));
        System.out.println("-----------redis 存儲緩存數據----------");
        return list;
    }  
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉載地址:http://gnucto.blog.51cto.com/3391516/998509 Redis與Me...
    Ddaidai閱讀 21,469評論 0 82
  • NOSQL類型簡介鍵值對:會使用到一個哈希表,表中有一個特定的鍵和一個指針指向特定的數據,如redis,volde...
    MicoCube閱讀 4,078評論 2 27
  • Redis雜談 Redis是近年來發展迅速的內存數據庫,網上也已經有多Redis的文章。但不管是英文還是中文,多數...
    迷失于重逢閱讀 1,605評論 0 14
  • 1.1 資料 ,最好的入門小冊子,可以先于一切文檔之前看,免費。 作者Antirez的博客,Antirez維護的R...
    JefferyLcm閱讀 17,120評論 1 51
  • 無題 /伍藝邇 夜深花睡人未眠, 護守生命站一線, 旦聞呼喚驚坐起, 白衣天使駐人間。 PS:謹...
    伍藝邇閱讀 187評論 0 4