jedis经常使用API

1、Redis Client介绍

1.一、简介java

Jedis Client是Redis官网推荐的一个面向java客户端,库文件实现了对各种API进行封装调用。git

Jedis源码工程地址:https://github.com/xetorthio/jedisgithub

1.二、使用redis

Redis Client最好选用与服务端对应的版本,本例中使用Redis 2.8.19客户端使用jedis -2.6.3,Maven工程添加以下引用便可。spring

   <dependency>数据库

         <groupId>redis.clients</groupId>apache

         <artifactId>jedis</artifactId>缓存

         <version>2.6.3</version>服务器

         <type>jar</type>app

         <scope>compile</scope>

   </dependency>

1.三、注意事项

Redis Client拥有众多对接版本,本项目目前使用Jedis为官方推荐Java对接客户端,是基于其对Redis良好的版本支持和API对接,另外编码中尽可能避免使用废弃接口。

Redis目前正在新版过渡期,3.0版本暂未稳定,可是因为3.0版本提供了最新的集群功能,可能在往后稳定版发布之后升级到3.0,目前使用的Jedis支持3.0的目前版本API。

2、Redis Client经常使用API

2.一、环境要求

语言:Java

JDK:1.7

Redis : 2.8.19(稳定版)

2.二、系统使用

2.2.一、创建链接

  • 普通链接

Jedis jedis = new Jedis("localhost");

       jedis.set("foo", "bar");

       String value = jedis.get("foo");

       System.out.println(value);

  • 设置链接池配置

该方法用于获得redis链接池链接使用的链接池配置,该链接池配置也能够经过spring注入的方式来进行相对应的配置,链接池采用的是平时比较经常使用的org.apache.commons.pool2.impl.GenericObjectPoolConfig来进行的链接池管理

配置文件以下

#redis服务器ip #   

    redis.ip=172.30.5.117 

   

    #redis服务器端口号# 

    redis.port=6379 

     

    ###jedis##pool##config### 

    #jedis的最大分配对象# 

    jedis.pool.maxActive=1024 

   

    #jedis最大保存idel状态对象数 # 

    jedis.pool.maxIdle=200 

   

    #jedis池没有对象返回时,最大等待时间 # 

    jedis.pool.maxWait=1000 

   

    #jedis调用borrowObject方法时,是否进行有效检查# 

    jedis.pool.testOnBorrow=true 

   

    #jedis调用returnObject方法时,是否进行有效检查 # 

    jedis.pool.testOnReturn=true

链接池配置实例化代码(也可经过spring注入进行配置):

   /**

    * 获取化链接池配置

    * @return JedisPoolConfig

    * */

   private JedisPoolConfig getPoolConfig(){

      if(config == null){

         config = new JedisPoolConfig();

         //最大链接数

config.setMaxTotal(Integer.valueOf(getResourceBundle().getString("redis.pool.maxTotal")));

         //最大空闲链接数

config.setMaxIdle(Integer.valueOf(getResourceBundle().getString("redis.pool.maxIdle")));

         //获取链接时的最大等待毫秒数(若是设置为阻塞时BlockWhenExhausted),若是超时就抛异常, 小于零:阻塞不肯定的时间,  默认-1

config.setMaxWaitMillis(Long.valueOf(getResourceBundle().getString("redis.pool.maxWaitMillis")));

         //在获取链接的时候检查有效性, 默认false

config.setTestOnBorrow(Boolean.valueOf(getResourceBundle().getString("redis.pool.testOnBorrow")));

         //在获取返回结果的时候检查有效性, 默认false

config.setTestOnReturn(Boolean.valueOf(getResourceBundle().getString("redis.pool.testOnReturn")));

      }

      return config;

   }

  • 普通链接池链接

  这里展现的是普通的链接池方式连接redis的方案,跟普通的数据库链接池的操做方式相似;

/**

        * 初始化JedisPool

        * */

   private void initJedisPool(){

      if(pool == null){

         //获取服务器IP地址

         String ipStr = getResourceBundle().getString("redis.ip");

         //获取服务器端口

         int portStr = Integer.valueOf(getResourceBundle()

.getString("redis.port"));

         //初始化链接池

         pool = new JedisPool(getPoolConfig(), ipStr,portStr);

      }

   } 

  • Sentinel链接池链接

