redis基础

来源:互联网 发布:青岛中德生态园 知乎 编辑:程序博客网 时间:2024/05/22 11:39

    使用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客户端的命令,也很有用的












0 0
原创粉丝点击