zoukankan      html  css  js  c++  java
  • Jedis实现多种功能总结

    Jedis实现多种功能总结 
    Jedis是Redis的java版本的客户端,利用Jedis可以简单的实现许多功能。

    一、 Pipeline 
    官方的说明: 
    starts a pipeline,which is a very efficient way to send lots of command and read all the responses when you finish sending them。 
    简单点说pipeline适用于批处理。当有大量的操作需要一次性执行的时候,可以用管道。 
    示例:

    Jedis jedis = new Jedis(String, int);
    Pipeline p = jedis.pipelined();
    p.set(key,value);//每个操作都发送请求给redis-server
    p.get(key,value);
    p.sync();//这段代码获取所有的response

    二、 分布式的锁实现 
    使用场景,随着访问量和数据量的增加,程序都开始实现集群、分布式部署,即同样的程序在不同的机器上部署多份。那么如何保证数据的同步呢?如何实现统一控制呢?基于redis我们可以实现一个分布式锁来处理以上问题。

    最常用的是第一种,具体理论了解和实现逻辑请看其他两个博客: 
    基于Redis实现分布式锁(上): https://blog.csdn.net/zlfprogram/article/details/74469762
    基于Redis实现分布式锁(下):https://blog.csdn.net/zlfprogram/article/details/74473322

    1. 通过jedis.setnx(key,value)实现

        public boolean lock(long timeout) {
            long nano = System.nanoTime();
            timeout *= ONE_MILLI_NANOS;
            try {
                while ((System.nanoTime() - nano) < timeout) {
                    if (jedis.setnx(key, LOCKED) == 1) {
                        jedis.expire(key, EXPIRE);
                        locked = true;
                        return locked;
                    }
                    // 短暂休眠,nano避免出现活锁
                    Thread.sleep(3, r.nextInt(500));
                }
            } catch (Exception e) {
            }
            return false;
        }

    2. 通过事务(multi)实现

    public boolean lock_2(long timeout) {
            long nano = System.nanoTime();
            timeout *= ONE_MILLI_NANOS;
            try {
                while ((System.nanoTime() - nano) < timeout) {
                    Transaction t = jedis.multi();
                    // 开启事务,当server端收到multi指令
                    // 会将该client的命令放入一个队列,然后依次执行,知道收到exec指令
                    t.getSet(key, LOCKED);
                    t.expire(key, EXPIRE);
                    String ret = (String) t.exec().get(0);
                    if (ret == null || ret.equals("UNLOCK")) {
                        return true;
                    }
                    // 短暂休眠,nano避免出现活锁
                    Thread.sleep(3, r.nextInt(500));
                }
            } catch (Exception e) {
            }
            return false;
        }

    3. 通过事务+监听实现

    public boolean lock_3(long timeout) {
            long nano = System.nanoTime();
            timeout *= ONE_MILLI_NANOS;
            try {
                while ((System.nanoTime() - nano) < timeout) {
                    jedis.watch(key);
                    // 开启watch之后,如果key的值被修改,则事务失败,exec方法返回null
                    String value = jedis.get(key);
                    if (value == null || value.equals("UNLOCK")) {
                        Transaction t = jedis.multi();
                        t.setex(key, EXPIRE, LOCKED);
                        if (t.exec() != null) {
                            return true;
                        }
                    }
                    jedis.unwatch();
                    // 短暂休眠,nano避免出现活锁
                    Thread.sleep(3, r.nextInt(500));
                }
            } catch (Exception e) {
            }
            return false;
        }

    三、 Redis分布式 
    当数据量或访问压力达到单台机器极限时,我们必须考虑集群部署,使用分片技术,将数据分散到多个机器上去。 
    Jedis实现了客户端的分片技术,同时也可以操作Redis-cluster服务端的分片技术。

    --------------------------------------------------------------------------慢慢了解!

    文章来源:https://blog.csdn.net/zlfprogram/article/details/74909909?locationNum=5&fps=1

  • 相关阅读:
    1、购买阿里云服务器
    struts2页面乱码解决方法
    struts第一次编写怎么都无法跳转页面
    时间转换与map集合
    struts2addActionError 、addFieldError、addActionMessage方法
    struts2基本流程
    struts2自定义类型转换器
    jsp聊天窗口随笔
    conn!=null与conn.isClosed的区别
    应用表单隐藏域进行提交
  • 原文地址:https://www.cnblogs.com/varchar-pig/p/14238709.html
Copyright © 2011-2022 走看看