该链接池用于应对Redis的Sentinel的主从切换机制,可以正确在服务器宕机致使服务器切换时获得正确的服务器链接,当服务器采用该部署策略的时候推荐使用该链接池进行操做;

   private void initJedisSentinelPool(){

      if(sentinelpool == null){

         //监听器列表

         Set<String> sentinels = new HashSet<String>();

         //监听器1

         sentinels.add(new HostAndPort("192.168.50.236",

26379).toString());

         //监听器2

         sentinels.add(new HostAndPort("192.168.50.237",

26379).toString());

//实际使用的时候在properties里配置便可:redis.sentinel.hostandports

=192.168.50.236:26379,192.168.50.237:26379

getResourceBundle().getString("redis.sentinel.hostandports")

//mastername是服务器上的master的名字,在master服务器的sentinel.conf中配置:

                     //[sentinel monitor server-1M  192.168.50.236 6379 2]

                     //中间的server-1M即为这里的masterName

         String masterName = getResourceBundle()

.getString("redis.sentinel.masterName");

         //初始化链接池

         sentinelpool = new JedisSentinelPool(masterName,

sentinels, getPoolConfig());

      }

   }

  • ShardedJedisPool链接池分片链接

   /**

        * 初始化ShardedJedisPool

        * Redis在容灾处理方面能够经过服务器端配置Master-Slave模式来实现。

        * 而在分布式集群方面目前只能经过客户端工具来实现一致性哈希分布存储,即key分片存储。

        * Redis可能会在3.0版本支持服务器端的分布存储

        * */

   private void initShardedJedisPool() {

      if (shardPool == null) {

         // 建立多个redis共享服务

         String redis1Ip = getResourceBundle().getString("redis1.ip");

         int redis1Port = Integer.valueOf(bundle.getString("redis.port"));

         JedisShardInfo jedisShardInfo1 = new JedisShardInfo(redis1Ip, redis1Port);

         String redis2Ip = getResourceBundle().getString("redis2.ip");

         int redis2Port = Integer.valueOf(bundle.getString("redis.port"));

         JedisShardInfo jedisShardInfo2 = new JedisShardInfo(redis2Ip, redis2Port);

 

         List<JedisShardInfo> serverlist = new LinkedList<JedisShardInfo>();

         serverlist.add(jedisShardInfo1);

         serverlist.add(jedisShardInfo2);

         // 初始化链接池

         shardPool = new ShardedJedisPool(getPoolConfig(),serverlist);

      }

   }

  • 读写删除操做

// 从池中获取一个Jedis对象

      Jedis jedis = sentinelpool.getSentinelpoolResource();

      String keys = "name";

   // 删除key-value对象,若是key不存在则忽略此操做

      jedis.del(keys);

   // 存数据

      jedis.set(keys, "snowolf");

// 判断key是否存在,不存在返回false存在返回true

      jedis.exists(keys);

   // 取数据

      String value = jedis.get(keys);

   // 释放对象池(3.0将抛弃该方法)

      sentinelpool.returnSentinelpoolResource(jedis);

3、示例代码

  1. 1.     String的简单追加

// 从池中获取一个Jedis对象

   JedisUtil.getInstance().STRINGS.append(key, value);

  1. 2.     价格时间排序(前提是已经存储了价格,时间的SortSet)

//执行2级排序操做()

String stPriceSet = “stPriceSet”;//stPriceSet价格的sortset列表名

String stTimeSet = “stTimeSet”; // stTimeSet时间的sortset列表名

   Set<Tuple> sumSet = JedisUtilEx.getInstance()

.getSortSetByPirceUpAndTimeDown(stPriceSet, stTimeSet);

//排序之后能够重复获取上次排序结果(缓存时间10分钟)

Set<Tuple> sumSet = JedisUtilEx.getInstance()

getLastPirceUpAndTimeDownSet();

  1. 3.  价格时间排序(前提是已经存储了价格,时间的SortSet)

//执行2级排序操做

String stPriceSet = “stPriceSet”;//stPriceSet价格的sortset列表名

String stTimeSet = “stTimeSet”; // stTimeSet时间的sortset列表名

   Set<Tuple> sumSet = JedisUtilEx.getInstance()

. getSortSetByPirceDownAndTimeDown (stPriceSet, stTimeSet);

   //排序之后能够重复获取上次排序结果(缓存时间10分钟)

Set<Tuple> sumSet = JedisUtilEx.getInstance()

getLastPirceDownAndTimeDownSet ();

  1. 4.     保存JavaBean到hash表中

// bean继承至RedisBean

