Redis学习---Java应用Redis Jedis

 阅读目录

     1.封装RedisUtil 构建redis连接池

     2.使用Junit Test Redis String,List,Set Hash等基本数据类型存储

     3.Redis 事务以及管道应用

     4.Redis 限制登录小应用

 

<一>  封装RedisUtil构建redis连接池

      1. Redis提供各种语言的API,目前基于Java语言实现的封装Jar有Jedis,在maven版本库最新版本2.9.0版本

         使用maven构建工程,配置pom.xml文件,即可下载jedis Jar

 <dependency>
        <groupId>redis.clients</groupId>
          <artifactId>jedis</artifactId>
         <version>2.9.0</version>
  </dependency>

     2.  封装RedisUtil. 初始化连接池,使用static模块初始化,即类加载时就初始化

    private static String HOST = "192.168.110.210";
    private static Integer PORT = 6379;
    private static String AUTH = "123456";
    // 可用连接实例的最大数目,默认值为8;
    // 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
    private static int MAX_ACTIVE = 1024;
    // 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8.
    private static int MAX_IDLE = 200;
    // 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出
    private static int MAX_WAIT = 10000;
    private static int TIMEOUT = 10000;
    // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
    private static boolean TEST_ON_BORROW = true;
    private static JedisPool jedisPool = null;

    static {
        try {

            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            jedisPoolConfig.setMaxIdle(MAX_IDLE);
            jedisPoolConfig.setMaxWaitMillis(MAX_WAIT);
            jedisPoolConfig.setMaxTotal(MAX_ACTIVE);
            jedisPoolConfig.setTestOnBorrow(TEST_ON_BORROW);
            jedisPool = new JedisPool(jedisPoolConfig, HOST, PORT, TIMEOUT, AUTH);
        } catch (Exception ex) {
            System.out.println("===初始化redis连接池出错===");
        }
    }

      3.实例化Jedis对象,获得redis服务器连接池的一个客户端连接

 public static synchronized Jedis getJedis() {
        Jedis jedis = null;
        if (jedisPool != null) {
            jedis = jedisPool.getResource();
            System.out.println("jedis===="+jedis);
        }
        return jedis;
    }

  <二> Redis 基本数据类型应用

       1,String 类型应用

    @Test
    public void testString() {
          jedis.set("name", "JJ");// 向key --->name放入了value--->JJ
          System.out.println("name value is " + jedis.get("name")); 
          // 拼接
          jedis.append("name", "is da jj"); System.out.println("name value is "+ jedis.get("name")); 
          // 删除 
          jedis.del("name"); 
          System.out.println("name value is" + jedis.get("name")); 
          //设置多个key-value
          jedis.mset("name", "周哥", "age", "27", "sex", "男"); 
          //对某个Key进行加1操作
          jedis.incr("age"); //只允许对int类型操作
          System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("sex"));
    }

     2. 操作Hash类型,Map

public void testMap() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("name", "梅西");
        map.put("age", "30");
        map.put("sex", "男");
        // 设置key为user value 为map操作
        jedis.hmset("user", map);
        List<String> list = jedis.hmget("user", "name", "age", "sex");
        System.out.println("list" + list);

        // 删除map某个key
        jedis.hdel("user", "name");
        System.out.println(jedis.hmget("user", "name"));
        System.out.println(jedis.hlen("user"));// 返回key为“user”的键中存放的值个数
        System.out.println(jedis.exists("user"));// 查找是否“user” key的是否存在
        System.out.println(jedis.hkeys("user")); // 返回所有的”user“ key 的map所有的key
        System.out.println(jedis.hvals("user")); // 返回“user” key的所有值

        Iterator<String> iterator = jedis.hkeys("user").iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            System.out.println("key=" + key + jedis.hmget("user", key));
        }
    }

         3.  操作List 

