Redis详解


为什么要用redis?
数据读取的性能出现瓶颈,而瓶颈的源头一般是在磁盘的I/O上,随着互联网的技术的进一步发展,各种类型的应用层出不穷,导致在当今计算、大数据盛行的时代,对性能有了进一步的要求体现四个方面:

1、低延迟的读写速度

2、支撑海量的数据和流量

3、大规模的集群管理

4、庞大的营运成本

为了克服这些问题,NoSQL应用诞生。它同时具备了高性能、可扩展性强、高可用等优点。

Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用了ANSIC编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,具备以下特性:

1、基于内存运行、性能高效

2、支持分布式、理论上可以无限扩展

3、key-value 存储系统

4、开源使用ANSIC语言编写。遵守了BSD协议、支持网络,可基于内存也可以持久化的日志,key-value数据库,并且提供了多种语言API

相比于其他数据库。Redis具备的特点

1、C/S通信模型

2、单进程单线程模型

3、丰富的数据类型

4、持久化

5、操作具有原子性

6、高并发读写

7、支持lua脚本

使用案例:github、微博、twitter、阿里巴巴、百度、美团、搜狐

Redis的数据类型以及主要特点:

Redis 提供了数据类型主要分为5种自有类型和一种自定义一类型,5种类型包括:String 类型、哈希类型、列表类型、集合类型、顺序集合类型(Zset)。

String 十一个二进制安全的字符串,意味着他不仅能存储字符串,还能存图片、视频等多种类型,最大长度支持512M。

顺序集合类型:

ZSet是一种有序集合类型。每个元素都会关联一个double类型的分数权值,通过这个权值来为集合中的成员进行从小到大的排序,与Set类型一样,底层也是通过哈希表实现的。

Redis 的使用

需要的东西:绿色版redis、redis管理工具、

  • 继续在springMVC的项目下:配置文件加redis依赖
    在这里插入图片描述

  • 使用绿色版的redis,不需要启动服务,注意不要关闭窗口
    在这里插入图片描述

  • 打开redis管理工具
    在这里插入图片描述

redis的密码无法识别

找到在redis3文件夹下的redis.conf:找到port与requirepass
在这里插入图片描述

  • 启动redis cmd命令下,注意不要关闭窗口
    在这里插入图片描述
    如果此处报错说明端口占用,在电脑管理的服务中关闭其他的redis
    在这里插入图片描述

在这里插入图片描述

  • redis管理工具连接redis
    在这里插入图片描述

Test包对redis数据类型练习

java包下创建test包与一个redisTest.java,做一个测试看看是否能链接上redis

创建一个测试目录:
在这里插入图片描述

