打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Jedis 对redis 的操作详解(上)


来源:朱小厮

链接:http://blog.csdn.net/u013256816/article/details/51125842


通过前一篇《redis的简单使用》的简单介绍,本篇主要阐述Jedis对redis的五大类型的操作:字符串、列表、散列、集合、有序集合。


JedisUtil


这里的测试用例采用junit4进行运行,准备代码如下:


private static final String ipAddr = '10.10.195.112';

    private static final int port = 6379;

    private static Jedis jedis= null;

 

    @BeforeClass

    public static void init()

    {

        jedis = JedisUtil.getInstance().getJedis(ipAddr, port);

    }

 

    @AfterClass

    public static void close()

    {

        JedisUtil.getInstance().closeJedis(jedis,ipAddr, port);

    }


其中JedisUtil是对jedis做的简单封装,代码如下:


import org.apache.log4j.Logger;

 

import java.util.HashMap;

import java.util.Map;

 

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.JedisPoolConfig;

 

public class JedisUtil

{

    private Logger logger = Logger.getLogger(this.getClass().getName());

 

    private JedisUtil(){}

 

    private static class RedisUtilHolder{

        private static final JedisUtil instance = new JedisUtil();

    }

 

    public static JedisUtil getInstance(){

        return RedisUtilHolder.instance;

    }

 

    private static Map maps = new HashMap();

 

    private static JedisPool getPool(String ip, int port){

        String key = ip+':'+port;

        JedisPool pool = null;

        if(!maps.containsKey(key))

        {

            JedisPoolConfig config = new JedisPoolConfig();

            config.setMaxActive(RedisConfig.MAX_ACTIVE);

            config.setMaxIdle(RedisConfig.MAX_IDLE);

            config.setMaxWait(RedisConfig.MAX_WAIT);

            config.setTestOnBorrow(true);

            config.setTestOnReturn(true);

 

            pool = new JedisPool(config,ip,port,RedisConfig.TIMEOUT);

            maps.put(key, pool);

        }

        else

        {

            pool = maps.get(key);

        }

        return pool;       

    }

 

    public Jedis getJedis(String ip, int port)

    {

        Jedis jedis = null;

        int count = 0;

        do

        {

            try

            {

                jedis = getPool(ip,port).getResource();

            }

            catch (Exception e)

            {

                logger.error('get redis master1 failed!',e);

                getPool(ip,port).returnBrokenResource(jedis);

            }

        }

        while(jedis == null && count<>

        return jedis;

    }

 

    public void closeJedis(Jedis jedis, String ip, int port){

        if(jedis != null)

        {

            getPool(ip,port).returnResource(jedis);

        }

    }

}

 

public class RedisConfig

{

    //可用连接实例的最大数目,默认值为8;

    //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。

    public static int MAX_ACTIVE = 1024;

 

    //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。

    public static int MAX_IDLE = 200;

 

    //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;

    public static int MAX_WAIT = 10000;

 

    public static int TIMEOUT = 10000;

 

    public static int RETRY_NUM = 5;

}


键操作


@Test public void testKey() throws InterruptedException

   {

       System.out.println('清空数据:'+jedis.flushDB());

       System.out.println('判断某个键是否存在:'+jedis.exists('username'));

       System.out.println('新增<'username','zzh'>的键值对:'+jedis.set('username', 'zzh'));

       System.out.println(jedis.exists('name'));

       System.out.println('新增<'password','password'>的键值对:'+jedis.set('password', 'password'));

       System.out.print('系统中所有的键如下:');

       Set keys = jedis.keys('*');

       System.out.println(keys);

       System.out.println('删除键password:'+jedis.del('password'));

       System.out.println('判断键password是否存在:'+jedis.exists('password'));

       System.out.println('设置键username的过期时间为5s:'+jedis.expire('username', 5));

       TimeUnit.SECONDS.sleep(2);

       System.out.println('查看键username的剩余生存时间:'+jedis.ttl('username'));

       System.out.println('移除键username的生存时间:'+jedis.persist('username'));

       System.out.println('查看键username的剩余生存时间:'+jedis.ttl('username'));

       System.out.println('查看键username所存储的值的类型:'+jedis.type('username'));

   }


输出结果:


清空数据:OK

判断某个键是否存在:false

新增<'username','zzh'>的键值对:OK

false

新增<'password','password'>的键值对:OK

系统中所有的键如下:[username, password]

删除键password:1

判断键password是否存在:false

设置键username的过期时间为5s:1

查看键username的剩余生存时间:3

移除键username的生存时间:1

查看键username的剩余生存时间:-1

查看键username所存储的值的类型:string


字符串操作


在Redis里面,字符串可以存储三种类型的值:


