Redis-API实例

实例:

package com.mylearn.util;

import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.jd.data.redis.RedisUtils;
import com.jd.data.redis.connection.RedisAccessException;
import org.hibernate.annotations.Immutable;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.unitils.spring.annotation.SpringBean;
import redis.clients.jedis.ShardedJedis;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * Created by IntelliJ IDEA.
 * User: yingkuohao
 * Date: 14-1-13
下午6:20
 * CopyRight:360buy
 * Descrption:
 *    http://javacrazyer.iteye.com/blog/1840161
 * http://blog.sina.com.cn/s/blog_4cfe78830101inoh.html
 * http://redis.readthedocs.org/en/2.4/index.html
 * To change this template use File | Settings | File Templates.
 */
public class TestRedis extends BaseTestCase {

    @SpringBean("redisUtils")
    private RedisUtils redisUtils;


    public void test11() {
        try {
//            redisUtils.del("test");
            redisUtils.lpush("test", "111");
            redisUtils.lpush("test", "222");
            redisUtils.lpush("test", "333");
            redisUtils.lpush("test", "444");
            redisUtils.ltrim("test",0,2);

            System.out.println("test;" + redisUtils.get("test"));
        } catch (RedisAccessException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }


    public void testBase() {
中value最大容量是512M
        try {
字符串处理,如果key已存在,则覆盖原有的值
            redisUtils.set("name", "zhangsan");
            String name = redisUtils.get("name");
            System.out.println("name = " + name); // zhangsan
追加
            redisUtils.append("name", "lisi");
            System.out.println("name = " + redisUtils.get("name")); // zhangsanlisi
删除
//            redisUtils.del("name");
            System.out.println("name = " + redisUtils.get("name")); // null
判断key是否存在,
            System.out.println("exists=" + redisUtils.exists("name"));//boolean
:set not exist :若key不存在,则存储
            redisUtils.setnx("sex", "boy");
            redisUtils.setnx("name", "test");
            System.out.println("name =" + redisUtils.get("name") + ",sex=" + redisUtils.get("sex"));
设置key的有效时间,并存储数据
            redisUtils.setex("name", 2, "wangwu");
            System.out.println(redisUtils.get("name"));
设置key的过期时间,单位:秒,如果key在超时之前被修改,则该键关联的超时将被移除。
            redisUtils.expire("name",2);
查看剩余时间
            System.out.println(redisUtils.ttl("name"));

            try {
                Thread.sleep(3001);
            } catch (InterruptedException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
            System.out.println(redisUtils.get("name")); //null
获取value,并重新赋值
            redisUtils.set("age", "20");
            System.out.println(redisUtils.getSet("age", "30"));
            System.out.println(redisUtils.get("age"));
截取value值
            System.out.println(redisUtils.getrange("age", 1, 3));

        } catch (RedisAccessException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

    }

    /**
类型是按照插入顺序排序的字符串链表,和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)
添加新的元素。在插入时,如果该键不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中的所有元素均被移除,
那么该键也将会被从数据库中删除。List中可包含的最大元素数量 是42亿。
     */
    public void testList() {
        try {
存入list,rpush:右侧入队
            redisUtils.del("msg");
            redisUtils.rpush("msg", "test1");
            redisUtils.rpush("msg", "test2");
            redisUtils.rpush("msg", "test3");
截取list,0代表链表头部的第一个元素,-1代表最后一个,-2代表倒数第二个,在获取时,start和end的值都会被取出
            List<String> lst = redisUtils.lrange("msg", 0, -1);
            System.out.println("lst = " + Joiner.on(",").join(lst));  //test1,test2,test3

左侧入队
            redisUtils.lpush("msg", "test4");
            List<String> lst2 = redisUtils.lrange("msg", 0, -1);
            System.out.println("lst = " + Joiner.on(",").join(lst2));   //test4,test1,test2,test3
长度
            System.out.println("lst.length=" + redisUtils.llen("msg"));//4
:截取
            System.out.println("lst.lrange=" + redisUtils.lrange("msg", 1, 3));//test1,test2,test3
:指定某个index,设值
            redisUtils.lset("msg", 1, "release");//test1,test2,test3
:指定某个index,删除
            System.out.println("lst.lrange=" + redisUtils.lrem("msg", 2, "test2"));//test1,test2,test3
            List<String> lst3 = redisUtils.lrange("msg", 0, -1);
            System.out.println("lst3 = " + Joiner.on(",").join(lst3));  //test4,release,test3
截取,删除区间以外的值,和lrange的区别就是,lrange相当于一个备份。
            redisUtils.ltrim("msg", 1, 2);
            List<String> lst4 = redisUtils.lrange("msg", 0, -1);
            System.out.println("lst4 = " + Joiner.on(",").join(lst4));  //release,test3
从左侧出队
            System.out.println("lpop:" + redisUtils.lpop("msg")); //release
:从右侧出队
            System.out.println("lpop:" + redisUtils.rpop("msg")); //test3
            List<String> lst5 = redisUtils.lrange("msg", 0, -1);
            System.out.println("lst5 = " + Joiner.on(",").join(lst5));  //null

        } catch (RedisAccessException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }

    /**
字符集合,和list的区别是,元素不能重复,提供了合并交叉方法,比较高效
     */
    public void testSet() {
        try {
            redisUtils.srem("setinfo", "test1", "test2", "test3");
增加
            redisUtils.sadd("setinfo", "test1");
            redisUtils.sadd("setinfo", "test2");
            redisUtils.sadd("setinfo", "test3");
            redisUtils.sadd("setinfo", "test3");
获取所有
            Set<String> set = redisUtils.smembers("setinfo");
            System.out.println("setvalues:" + set);

删除
            redisUtils.srem("setinfo", "test2");
            System.out.println("setvalues:" + redisUtils.smembers("setinfo"));
判断是否属于集合的元素
            System.out.println("sismember:" + redisUtils.sismember("setinfo", "test1"));
返回集合的元素个数
            System.out.println("scard:" + redisUtils.scard("setinfo"));
出栈
            String s = redisUtils.spop("setinfo");
            System.out.println("spop=" + s);
            System.out.println("setvalues:" + redisUtils.smembers("setinfo"));
还有一些合并交叉的,我们自己的redisutil没有封装,可以参考jedis的api


        } catch (RedisAccessException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }


    /**
有序集合:
与set的主要差别就是每一个成员都有一个分数(score)与之关联,redis正是通过分数来为集合中的成员进行排序。值得注意的是
是必须唯一的,但score却可以重复。
在sorted-set中的添加、删除、更新一个成员都是非常快速的操作,时间复杂度是集合成员数量的对数。
     */
    public void testSortedSet() {
        try {

按照scorce删除
            redisUtils.zremrangeByScore("pin", 1, 9);
按照range删除
            redisUtils.zremrangeByRank("pin", 1, 3);
添加元素
            redisUtils.zadd("pin", 1, "0001");
            redisUtils.zadd("pin", 1, "0002");
            redisUtils.zadd("pin", 2, "0003");
            redisUtils.zadd("pin", 2, "0004");
            redisUtils.zadd("pin", 3, "0005");
            redisUtils.zadd("pin", 3, "0006");
            redisUtils.zadd("pin", 9, "0009");
:截取,-1为全部
            Set<String> setValues = redisUtils.zrange("pin", 0, -1);
            System.out.println("setValues=" + setValues);
截取,并翻转
            Set<String> setValues2 = redisUtils.zrevrange("pin", 0, -1);
            System.out.println("setValues2=" + setValues2);
获取长度
            System.out.println("zcard:" + redisUtils.zcard("pin"));
根据score获取
            System.out.println("zscore:" + redisUtils.zscore("pin", "0003"));
根据评分截取之后获取长度
            System.out.println("zcount:" + redisUtils.zcount("pin", 1, 2));
            System.out.println("zcount:" + redisUtils.zrange("pin", 1, 2));
根据score截取
            System.out.println("zcount:" + redisUtils.zrangeByScore("pin", 1, 3));

        } catch (RedisAccessException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }

    /**
操作,相当于存的,<key,Map<String,String>
     */
    public void testHsh() {
        Map<String, String> mapA = ImmutableMap.of("a", "1", "b", "2", "c", "4");
        try {
: 加入map
            redisUtils.hmset("mapA", mapA);
:获取map指定的key对应的value
            List<String> name = redisUtils.hmget("mapA", "a");
            System.out.println("name=" + name);
删除指定的key
            redisUtils.hdel("mapA", "b");
            System.out.println("name=" + redisUtils.hmget("mapA", "b"));
获取指定map的长度
            System.out.println("hlen=" + redisUtils.hlen("mapA"));
判断指定的map是否存在
            System.out.println("exists=" + redisUtils.exists("mapA"));
获取指定的key集合
            System.out.println("hkeys=" + redisUtils.hkeys("mapA"));
:获取指定的value集合
            System.out.println("hvals=" + redisUtils.hvals("mapA"));

设值,为指定的key设置Field/value对,如果不存在创建新key,如果filed在key中已存在,则覆盖原有值。
            redisUtils.hset("mapb", "key1", "value1");
            redisUtils.hset("mapb", "key2", "value3");
            redisUtils.hset("mapb", "key3", "value4");
            redisUtils.hset("mapb", "123", "1234");
:
            System.out.println("hget=" + redisUtils.hget("mapb", "key1"));
            redisUtils.hset("mapb", "key1", "value5");
            System.out.println("hget=" + redisUtils.hget("mapb", "key1"));
获取多个filed对应的值
            System.out.println("hmget=" + redisUtils.hmget("mapb", "key1", "key2"));
:获取map指定key的所有值
            System.out.println("hgetAll=" + redisUtils.hgetAll("mapb"));
:删除
            System.out.println("hdel=" + redisUtils.hdel("mapb", "key3"));
增加,value必须为integer
            System.out.println("hincrBy=" + redisUtils.hincrBy("mapb", "123", 123l));
            System.out.println("hget=" + redisUtils.hget("mapb", "key1"));
当key或field不存在时,设值,否则不做任何操作
            redisUtils.hsetnx("mapb","key3","new");
        } catch (RedisAccessException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

    }

    public void testOthers() {
        try {
获取key的失效时间,-1为永久
            System.out.println("time="+redisUtils.ttl("mapb") );
设定指定key的有效时间,单位为秒
            redisUtils.setex("mapb", 10, "min");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
            System.out.println("time=" + redisUtils.ttl("mapb"));//5
            //3.
//            redisUtils


        } catch (RedisAccessException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }


}