字符串类型的数据操作

   public void TestD(){
        Jedis jedis = new Jedis("localhost");
        jedis.auth("123456");
        System.out.println("连接成功");
        System.out.println("服务正在运行:" + jedis.ping());

        //jedis.flushDB();//清空数据
        jedis.set("hello","hello");
        System.out.println(jedis.get("hello"));

        // 向hello这个字符串   value中追加内容
        jedis.append("hello","world!");
        System.out.println(jedis.get("hello"));

        //使用 set 覆盖原有内容  (key 的相同)
        jedis.set("hello","123");

        //添加 key 为hello2  值为 word2  设置生命周期为2秒
jedis.setex("hello2",2,"world2");

        try {
            //线程 睡眠三秒
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(jedis.get("hello2"));

        //一次添加多个key-value对
        jedis.mset("a","1","b","2");
        List<String> values = jedis.mget("a", "b");//返回一个存放字符串的集合
        System.out.println(values);//[1, 2]
        //批量删除
        jedis.del("a","b");
        System.out.println(jedis.exists("a"));
        System.out.println(jedis.exists("b"));

        jedis.close();
    }

数组与集合的操作

    public void TestC(){
        Jedis jedis = new Jedis("localhost");
        jedis.auth("123456");
        System.out.println("连接成功");
        System.out.println("服务正在运行:" + jedis.ping());

        //jedis.flushDB(); // 清空数据

        //添加集合
        jedis.rpush("names","唐僧");
        jedis.rpush("names","悟空");
        jedis.rpush("names","八戒");
        jedis.rpush("names","悟净");
        //取出 Redis 中集合的数据
        // lrange 按照下标获取  -1 表示最后一个元素
        List<String> names = jedis.lrange("names", 0, -1);
        System.out.println(names);


        //添加数组
        jedis.lpush("scores","100");
        jedis.lpush("scores","77");
        jedis.lpush("scores","99");
        jedis.lpush("scores","88");
        System.out.println("获取数组长度:"+jedis.llen("scores"));
        System.out.println("数组内容:"+jedis.lrange("scores",0,-1));
        System.out.println("排序:"+jedis.sort("scores"));

        jedis.lset("scores",0,"66");// 修改对应下标的内容
        System.out.println("修改后的数组内容:"+jedis.lrange("scores",0,-1));
        //删除列表指定下标的值
           System.out.println(jedis.lrem("scores",1,"99"));//1
        // 删除区间以外的数据
        System.out.println(jedis.ltrim("scores",0,1));//ok
      System.out.println("删除后的数组内容:"+jedis.lrange("scores",0,-1));//删除后的数组内容:[66, 77]
        // 列表出栈
        System.out.println(jedis.lpop("scores"));//66
        //在77 前插入 22
        jedis.linsert("scores", BinaryClient.LIST_POSITION.BEFORE,"77","22");
//在77 后插入 33
        jedis.linsert("scores", BinaryClient.LIST_POSITION.AFTER,"77","33");
        System.out.println("插入后的数组内容:"+jedis.lrange("scores",0,-1));//插入后的数组内容:[22, 77, 33]

        jedis.close();
    }

zadd与hmset方法举例

zadd是 有序集合的

 public  void TestE(){
        Jedis jedis = new Jedis("localhost");
        jedis.auth("123456");
        System.out.println("连接成功");
        System.out.println("服务正在运行:" + jedis.ping());

        //jedis.flushDB();
        HashMap<String, Double> scoreMembers = new HashMap<>();
        scoreMembers.put("aaa", 1001.0);
        scoreMembers.put("bbb", 1002.0);
        scoreMembers.put("ccc", 1003.0);
        scoreMembers.put("ddd", 1004.0);
        String key = "mysortset";

        jedis.zadd(key,1005.0,"eee");
        jedis.zadd(key,scoreMembers);
        //获取一个排序的集合中的成员数量
        System.out.println(jedis.zcard(key));
        //返回的成员在指定范围内的有序集合 ,0表示第一个元素  1表示第二个元素 以此类推
        //负数下标  -1 最后一个元素 -2表示倒数第二个元素
        Set<String> coll = jedis.zrange(key, 0, -1);
        System.out.println(coll);

        //返回指定返回的逆序集合
       coll = jedis.zrevrange(key, 0, -1);
        System.out.println(coll);//[eee, ddd, ccc, bbb, aaa]

        //返回指定key对应的value
        System.out.println(jedis.zscore(key,"bbb"));//1002.0
        //删除元素
        jedis.zrem("key","aaa");
        System.out.println(jedis.zrange(key, 0, -1));
        //给定值   获取范围内 成员的数量
        System.out.println(jedis.zcount(key,1002.0,1005.0));
        jedis.close();


    }

,hmset是哈希的

    public void TestF(){
        Jedis jedis = new Jedis("localhost");
        jedis.auth("123456");
        System.out.println("连接成功");
        System.out.println("服务正在运行:" + jedis.ping());
        jedis.flushDB();
        String key = "myhash";

        Map<String, String> hash = new HashMap<>();
        hash.put("aaa", "111");
        hash.put("bbb", "222");
        hash.put("ccc", "333");
        hash.put("ddd", "444");
jedis.hmset(key,hash);
        //追加元素
        jedis.hset(key,"eee","555");
        //获取hash的所有元素(key值)
        System.out.println(jedis.hkeys(key));
        //获取hash的所有元素值(value值)
        System.out.println(jedis.hvals(key));
        //获取hash中所有元素的数量
        System.out.println(jedis.hlen(key));
        //获取hash中全部的域和值  以键值对的形式返回
        Map<String, String> stringMap = jedis.hgetAll(key);//{aaa=111, ccc=333, bbb=222, eee=555, ddd=444}
        System.out.println(stringMap);
        //判断给定的key值是否在哈希集合中存在
        System.out.println(jedis.hexists(key,"bbb"));
        //获取hash中指定字段对应的值
        System.out.println("获取hash中指定字段对应的值:"+jedis.hmget(key,"aaa","ccc"));
        //获取指定的值
        System.out.println(jedis.hget(key,"aaa"));//111
        //删除指定的值
        System.out.println(jedis.hdel(key,"aaa"));//1
        System.out.println(jedis.hgetAll(key));
        //为key中 指定的value增加固定数值
        jedis.hincrBy(key,"bbb",100);
        System.out.println(jedis.hgetAll(key));

    }

redis管理工具查看如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值