zoukankan      html  css  js  c++  java
  • Redis书签案例实战

    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set 有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

    场景

    在项目开发过程中,相信大家都遇到过这样的场景——一个书籍表,一个书籍标签表,然后一本书可以有多个标签,这个场景就和CSDN发布文章时的文章标签差不多。

    问题:如果我要查询多个标签共同的书籍,那么必须将表关联查询,这样影响效率。我们可以使用redis来帮忙。

    案例思路

    在添加书籍的时候,需要添加书籍和标签,将书籍保存到MySQL中,将标签保存到redis的set集合中,将每个标签看成一个set集合,然后每个标签保存的是书籍的id信息。如果需要查询多个标签共同的书籍,只需要将多个集合进行交集操作。

    结果图

    这里写图片描述

    项目结构图

    这里写图片描述

    index.html文件

    在这个页面是用来添加书籍的。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
        <title>Document</title>
    </head>
    <body>
        <form action="add.php" method="post">
            <p>请输入书名:<input type="text" name="title" /></p>
            <p>请输入标签:<input type="text" name="tags" /></p>
            <p><input type="submit" value="提交" /></p>
        </form>
    </body>
    </html>
    

    add.php文件

    这个文件主要处理添加书籍。
    首先生成生成自增长的id,用来给书籍的id使用,然后将标签信息添加到redis中,最后使用pdo将书籍信息添加到数据库中。

    <?php
    $redis = new Redis();
    $redis->connect('localhost',6379);
    //生成自增长的id
    $bid =  $redis->incr('bid');
    
    //将标签信息添加到redis中
    $tags = explode(',',trim($_POST['tags'],','));
    foreach($tags as $t){
        $redis->sAdd($t,$bid);
    }
    
    //使用pdo将书籍信息添加到数据库中
    $dsn = 'mysql:host=localhost;dbname=test';
    $pdo = new PDO($dsn,'root','1234');
    $pdo->query('set names utf8');
    $sql = 'insert into book values(?,?)';
    $st = $pdo->prepare($sql);
    $line = $st->execute([$bid,$_POST['title']]);
    if($line != 0){
        echo '添加书籍成功';
    }
    
    

    search.php文件

    这个文件主要处理搜索界面,也就是上面效果图的界面。首先创建一个redis对象并进行连接,然后获取地址栏的标签,然后将标签转换为数组,计算出用户输入标签的数量,因为每个标签都对应redis中的集合,所以给这几个集合取交集就可以了。

    <?php
    $redis = new Redis();
    $redis->connect('localhost',6379);
    $tags = explode(',',trim($_GET['tags'],','));
    $len = count($tags);
    if($len == 1){
        var_dump($redis->sMembers($tags[0]));
    }else if($len == 2){
        var_dump($redis->sInter($tags[0],$tags[1]));
    }else if($len == 3){
        var_dump($redis->sInter($tags[0],$tags[1],$tags[2]));
    }
    
  • 相关阅读:
    程序写法
    2011年C++再次给力
    WIN7+LINUX双系统
    随机洗牌算法
    Eclipse快捷键大全
    Android 编程规范
    android Context 上下文的几点解析
    消息模式Toast.makeText的几种常见用法
    Eclipse的优化
    用PULL解析器解析XML文件
  • 原文地址:https://www.cnblogs.com/cnsec/p/13407025.html
Copyright © 2011-2022 走看看