09-Redis应用示例(简单抽奖/JSON类型)


前言

什么是NOSQL

在这里插入图片描述NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库

  随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型
(社会服务类型,类似百度、微信、淘宝)的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题
  而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。

工作中遇到的挑战:

1,高并发读写
Web2.0网站,数据库并发负载非常高,往往达到每秒上万次的读写请求

2,高容量存储和高效存储
Web2.0网站通常需要在后台数据库中存储海量数据,如何存储海量数据并进行高效的查询往往是一个挑战

3,高扩展性和高可用性
随着系统的用户量和访问量与日俱增,需要数据库能够很方便的进行扩展、维护

NOSQL优势与缺点

  • 优点:
    ​ 1)成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。
    ​ 2)查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。
    ​ 3)存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。

  • 缺点:
    ​ 1)维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语
    ​ 2)不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本
    ​ 3)不提供关系型数据库对事务的处理

  • 总结:
    关系型数据库与NoSQL数据库并非对立而是互补的关系,即通常情况下使用关系型数据库,在适合使用NoSQL的时候使用NoSQL数据库,让NoSQL数据库对关系型数据库的不足进行弥补
    一般会将数据存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据.


一、Redis特点及应用场景

  • 注意—特点及应用场景

  • redis的数据实际上还是保存在内存中,数据持久化体现在会每隔两秒将其写入到磁盘里,但是此时磁盘中存储的是redis的命令

  • redis可以用来减轻mysql的承载量

    并且因为redis是从内存中进行操作,效率高,因此一般是从mysql中读取到的数据就存入redis,然后进行第二次操作同一个数据时可以直接访问redis

  • 应用场景

    在大量数据的存储和查询上、不轻易修改的数据——redis
    不需要实时更新的数据,修改后临时数据,定时器判断某个时间存入磁盘的数据库中

    • 例如:
      • 12306
      • 购物车
      • 秒杀活动等

二、redis案例——简单抽奖

2.1 用到的redis数据类型

- Set集合类型及常用命令
在这里插入图片描述

  • 应用场景:交友型、社交型:共同好友、好友列表、关注列表等
  • Set集合类型常见命令
  • 单个集合进行操作
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
  • SortedSet类型(有序集合)及常用命令
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.2 代码示例

  • 分析:
    抽奖方式:
    1个一等奖 2个二等奖 3个三等奖 14个谢谢参与
  • 奖品:
    • 一等奖 华为电脑
    • 二等奖 华为手机
    • 三等奖 iphone智能手环
    • 下次努力
       
  • 实现步骤:
  • 写一个方法返回map集合——drawMap
    • 键:存储抽奖数据
    • 值:奖品
  • 将drawMap集合 键的数据 获取出来以redis数据类型中的set集合存入redis中——lucky
  • 再用有序集合的方法ZRANGE start end 获取出前五名 该方法自动返回一个set集合
  • 遍历该集合 依次让每一个人随机获取redis数据库中抽奖lucky的某一个元素(即模拟抽奖随机过程) 并打印其中奖/未中奖信息
    • 打印中奖信息:利用map集合的方法根据键获取值
  • 代码示例:
/**
     * 进行抽奖
     */
    public void chouJiang() {
        //1.建立连接
        Jedis jedis = new Jedis("localhost", 6379);
        //2.设置密码——可省略
        //3.选择库——可省略,默认选择0库

        //存入数据——利用redis中的set集合
        Map<String,String> drawMap=mapDraw();
        Set<Map.Entry<String, String>> entries = drawMap.entrySet();
        for (Map.Entry<String, String> entry : entries) {
            String jiangX = entry.getKey();
            jedis.sadd("lucky",jiangX);
        }

        //读取数据
        Set<String> userFive = linkOrFindSort();//获取前五名用户

        //模拟抽奖
        for (String s : userFive) {
            String lucky = jedis.spop("lucky");
            System.out.println("用户"+"\t"+s+"抽奖结果为:"+lucky);
            String jiangP = drawMap.get(lucky);
            System.out.println("奖品信息:"+jiangP);
        }

        if(jedis!=null){
            jedis.close();
        }
    }

    /**
     * 抽奖方式及信息
     * @return 双列集合  抽奖方式
     */
    private Map<String, String> mapDraw() {
        Map<String, String> drawMap = new HashMap<>();
        //设立奖项和奖品
        drawMap.put("一等奖","华为电脑");
        drawMap.put("二等奖1","华为手机");
        drawMap.put("二等奖2","华为手机");
        drawMap.put("三等奖1","iphone智能手环");
        drawMap.put("三等奖2","iphone智能手环");
        drawMap.put("三等奖3","iphone智能手环");
        for (int i = 1; i <=14; i++) {
            drawMap.put("谢谢参与"+i,"下次努力");
        }

        return drawMap;
    }

三、JSON类型在redis的使用

3.1 JSON和JAVA实体类对象的转化

3.2 代码示例

/**
     * redis的查询
     * 利用字符串与JSON对象的转化,
     * 实体类User对象转换为字符串存储进redis的有序集合sortedSet中
     * 查询时直接返回所有结果即可
     */
    public Set<Tuple> redisFindAll() {
        Set<Tuple> userRedisSortRes=null;
        LocalTime startR=null;
        try {
            //2.注册驱动 3.获取数据库连接对象 ——使用工具类
            conn = JDBCUtils.getConnection();
            //4.定义sql语句
            String sql="SELECT * FROM User";
            //5.获取执行sql对象
            pstmt = conn.prepareStatement(sql);
            //6.执行sql
            resS = pstmt.executeQuery();

            while (resS.next()){
                int id = resS.getInt(1);
                String name = resS.getString(2);
                int age = resS.getInt(3);
                String phoneNum=resS.getString(4);

                User user = new User(id,name,age,phoneNum);//创建用户类对象
//                HashSet<User> userR = new HashSet<>();
//                userR.add(user);//将类对象加载进set集合中
                String jsonJB = JSON.toJSONString(user);//将用户对象转化为json字符串,可作为有序集合String字段存储

                /**
                 * redis的连接与应用
                 */
                //记录开始时间
                startR= LocalTime.now();
                //1.建立连接
                Jedis jedis = new Jedis("localhost", 6379);
                //2.设置密码——可省略
                //3.选择库——可省略,默认选择0库

                //存入数据
                jedis.zadd("user",age,jsonJB);//将age字段和jsonJB字段存入到有序集合中

                //读取数据
                Long userCount = jedis.zcard("user");//调用有序集合的方法返回user里的元素个数

                //所有数据的结果集
                userRedisSortRes = jedis.zrangeWithScores("user", 0, userCount);


                if(jedis!=null){
                    jedis.close();
                }

            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //8.释放资源
            JDBCUtils.close(pstmt,conn,resS);
        }
        //记录结束时间
        LocalTime endR= LocalTime.now();
        long time = Duration.between(startR, endR).toMillis();
        System.out.println("redis数据库查询时间为(毫秒):"+time);
        return userRedisSortRes;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值