JedisUtilEx.getInstance().setBeanToHash(bean);

  1. 5.     从hash表中读取JavaBean

//uuid为业务制定的惟一标识符规则(至关于主键)

String uuid = “1”; //该ID是咱们提早就知道的

//T继承至RedisBean;

JedisUtilEx.getInstance().getBeanFromHash (uuid,Class<T> cls);

  1. 6.     将JavaBean列表装入hash中

//list中的bean继承至RedisBean

List<T> beanList = …;

JedisUtilEx.getInstance().setBeanListToHash(beanList);

//异步版本的存储列表到hash

JedisUtilEx.getInstance().setBeanListToHashSyn(beanList);

  1. 7.     普通的操做流程示例

//获取jedis引用

Jedis jedis = JedisUtil.getInstance().getJedis();

//执行业务以及调用jedis提供的接口功能

jedis.hset(…);

//执行完成之后务必释放资源

JedisUtil.getInstance().returnJedis(jedis);

//若之后不会使用JEDIS,须要关闭全部连接池

   RedisConnetcion.destroyAllPools();

  1. 8.     事务执行流程

//获取链接资源

   Jedis jd = JedisUtil.getInstance().getJedis();

//开启事务

Transaction ts = jd.multi();

//执行业务以及调用jedis提供的接口功能

jedis.hset(…);

//执行事务

   List<Object> list = ts.exec();

//释放资源

JedisUtil.getInstance().returnJedis(jd);

  1. 9.     异步执行

//获取链接资源

   Jedis jedis = JedisUtil.getInstance().getJedis();

   //获取管道

Pipeline pipeline = jedis.pipelined();

//执行业务以及调用jedis提供的接口功能

jedis.hset(…);

//提交并释放管道

pipeline.syncAndReturnAll();

//释放资源

JedisUtil.getInstance().returnJedis(jedis);

  1. 10.  如何获取Jedis命名规则的合成KEY

//获取类的惟一键值key,例如:User:1(User为class,1为uuid)其中user继承于Reidsbean

JedisUtilEx.getInstance().getBeanKey(user);

//另外一种获取类的惟一键值key的方法

JedisUtilEx.getInstance().getBeanKey(String uuid,Class<T> cls);

//获取bean对应的KEY(对应列的惟一键值key)

JedisUtilEx.getInstance().getBeanKey(String uuid,Class<T> cls,String... fileds);

//获取bean对应的KEY(集群key)

JedisUtilEx.getInstance().getBeanKey(Class<T> cls,String... fileds);

4、jedis操做命令:

1.对value操做的命令

     exists(key):确认一个key是否存在

     del(key):删除一个key

     type(key):返回值的类型

     keys(pattern):返回知足给定pattern的全部key

     randomkey:随机返回key空间的一个key

     rename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除newname表示的key

     dbsize:返回当前数据库中key的数目

     expire:设定一个key的活动时间(s)

     ttl:得到一个key的活动时间

     select(index):按索引查询

     move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库

     flushdb:删除当前选择数据库中的全部key

     flushall:删除全部数据库中的全部key

2.对String操做的命令

     set(key, value):给数据库中名称为key的string赋予值value

     get(key):返回数据库中名称为key的string的value

     getset(key, value):给名称为key的string赋予上一次的value

     mget(key1, key2,…, key N):返回库中多个string(它们的名称为key1,key2…)的value

     setnx(key, value):若是不存在名称为key的string,则向库中添加string,名称为key,值为value

     setex(key, time, value):向库中添加string(名称为key,值为value)同时,设定过时时间time

     mset(key1, value1, key2, value2,…key N, value N):同时给多个string赋值,名称为key i的string赋值value i

     msetnx(key1, value1, key2, value2,…key N, value N):若是全部名称为key i的string都不存在,则向库中添加string,名称key i赋值为value i

     incr(key):名称为key的string增1操做

     incrby(key, integer):名称为key的string增长integer

     decr(key):名称为key的string减1操做

     decrby(key, integer):名称为key的string减小integer

     append(key, value):名称为key的string的值附加value

     substr(key, start, end):返回名称为key的string的value的子串

