Redis——NoSQL非關係型數據庫

Redis概述:

1.nosql:泛指非關係型數據庫(不以關係來建模的數據庫)【由行和列組成的二維表的數據庫就是關係型數據庫】
    2.鍵值(key-value):主要用於內容緩存,優勢查找速度快
        Redis是一個key-value的nosql,主要用來作緩存!
    3.Redis數據保存在內存中,存取速度快,併發能力強。
    4.是一種數據結構化存儲方法的集合。數據結構:數組,list,map,tree等;
      Redis提供了一堆方法,調用特定的方法把數據保存爲特定的數據結構。
    5.Redis官方不支持windows,有團隊製做了windows版本的。java

特色(優點):

        數據存儲:
            存放到內存中,而且還能不按期持久化到硬盤.
        Value類型:
             相較於memcached支持Value更多
        客戶端支持:
            支持多種客戶端-跨語言
        超大併發支持:
            支持集羣面試

存儲過時:存儲數據時設置一個有效期,時間到了就沒了. 
場景:訂單,vip,短信驗證碼,遊戲道具,優惠券,紅包等等redis

面試題:Memcached和Redis的相同點和不一樣點? 用過Memcached嗎?
    用過redis,
    相同點:
        都是key-value類型Nosql,都存放數據到內存中,讀寫效率高,並且都支持存儲過時.
    不一樣點:
        redis相較於Memcached還支持持久化到磁盤,數據安全更高.
        redis相較於Memcached支持value類型更多.spring

使用redis
    1.選擇合適的java客戶端(jedis)
    2.使用java客戶端操做redis服務器
        ①鏈接
        ②鏈接池sql

使用鏈接池的做用? 1.限定了最大鏈接數,防止鏈接過多大值系統崩潰
2.不用重複建立和關閉鏈接,這兩個都是耗資源操做,節約了資源
3.不用重複建立和關閉鏈接,這兩個都是耗時操做,減小訪問時間,加強用戶體驗數據庫

鏈接池配置:
    最小鏈接數
        config.setMaxIdle(2);//最小鏈接(閒時最大鏈接)
    最大鏈接數
        config.setMaxTotal(10);//最大鏈接
    最大超時時間
        config.setMaxWaitMillis(2*1000);//最大等
    測試鏈接是否暢通
        config.setTestOnBorrow(true);//獲取鏈接時測試是否暢通windows

注:配置文件:bind ip 綁定ip,只能這個ip來訪問,保證安全數組

默認不會丟失數據appendonly yse
appendonly 改成no後會丟失數據
修改save知足改成no以後也不會丟失數據緩存

redis持久化策略     安全

面試題: 淘汰策略:放開配置的最大內存(maxmemory <bytes>),
放開選擇的淘汰策略(allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰)。

複習事務四大特徵:(面試題!!!!) redis有事務,可是沒有用
        原子性:多個操做要麼都成功,要麼都失敗!
        一致性:多個操做,若是後面的失敗了,前面要進行回滾達到數據一致.
        隔離型:多個事務相互不影響
        持續性:一旦開始就不能終止

JedisUtil

public enum JedisUtil {
    INSTANCE;
    public static JedisPool pool=null;
    //鏈接池單例
    static {
        //1.建立鏈接池配置對象
        JedisPoolConfig config = new JedisPoolConfig();
        //2.進行配置-四個
        config.setMaxIdle(2);//最小鏈接(閒時最大鏈接)
        config.setMaxTotal(10);//最大鏈接
        config.setMaxWaitMillis(2*1000);//最大等待時間
        config.setTestOnBorrow(true);//獲取鏈接時測試是否暢通
        //3.經過配置對象建立鏈接池
        pool = new JedisPool(config, "127.0.0.1", 6379, 2*1000,"root");
    }
    //獲取鏈接
    public Jedis getResource(){
        return pool.getResource();
    }
    //釋放連接
    public void closeJedis(Jedis jedis){
        if (jedis!=null){
            jedis.close();
        }
    }
}

RedisClientJedisTest

public class RedisClientJedisTest {
    @Test
    public void testSet()throws Exception{
        //建立鏈接
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.auth("root");
        //執行操做
        jedis.set("name","ls");
        //關閉鏈接
        jedis.close();
    }
    @Test
    public void testGet()throws Exception{
        //建立鏈接
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.auth("root");
        //執行操做
        System.out.println(jedis.get("name"));
        //關閉鏈接
        jedis.close();
    }

