Java使用Redis初探

            <p>&nbsp; &nbsp; &nbsp;Redis的相关概念不做介绍了,大家也可以先了解下Memcached,然后比较下二者的区别,就会有个整体的印象。</p><p></p><p>&nbsp; &nbsp; &nbsp;服务器端通常选择Linux , Redis对于linux是官方支持的,使用资料很多,需要下载相关服务器端程序&nbsp; ,然后解压安装。因为能力和条件有限,我只简单介绍下windows上如何安装和使用,有兴趣的可以娱乐一下。 &nbsp;</p><p>&nbsp; &nbsp; 服务器端程序下载地址:<a href="https://github.com/ServiceStack/redis-windows.git" rel="noopener nofollow">https://github.com/ServiceStack/redis-windows.git</a></p>&nbsp; &nbsp; 如果不好操作的话到这来:<a href="http://download.csdn.net/detail/u013283727/8212831" rel="noopener nofollow">http://download.csdn.net/detail/u013283727/8212831</a>&nbsp; &nbsp;<p>&nbsp; &nbsp; 下载完后使用cmd进入下载文件的目录中,尝试以下操作:</p><p><br></p><p></p><pre class="highlighter-hljs" highlighted="true"><code class="language-html highlighter-hljs hljs language-xml">Microsoft Windows [Version 6.1.7601]

Copyright (c) 2009 Microsoft Corporation. All rights reserved.

C:&gt;cd redis64-latest