  • 字节串(byte string)

  • 整数

  • 浮点数


字节串


@Test public void testString() throws InterruptedException

  {

      jedis.flushDB();

      System.out.println('===========增加数据===========');

      System.out.println(jedis.set('key1','value1'));

      System.out.println(jedis.set('key2','value2'));

      System.out.println(jedis.set('key3', 'value3'));

      System.out.println('删除键key2:'+jedis.del('key2'));

      System.out.println('获取键key2:'+jedis.get('key2'));

      System.out.println('修改key1:'+jedis.set('key1', 'value1Changed'));

      System.out.println('获取key1的值:'+jedis.get('key1'));

      System.out.println('在key3后面加入值:'+jedis.append('key3', 'End'));

      System.out.println('key3的值:'+jedis.get('key3'));

      System.out.println('增加多个键值对:'+jedis.mset('key01','value01','key02','value02','key03','value03'));

      System.out.println('获取多个键值对:'+jedis.mget('key01','key02','key03'));

      System.out.println('获取多个键值对:'+jedis.mget('key01','key02','key03','key04'));

      System.out.println('删除多个键值对:'+jedis.del(new String[]{'key01','key02'}));

      System.out.println('获取多个键值对:'+jedis.mget('key01','key02','key03'));

 

      jedis.flushDB();

      System.out.println('===========新增键值对防止覆盖原先值==============');

      System.out.println(jedis.setnx('key1', 'value1'));

      System.out.println(jedis.setnx('key2', 'value2'));

      System.out.println(jedis.setnx('key2', 'value2-new'));

      System.out.println(jedis.get('key1'));

      System.out.println(jedis.get('key2'));

 

      System.out.println('===========新增键值对并设置有效时间=============');

      System.out.println(jedis.setex('key3', 2, 'value3'));

      System.out.println(jedis.get('key3'));

      TimeUnit.SECONDS.sleep(3);

      System.out.println(jedis.get('key3'));

 

      System.out.println('===========获取原值,更新为新值==========');//GETSET is an atomic set this value and return the old value command.

      System.out.println(jedis.getSet('key2', 'key2GetSet'));

      System.out.println(jedis.get('key2'));

 

      System.out.println('获得key2的值的字串:'+jedis.getrange('key2', 2, 4));

  }


输出结果:


===========增加数据===========

OK

OK

OK

删除键key2:1

获取键key2:null

修改key1:OK

获取key1的值:value1Changed

在key3后面加入值:9

key3的值:value3End

增加多个键值对:OK

获取多个键值对:[value01, value02, value03]

获取多个键值对:[value01, value02, value03, null]

删除多个键值对:2

获取多个键值对:[null, null, value03]

===========新增键值对防止覆盖原先值==============

1

1

0

value1

value2

===========新增键值对并设置有效时间=============

OK

value3

null

===========获取原值,更新为新值==========

value2

key2GetSet

获得key2的值的字串:y2G



memcached和redis同样有append的操作,但是memcached有prepend的操作,redis中并没有。



整数和浮点数


@Test public void testNumber()

   {

       jedis.flushDB();

       jedis.set('key1', '1');

       jedis.set('key2', '2');

       jedis.set('key3', '2.3');

       System.out.println('key1的值:'+jedis.get('key1'));

       System.out.println('key2的值:'+jedis.get('key2'));

       System.out.println('key1的值加1:'+jedis.incr('key1'));

       System.out.println('获取key1的值:'+jedis.get('key1'));

       System.out.println('key2的值减1:'+jedis.decr('key2'));

       System.out.println('获取key2的值:'+jedis.get('key2'));

       System.out.println('将key1的值加上整数5:'+jedis.incrBy('key1', 5));

       System.out.println('获取key1的值:'+jedis.get('key1'));

       System.out.println('将key2的值减去整数5:'+jedis.decrBy('key2', 5));

       System.out.println('获取key2的值:'+jedis.get('key2'));

   }


输出结果:


key1的值:1

key2的值:2

key1的值加1:2

获取key1的值:2

key2的值减1:1

获取key2的值:1

将key1的值加上整数5:7

获取key1的值:7

将key2的值减去整数5:-4

获取key2的值:-4


在redis2.6或以上版本中有这个命令:incrbyfloat,即将键存储的值加上浮点数amount,jedis-2.1.0中不支持这一操作。


接下文


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Redis随笔(五)Jedis、jedisCluster的使用
java对redis的基本操作
Java中使用Jedis连接Redis对String进行操作的常用命令
RedisRedis快速入门
Redis分布式事务
redis缓存和mysql数据库同步
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服