zoukankan      html  css  js  c++  java
  • Redis的介绍及使用实例.

    Redis的介绍及使用实例.

     

    本文就来讲一下Redis安装的方法和Redis生成主键的优点以及和其他几种方式生成主键的对比. 

    1,Redis安装
    首先将Redis的tar包拷贝到Linux下的根目录


    然后解压到redis文件夹下:(先使用mkdir创建redis文件夹)


    接下来就是解压tar包到redis目录下:

    解压后的目录结构:


    编译: 使用Make命令

    安装:


    安装好之后的目录: 


    6379 下的目录结构:(这个rdb文件时: redis database, 暂时不用管它, 重启后自动生成的)


    bin下的目录结构:


    配置后台运行:(将redis-3.0.0目录下的redis.conf文件拷贝到6379目录下, 使用cp命令)


    编辑redis.conf文件(使用vim 命令编辑,修改daemonize为yes, 意思就是支持后台运行)


    启动redis服务:(启动及停止命令)

    客服端连接服务器:(如果是远程连接: ./bin/redis-cli -h 192.168.200.128 -p 6379)

    命令行演示:


    这样一个redis就启动完成了. 

    2, 使用Redis生成主键的优点及与其他生成主键方式的对比
    Redis生成ID
    当使用数据库来生成ID性能不够要求的时候,我们可以尝试使用Redis来生成ID。这主要依赖于Redis是单线程的,所以也可以用生成全局唯一的ID。可以用Redis的原子操作 INCR和INCRBY来实现。

    可以使用Redis集群来获取更高的吞吐量。假如一个集群中有5台Redis。可以初始化每台Redis的值分别是1,2,3,4,5,然后步长都是5。各个Redis生成的ID为:

    A:1,6,11,16,21

    B:2,7,12,17,22

    C:3,8,13,18,23

    D:4,9,14,19,24

    E:5,10,15,20,25

    这个,随便负载到哪个机确定好,未来很难做修改。但是3-5台服务器基本能够满足器上,都可以获得不同的ID。但是步长和初始值一定需要事先需要了。使用Redis集群也可以方式单点故障的问题。

    另外,比较适合使用Redis来生成每天从0开始的流水号。比如订单号=日期+当日自增长号。可以每天在Redis中生成一个Key,使用INCR进行累加。

    优点:

    1)不依赖于数据库,灵活方便,且性能优于数据库。

    2)数字ID天然排序,对分页或者需要排序的结果很有帮助。

    缺点:

    1)如果系统中没有Redis,还需要引入新的组件,增加系统复杂度。

    2)需要编码和配置的工作量比较大。

    用INT做主键的优点:

        1、需要很小的数据存储空间,仅仅需要4 byte 。

        2、insert和update操作时使用INT的性能比GUID好,所以使用int将会提高应用程序的性能。

        3、index和Join 操作,int的性能最好。

        4、容易记忆。

        5、支持通过函数获取最新的值,如:Scope_Indentity() 。

    使用INT做主键的缺点

        1、如果经常有合并表的操作,就可能会出现主键重复的情况。

        2、使用INT数据范围有限制。如果存在大量的数据,可能会超出INT的取值范围。

        3、很难处理分布式存储的数据表。

    使用GUID做主键的优点:

        1、它是独一无二的。

        2、出现重复的机会少。

        3、适合大量数据中的插入和更新操作。

        4、跨服务器数据合并非常方便。

    使用GUID做主键的缺点:

        1、存储空间大(16 byte),因此它将会占用更多的磁盘大小。

        2、很难记忆。join操作性能比int要低。

        3、没有内置的函数获取最新产生的guid主键。

        4、GUID做主键将会添加到表上的所以其他索引中,因此会降低性能。


    3. 代码中演示使用Redis
    Java接口测试Redis:



    Spring和Redis整合:

    Service层:(ProductServiceIml.java) 

    复制代码

          @Autowired
          private Jedis jedis;

     2     public void insertProduct(Product product){
     3         //商品设置
     4         //ID自增长的方式不好, 在这里使用redis生成id
     5         Long id = jedis.incr("pno");
     6         product.setId(id);
     7         
     8         //设置默认下架
     9         product.setIsShow(false);
    10         //默认不删除
    11         product.setIsDel(false);
    12         //时间
    13         product.setCreateTime(new Date());
    14         
    15         //保存商品, 在mapper.xml中写的是返回自增长的主键id, 然后进行级联保存sku表
    16         //但是product如果已经设置了id 就不会再返回主键id了.
    17         productDao.insertSelective(product);
    18         
    19         //库存 多个
    20         for (String color : product.getColors().split(",")) {
    21             //尺码
    22             for(String size : product.getSizes().split(",")){
    23                 Sku sku = new Sku();
    24                 //商品ID 这个在mapper.xml中设置返回主键id
    25                 sku.setProductId(product.getId());
    26                 //颜色 
    27                 sku.setColorId(Long.parseLong(color));
    28                 //市场价
    29                 sku.setMarketPrice(0f);
    30                 //售价
    31                 sku.setPrice(0f);
    32                 //运费
    33                 sku.setDeliveFee(10f);
    34                 //购买限制
    35                 sku.setUpperLimit(188);
    36                 //尺码
    37                 sku.setSize(size);
    38                 //时间
    39                 sku.setCreateTime(new Date());
    40                 //库存
    41                 sku.setStock(0);
    42                 skuDao.insertSelective(sku);
    43             }
    44         }
    45     }
    复制代码

    看到这个最上面使用了Jdis去调用Redis服务, 然后使用incr对pno(在redis中可以对pno设置值)加1操作. 之前使用的都是自增长ID, 在mapper.xml中insert完成之后自动返回主键id到product中, 在级联保存的时候可以直接使用product.getId(). 下面就来看一下redis与spring整合的配置.




    redis.xml配置文件:

     View Code


    关于Redis的使用暂时就这么多, 下次还会继续分享更多的内容. 

  • 相关阅读:
    虚函数中的变量作用域问题
    C++技能重拾2
    C++技能重拾
    位运算取第一个非0的位 r & (~(r-1))
    ThoughtWorks微服务架构交流心得
    字符串匹配的sunday算法
    Codeforces Round #270(利用prim算法)
    HDFS建筑与shell操作
    Spark SQL 源代码分析系列
    HDU 4686 Arc of Dream(递归矩阵加速)
  • 原文地址:https://www.cnblogs.com/du-0210/p/8426480.html
Copyright © 2011-2022 走看看