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("释放链接");
    }
}
相关文章
相关标签/搜索