3.对List操做的命令

     rpush(key, value):在名称为key的list尾添加一个值为value的元素

     lpush(key, value):在名称为key的list头添加一个值为value的 元素

     llen(key):返回名称为key的list的长度

     lrange(key, start, end):返回名称为key的list中start至end之间的元素(下标从0开始,下同)

     ltrim(key, start, end):截取名称为key的list,保留start至end之间的元素

     lindex(key, index):返回名称为key的list中index位置的元素

     lset(key, index, value):给名称为key的list中index位置的元素赋值为value

     lrem(key, count, value):删除count个名称为key的list中值为value的元素。count为0,删除全部值为value的元素,count>0      从头到尾删除count个值为value的元素,count<0从尾到头删除|count|个值为value的元素。

     lpop(key):返回并删除名称为key的list中的首元素

     rpop(key):返回并删除名称为key的list中的尾元素

     blpop(key1, key2,… key N, timeout):lpop 命令的block版本。即当timeout为0时,若遇到名称为key i的list不存在或该list为空,则命令结束。若是 timeout>0,则遇到上述状况时,等待timeout秒,若是问题没有解决,则对key i+1开始的list执行pop操做。

     brpop(key1, key2,… key N, timeout):rpop的block版本。参考上一命令。

     rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

4.对Set操做的命令

     sadd(key, member):向名称为key的set中添加元素member

     srem(key, member) :删除名称为key的set中的元素member

     spop(key) :随机返回并删除名称为key的set中一个元素

     smove(srckey, dstkey, member) :将member元素从名称为srckey的集合移到名称为dstkey的集合

     scard(key) :返回名称为key的set的基数

     sismember(key, member) :测试member是不是名称为key的set的元素

     sinter(key1, key2,…key N) :求交集

     sinterstore(dstkey, key1, key2,…key N) :求交集并将交集保存到dstkey的集合

     sunion(key1, key2,…key N) :求并集

     sunionstore(dstkey, key1, key2,…key N) :求并集并将并集保存到dstkey的集合

     sdiff(key1, key2,…key N) :求差集

     sdiffstore(dstkey, key1, key2,…key N) :求差集并将差集保存到dstkey的集合

     smembers(key) :返回名称为key的set的全部元素

     srandmember(key) :随机返回名称为key的set的一个元素

5.对zset(sorted set)操做的命令

     zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。若是该元素已经存在,则根据score更新该元素的顺序。

     zrem(key, member) :删除名称为key的zset中的元素member

     zincrby(key, increment, member) :若是在名称为key的zset中已经存在元素member,则该元素的score增长increment;不然向集合中添加该元素,其score的值为increment

     zrank(key, member) :返回名称为key的zset(元素已按score从小到大排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”

     zrevrank(key, member) :返回名称为key的zset(元素已按score从大到小排序)中member元素的rank(即index,从0开始),若没有member元素,返回“nil”

     zrange(key, start, end):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的全部元素

     zrevrange(key, start, end):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的全部元素

     zrangebyscore(key, min, max):返回名称为key的zset中score >= min且score <= max的全部元素

     zcard(key):返回名称为key的zset的基数

     zscore(key, element):返回名称为key的zset中元素element的score

     zremrangebyrank(key, min, max):删除名称为key的zset中rank >= min且rank <= max的全部元素

     zremrangebyscore(key, min, max) :删除名称为key的zset中score >= min且score <= max的全部元素

     zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):对N个zset求并集和交集,并将最后的集合保存在dstkeyN中。对于集合中每个元素的score,在进行AGGREGATE运算前,都要乘以对于的WEIGHT参数。若是没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果集合中元素的score是全部集合对应元素进行 SUM运算的值,而MIN和MAX是指,结果集合中元素的score是全部集合对应元素中最小值和最大值。

6.对Hash操做的命令

     hset(key, field, value):向名称为key的hash中添加元素field<—>value

     hget(key, field):返回名称为key的hash中field对应的value

     hmget(key, field1, …,field N):返回名称为key的hash中field i对应的value

     hmset(key, field1, value1,…,field N, value N):向名称为key的hash中添加元素field i<—>value i

     hincrby(key, field, integer):将名称为key的hash中field的value增长integer

     hexists(key, field):名称为key的hash中是否存在键为field的域

     hdel(key, field):删除名称为key的hash中键为field的域

     hlen(key):返回名称为key的hash中元素个数

     hkeys(key):返回名称为key的hash中全部键

     hvals(key):返回名称为key的hash中全部键对应的value

     hgetall(key):返回名称为key的hash中全部的键(field)及其对应的value

5、Redis命名规则

因为Redis全部数据为键值对,即全部数据均只能经过键值(Key)来进行管理,故需

要规范命名规则,jedis客户端包装了有专门的命名规则生产函数,调用便可!代码参考实例代码:

相关文章
相关标签/搜索