    /**
     * 鏈接池-設置並獲取值
     * @throws Exception
     */
    @Test
    public void testPool()throws Exception{
        //若是建立一個對象後要作不少配置,不如先建立他的配置對象後,再經過配置對象建立它。
        //1.建立鏈接池配置對象
        JedisPoolConfig config = new JedisPoolConfig();
        //2.進行配置-四個
        config.setMaxIdle(2);//最小鏈接(閒時最大鏈接)
        config.setMaxTotal(10);//最大鏈接
        config.setMaxWaitMillis(2*1000);//最大等待時間
        config.setTestOnBorrow(true);//獲取鏈接時測試是否暢通
        //3.經過配置對象建立鏈接池
        JedisPool pool = new JedisPool(config, "127.0.0.1", 6379, 2 * 1000,"root");
        //4.經過鏈接池獲取鏈接
        Jedis connection = pool.getResource();
        //5.執行操做-設置和獲取值
        connection.set("name","zs");
        System.out.println(connection.get("name"));
        //6.釋放連接
        connection.close();
        //7.摧毀鏈接(測試環境)真實環境應該是在spring中配置的一個單例
        pool.destroy();
    }

}

RedisClientJedisOprsTest

public class RedisClientJedisOprsTest {
    @Test
    public void testKey()throws Exception{
        //清空全部數據-flushall
        //獲取鏈接
        Jedis jedis = JedisUtil.INSTANCE.getResource();
        System.out.println("清空數據:"+jedis.flushAll());
        System.out.println("判斷key爲age的值是否存在:"+jedis.exists("age"));

        System.out.println("設置key爲age的值"+jedis.set("age", "18"));
        System.out.println("設置key爲age的值"+jedis.set("name", "zl"));
        System.out.println("設置key爲age的值"+jedis.set("sex", "nan"));
        System.out.println("設置key爲age的值"+jedis.set("num", "001"));

        System.out.println("再次判斷key爲age的值是否存在:"+jedis.exists("age"));
        System.out.println("設置後獲取key爲age的值"+jedis.get("age"));

        System.out.println("刪除前判斷key爲age的值是否存在:"+jedis.exists("age"));
        System.out.println("刪除key爲age的值"+jedis.del("age"));
        System.out.println("刪除後判斷key爲age的值是否存在:"+jedis.exists("age"));

        System.out.println("獲取全部的key:");
        Set<String> keys = jedis.keys("*");
        for (String key : keys) {
            System.out.println(key+"--->"+jedis.get(key));
        }
        jedis.expire("name",20);
        Thread.sleep(5000);
        System.out.println("過時剩餘時間:"+jedis.ttl("name"));
        //釋放資源
        JedisUtil.INSTANCE.closeJedis(jedis);
        System.out.println("釋放鏈接");
    }
    @Test
    public void testString()throws Exception{
        //清空全部數據-flushall
        //獲取鏈接
        Jedis jedis = JedisUtil.INSTANCE.getResource();
        System.out.println("清空數據:"+jedis.flushAll());
        System.out.println("add...");
        jedis.set("name","ly");
        System.out.println(jedis.get("name"));
        System.out.println("updtate...");
        jedis.set("name","lsj");
        System.out.println(jedis.get("name"));
        jedis.set("age","30");
        System.out.println("append...");
        jedis.append("name","=ly");
        System.out.println(jedis.get("name"));
        System.out.println(jedis.get("age"));
        System.out.println("del...");
        jedis.del("age");
        System.out.println("get...");
        System.out.println(jedis.get("name"));
        System.out.println(jedis.get("age"));
        //釋放資源
        JedisUtil.INSTANCE.closeJedis(jedis);
        System.out.println("釋放鏈接");
    }
    @Test
    public void testString2()throws Exception{
        //清空全部數據-flushall
        //獲取鏈接
        Jedis jedis = JedisUtil.INSTANCE.getResource();
        System.out.println("清空數據:"+jedis.flushAll());

        jedis.mset("name","ww","age","50","sex","男");
        List<String> list = jedis.mget("name","age","sex");
        for (String s : list) {
            System.out.println(s);
        }

        //釋放資源
        JedisUtil.INSTANCE.closeJedis(jedis);
        System.out.println("釋放鏈接");
    }
    @Test
    public void testString3()throws Exception{
        //清空全部數據-flushall
        //獲取鏈接
        Jedis jedis = JedisUtil.INSTANCE.getResource();
        System.out.println("清空數據:"+jedis.flushAll());
        jedis.setex("name",20,"lsj");
        jedis.set("age","20");
        System.out.println("自增前"+jedis.get("age"));
        jedis.incr("age");
        System.out.println("自增1後前"+jedis.get("age"));
        jedis.decr("age");
        System.out.println("自減1後前"+jedis.get("age"));
        //jedis.incrBy(, )
        jedis.incrBy("age",10);
        System.out.println("自增10後前"+jedis.get("age"));
        jedis.decrBy("age",10);
        System.out.println("自減10後前"+jedis.get("age"));
        //釋放資源
        JedisUtil.INSTANCE.closeJedis(jedis);
        System.out.println("釋放鏈接");
    }
}
相關文章
相關標籤/搜索