redis基础

    使用redis也有一段时间了,今天就总结写些基础基本的东西吧。

    redis是干什么的,相信很多人都知道了,百度google一下就很多,说白了就是一个noSQL的内存数据库。相信很多人像我一样是使用windows平台开发的,所以开发时需要用虚拟机或者在实体机器上安装一个linux类的系统,或者找一个windows版。

    这个据说是ms移植:https://github.com/MSOpenTech/redis,不过了就要自己编译,有兴趣的可以研究一下源码。

    这里有已经编译好的可以下载:https://github.com/dmajkic/redis/downloads,就是版本不是很新而已。

    同时还需要下载java的客户端https://github.com/xetorthio/jedis,虽然还有其它可用的,不过这个是官方推荐加上是使用最多的。jedis就要自己编译了(可以找一下别人编译好的也可以啦),其实也很简单。下载源码,新建java项目,把src\main\java下面复制到src里面,使用ideexport导出jar,有报错也可以导出,只要在使用前加上下面这个就行了。

    commons-poolhttp://commons.apache.org/proper/commons-pool/download_pool.cgi,这个jedis在使用连接池用到的,根据jdk下载吧。 

    使用maven之类就百度google一下。

    解压下载的redis,运行redis-server.exe,在ide(自己使用myeclipse)新建项目之类的跳过啦。

     最简单的使用:

        Jedis jedis = new Jedis("localhost", 6379);
        jedis.set("a", "redis");
        String value = jedis.get("a");
        System.out.println(value);
        jedis.close();
  当想全局使用一个redis连接的话,这样还不行,需要在使用前先判断连接是否可用:

if (jedis.ping().equals("PONG")) {
}

只是一般很少这样做就像连接数据库一样,不会整个项目都使用一个Connection。
在实际使用中,一般会采用连接池的方式:

private JedisPool jedisPool;
public void initPool() {
        JedisPoolConfig config = new JedisPoolConfig();
        //配置一个pool最多有多少个状态为idle(空闲的)的jedis实例。
        config.setMaxIdle(20);
        //配置一个pool最少有多少个状态为idle(空闲的)的jedis实例。
        config.setMinIdle(1);
        //获取jedis实例是最多等待的时间
        config.setMaxWaitMillis(1000);
        //jedis最多连接数
        config.setMaxTotal(100);
        //在去连接时是否判断可用有效
        config.setTestOnBorrow(true);
        //归还连接池是是否测试可用
        //config.setTestOnReturn(true);
        jedisPool = new JedisPool(config, "localhost", 6379);

    }

    public void testKey() {
        //获取jedis实例
        Jedis jedis = jedisPool.getResource();
        // 清空数据
        System.out.println(jedis.flushDB());
        // 判断key"a"是否存在
        System.out.println(jedis.exists("a"));
        jedis.set("a", "values");
        System.out.println(jedis.exists("a"));
        jedisPool.returnResource(jedis);
    }

JedisPoolConfig的其它参数可根据实际情况配置,建议使用配置文件。
很多人到这一步就完成了。其实这里还是有些缺陷吧。上面的写法不适合用在真实使用的环境。因为当我们new一个对象,再调用initPool时,已经产生了一个连接池,如果别人也new一个又产生了一个连接池,这样就失去使用连接池的意义了。解决方向就是整个应用只使用一个连接池:单例或者static。
下面是使用static的:

public class Test2 {
 private static JedisPool jedisPool;
 static {
  JedisPoolConfig config = new JedisPoolConfig();
  // 配置一个pool最多有多少个状态为idle(空闲的)的jedis实例。
  config.setMaxIdle(20);
  // 配置一个pool最少有多少个状态为idle(空闲的)的jedis实例。
  config.setMinIdle(1);
  // 获取jedis实例是最多等待的时间
  config.setMaxWaitMillis(1000);
  // jedis最多连接数
  config.setMaxTotal(100);
  // 在去连接时是否判断可用有效
  config.setTestOnBorrow(true);
  // 归还连接池是是否测试可用
  // config.setTestOnReturn(true);
  jedisPool = new JedisPool(config, "localhost", 6379);
 }
 public void testKey() {
  // 获取jedis实例
  Jedis jedis = jedisPool.getResource();
  // 清空数据
  System.out.println(jedis.flushDB());
  // 判断key"a"是否存在
  System.out.println(jedis.exists("a"));
  jedis.set("a", "values");
  System.out.println(jedis.exists("a"));
  jedisPool.returnResource(jedis);
 }
}

单例的就不写了,想过几天写篇单例的用这个作为例子。
还有一种使用的也很多的就是ShardedJedisPool,分布式时使用,其实和上面也差不多:

public class Test3 {
    
    private static ShardedJedisPool shardedJedisPool;
    static {
        JedisPoolConfig config = new JedisPoolConfig();
        //配置一个pool最多有多少个状态为idle(空闲的)的jedis实例。
        config.setMaxIdle(20);
        //配置一个pool最少有多少个状态为idle(空闲的)的jedis实例。
        config.setMinIdle(1);
        //获取jedis实例是最多等待的时间
        config.setMaxWaitMillis(1000);
        //jedis最多连接数
        config.setMaxTotal(100);
        //在去连接时是否判断可用有效
        config.setTestOnBorrow(true);
        //归还连接池是是否测试可用
        //config.setTestOnReturn(true);
        List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
        shards.add(new JedisShardInfo("localhost", 6379));
        shards.add(new JedisShardInfo("localhost", 6378));
        // 构造池
        shardedJedisPool = new ShardedJedisPool(config, shards);

    }

    public void testKey() {
        // 获取jedis实例
        ShardedJedis jedis = shardedJedisPool.getResource();
        // 判断key"a"是否存在
        System.out.println(jedis.exists("a"));
        jedis.set("a", "values");
        System.out.println(jedis.exists("a"));
        shardedJedisPool.returnResource(jedis);
    }
}

细心的应该发现testKey里面 没有了jedis.flushDB()这个操作,使用ShardedJedisPool要清空数据要一个一个db清空,另外jedis有jedis.select选择数据库的,ShardedJedisPool是没有的。
另外,说一下修改redis端口。打开redis目录下的redis.conf,找到这个位置:

# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379

# If you want you can bind a single interface, if the bind option is not
# specified all the interfaces will listen for incoming connections.
#
# bind 127.0.0.1

修改6379为其它端口,不要直接双击redis-server.exe启动,在命令行启动 ,切换到redis目录,输入redis-server.exe redis.conf就行了。

PS: 当出现异常时,要销毁对象使用 returnBrokenResource,  使用完之后要归还连接returnResource。

参考:
http://budairenqin.iteye.com/blog/1734193 里面的封装方式个人挺喜欢的,有兴趣的可以参考一下。
http://redis.readthedocs.org/en/latest/ redis客户端的命令,也很有用的












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值