C:\redis64-latest>redis-server redis.windows.conf --maxmemory 200m
.
.-__ ''-._ _.- .. ''-._ Redis 2.8.17 (00000000/0) 64 bit
.-.-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in stand alone mode |`-._`-...-` __...-.-.|'_.-'| Port: 6379 |-. ._ / _.-' | PID: 4552-._ -._-./ .-' .-'
|-._-.
-.__.-' _.-'_.-'| |-.
-._ _.-'_.-' | http://redis.io-._ -._-..-'.-' .-'
|-._-.
-.__.-' _.-'_.-'| |-.
-._ _.-'_.-' |-._ -._-.
.-'_.-' _.-'
-._-..-'_.-'
-._ _.-'-.
.-'

[4552] 01 Dec 13:38:53.147 # Server started, Redis version 2.8.17
[4552] 01 Dec 13:38:53.147 * DB loaded from disk: 0.000 seconds
[4552] 01 Dec 13:38:53.147 * The server is now ready to accept connections on po
rt 6379



客户端使用 java 程序来连接,在这里介绍两种常用的方法

(Jar 包直接找 maven 要:http://www.mvnrepository.com     一搜就出来了 )


1.Redisson

/**

  • @author fcs

  • Redisson Example
    */
    public class RedissonTest {
    public static void main(String[] args) {
    //1. 初始化
    Config config = new Config();
    config.setConnectionPoolSize(10);
    config.addAddress("127.0.0.1:6379");
    Redisson redisson = Redisson.create(config);
    System.out.println("redis 连接接成功。。。。。");

     <span class="hljs-comment">//2.测试concurrentMap,put时候就会同步到redis中</span>
     ConcurrentMap&lt;String, String&gt; map = redisson.getMap(<span class="hljs-string">"firstMap"</span>);
     map.put(<span class="hljs-string">"changshengfeng"</span>, <span class="hljs-string">"男"</span>);
     map.put(<span class="hljs-string">"yongtaoliu"</span>, <span class="hljs-string">"男"</span>);
     map.put(<span class="hljs-string">"qiaozhu"</span>, <span class="hljs-string">"女"</span>);
    
     <span class="hljs-type">ConcurrentMap</span> <span class="hljs-variable">resultMap</span> <span class="hljs-operator">=</span> redisson.getMap(<span class="hljs-string">"firstMap"</span>);
     System.out.println(<span class="hljs-string">"resultMap == "</span>+resultMap.keySet());
     <span class="hljs-comment">//关闭连接</span>
     redisson.shutdown();
    

    }
    }


2.Jedis

/**

  • @author fcs

  • test about jedis

  • Dec 1, 2014
    */
    public class JedisTest {
    private static Jedis jedis;

    @Before
    public void setup(){
    jedis = new Jedis("127.0.0.1", 6379);
    System.out.println("Redis 服务器已连接....");
    // jedis.auth("admin"); // 权限验证
    }

    /**

    • redis 存储字符串
      */
      @Test
      public void testString(){
      // 添加数据
      jedis.set("name", "fcs");
      System.out.println(jedis.get("name"));// 获取结果

      jedis.append("name", "is handsome");// 拼接

      jedis.del("name");// 删除某个键
      System.out.println(jedis.get("name"));

      jedis.mset("name","changsheng","age","22","qq","646653132");// 设置多个键值对
      jedis.incr("age");// 加 1 操作 在投票中可能用的上
      System.out.println(jedis.get("name")+"--"+jedis.get("age")+"--"+jedis.get("qq"));
      }

    /**

    • 操作 List
      */
      @Test
      public void testList(){
      jedis.del("java framework");
      System.out.println(jedis.lrange("java framework", 0, -1));
      // 先向 key java framework 存放三条数据
      jedis.lpush("java framework", "spring");
      jedis.lpush("java framework", "struts");
      jedis.lpush("java framework", "hibernate");
      // 再取出所有数据 jedis.lrange 是按范围取出 第一个是 key 第二个是其实位置 第三个是结束位置
      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");
      // 再取出所有数据 jedis.lrange 是按范围取出 第一个是 key 第二个是其实位置 第三个是结束位置
      System.out.println(jedis.lrange("java framework", 0, -1));

    }

    /**

    • 操作 Set
      */
      @Test
      public void testSet(){
      jedis.sadd("haha", "why");
      jedis.sadd("haha", "you");
      jedis.sadd("haha", "so");
      jedis.sadd("haha", "diao");
      jedis.sadd("haha", "?");
      // 移除
      jedis.srem("haha", "?");
      System.out.println("判断? 是不是 haha 集合的元素:"+jedis.sismember("haha", "?"));
      System.out.println("获取所有加入的 value:"+jedis.smembers("haha"));
      System.out.println("返回给定集合名的一个随机的 value:"+jedis.srandmember("haha"));
      System.out.println("返回集合的元素个数:"+jedis.scard("haha"));

    }

    /**

    • redis 操作 map
      */
      @Test
      public void testmap(){
      Map<String,String> map = new HashMap<String, String>();
      map.put("name", "小露");
      map.put("sex", "男");
      map.put("email", "haha@fcs.com");
      jedis.hmset("user", map);// 相当于给 map 再取一个名字

      List<String> rsmap = jedis.hmget("user", "name","sex");// 后面是一个可变参数列表 去某个 map 中的一些 key 代表的值
      System.out.println(rsmap);

      // 删除 map 中的某个键值
      jedis.hdel("user", "email");
      System.out.println("删除后 ----email"+jedis.hmget("user", "email"));
      System.out.println("是否存在 key 为 user 的记录:"+jedis.exists("user"));
      System.out.println("key 为 user 的 map 中存放的值的个数:"+jedis.hlen("user"));
      System.out.println("返回 map 对象中所有的 key:"+jedis.hkeys("user"));
      System.out.println("返回 map 对象中所有的 value:"+jedis.hvals("user"));

      // 使用迭代器
      Iterator<String> iter = jedis.hkeys("user").iterator();
      System.out.println("使用迭代器");
      while(iter.hasNext()){
      String key = iter.next();// 每次向后越过一个对象
      System.out.println(key+":"+jedis.hmget("user", key));// 迭代 key 根据 key 再取值 value
      }

    }

    /**

    • 这里在前面执行完之后直接再去拿值 试试这些进驻内存的数据是否还在
    • 可以把服务器端关掉再重启 再直接运行这个方法看看
    • 如果还有数据就说明该数据库自动完成了持久化 它有默认的持久化机制
      */
      @Test
      public void testNoSet(){
      Iterator<String> iter = jedis.hkeys("user").iterator();
      System.out.println("使用迭代器");
      while(iter.hasNext()){
      String key = iter.next();// 每次向后越过一个对象
      System.out.println(key+":"+jedis.hmget("user", key));// 迭代 key 根据 key 再取值 value
      }
      }
  • // @AfterClass 测试整个类时可以用 会关闭服务器端程序
    // public static void close(){
    // jedis.shutdown();// 不能用 @After 不然每次执行完一个方法都会关闭服务器
    // System.out.println("连接已关闭.....");
    // }

    }




    这时候可以看到 cmd 中有一些日志记录:(这就是它默认的持久化机制,可以在 redis.windows.conf 配置文件中查看)

    [3972] 01 Dec 13:59:04.073 * 1 changes in 900 seconds. Saving...
    [3972] 01 Dec 13:59:04.229 # fork operation complete
    [3972] 01 Dec 13:59:04.229 * Background saving terminated with success
    [3972] 01 Dec 14:20:05.127 * 1 changes in 900 seconds. Saving...
    [3972] 01 Dec 14:20:05.267 # fork operation complete
    [3972] 01 Dec 14:20:05.267 * Background saving terminated with success
    [3972] 01 Dec 14:35:06.074 * 1 changes in 900 seconds. Saving...
    [3972] 01 Dec 14:35:06.204 # fork operation complete
    [3972] 01 Dec 14:35:06.224 * Background saving terminated with success


       哎,先到这吧。。。。