public void testList() {

        jedis.del("java framework");
        // 取key 为java framework的所有内容
        System.out.println(jedis.lrange("java framework", 0, -1));

        // 倒序放入
        jedis.lpush("java framework", "spring");
        jedis.lpush("java framework", "struct");
        jedis.lpush("java framework", "hibernate");
        // 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有
        System.out.println(jedis.lrange("java framework", 0, -1));

        jedis.del("java framework");
        // 顺序放入
        jedis.rpush("java framework", "spring");
        jedis.rpush("java framework", "struts");
        jedis.rpush("java framework", "hibernate");
        System.out.println(jedis.lrange("java framework", 0, -1));
    }

         4. 操作Set

public void testSet() {
        // 添加
        jedis.sadd("user2", "liuling");
        jedis.sadd("user2", "xinxin");
        jedis.sadd("user2", "ling");
        jedis.sadd("user2", "zhangxinxin");
        jedis.sadd("user2", "who");
        // 移除noname
        jedis.srem("user2", "who");
        System.out.println(jedis.smembers("user2"));// 获取所有加入的value
        System.out.println(jedis.sismember("user2", "who"));// 判断 who
                                                            // 是否是user集合的元素
        System.out.println(jedis.srandmember("user2"));// 返回key user2随机的一个元素
        System.out.println(jedis.scard("user2"));// 返回集合的元素个数
    }

    <三> Redis 事务以及管道应用

       1. 事务操作

public void testTranstaction() {
        jedis.del("n=0");
        Transaction tx = jedis.multi(); // 开启事务
        for (int i = 0; i < 10000; i++) {
            tx.set("n=" + i, "n=" + i); // 注意使用事务set
        }

        tx.zadd("foo", 1, "a");
        tx.zadd("foo", 2, "b");
        tx.zadd("foo", 3, "c");
        Response<Set<String>> sose = tx.zrange("foo", 0, -1);
        tx.exec();// 提交事务
        //
        System.out.println(jedis.get("n=0"));
        System.out.println(sose.get());
        jedis.disconnect();
    }

     2. 管道方式操作

public void testPipelined() throws Exception {

        Pipeline pipeline = jedis.pipelined();
        pipeline.zadd("foottt", 0, "aa");
        pipeline.zadd("foottt", 1, "ba");
        pipeline.zadd("foottt", 2, "ca");
        //注意存入的

        Response<Set<String>> stResponse2 = pipeline.zrange("foottt", 0, -1);

        pipeline.sync();

        System.out.println(stResponse2.get().size());
        // Response<Set<String>> sose2 = pipeline.zrange("foo", 0, -1);
        // System.out.println(sose2.get());
    }

      redis  管道的方式可以减少客户端与redis 的通信次数,提高性能

    <四> 使用redis,限制每个用户的ID一个小时内只能登陆5次

            实现思路:记录用户第五次的登陆时间,与现在的时间之差是否已经大于1小时,如果大于则可以登陆,如果不大于则不能登陆

public void testLogin4Hour() throws Exception {
        String id = "1234567";
        /*
         * jedis.rpush(id, String.valueOf(System.currentTimeMillis()));
         * jedis.rpush(id,"操"); System.out.println(jedis.lindex(id, 1)); //
         * 取出key 为id的第2个元素值
         */
        jedis.del(id);
        // 模拟用户5次登陆
        for (int i = 0; i < 5; i++) {

            jedis.rpush(id, String.valueOf(System.currentTimeMillis()));
            System.out.println("第" + (i + 1) + "次登陆的时间:"
                    + DateUtils.date2string(new Date(System.currentTimeMillis()), "YYYY-MM-dd HH:mm:ss"));
            // 每隔10分钟登陆一次,第5次登陆则在40分钟之后
            Thread.sleep(12 * 60 * 1000);
        }
        // 取出第五次的登陆的时间点
        String value_5 = jedis.lindex(id, 4);
        System.out.println("第5次登陆的时间:" + DateUtils.date2string(new Date(Long.valueOf(value_5)), "YYYY-MM-dd HH:mm:ss"));
        Long diffTime = System.currentTimeMillis() - Long.valueOf(value_5);

        if (value_5 != null && diffTime <= 1 * 60 * 60 * 1000) {
            System.out.println("不能登陆");
        } else {
            System.out.println("可以继续登陆");
        }

        jedis.disconnect();

    }

 

posted @ 2017-04-13 16:26  hlw2  阅读(1355)  评论(0)    收藏  举报