redis学习之常用数据类型

redis支持5种数据类型:string(字符串),list(列表),set(集合),sorted set(有序集合),hash(哈希)。下面是学习过程中的测试样例:
1:string(字符串),string是redis最基本的数据类型,其相关命令主要用于管理redis字符串值

2:list(列表),list是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

3:set(集合),Set是string类型的无序集合,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)

4:sorted set(有序集合),sorted set和set一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序,sorted set的成员是唯一的,但分数(score)却可以重复。

5:hash(哈希),hash是一个键值(key=>value)对集合,hash是一个string类型的key和value的映射表,hash特别适合用于存储对象。

测试代码如下:

import redis.clients.jedis.*;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class RedisTest {
    /**
     * Jedis就是封装了redis的一些命令操作的java客户端
     * */
    private static Jedis jedis = null;
    /**
     * Jedis实例不是线程安全的,所以为了避免一些线程安全问题,Jedis提供了线程池JedisPool
     * */
    private static JedisPool jedisPool = null;

    private static final String ip = "127.0.0.1";//Redis服务器IP
    private static final Integer port = 6379;//Redis的端口号
    private static final Integer timeout = 1000;//连接redis的等待时间
    private static final Integer maxTotal = 1024;//可连接实例的最大数目,默认值为8
    private static final Integer maxIdle = 200;//控制一个pool最多有多少个状态为idle的jedis实例,默认值为8
    private static final Integer maxWait = 10000;//等待可用连接的最大时间
    private static final boolean testOnBorrow = true;//在borrow一个jedis实例时,是否提前进行validate操作,如果为ture,则得到的jedis实例均是可用的

    /**
     * 初始化非切片池
     * */
    private static void initialPool(){
        try {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxIdle(maxIdle);
            config.setMaxTotal(maxTotal);
            config.setMaxWaitMillis(maxWait);
            config.setTestOnBorrow(testOnBorrow);
            jedisPool = new JedisPool(config,ip,port,timeout);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    
    /**
     * string是redis最基本的数据类型,其相关命令主要用于管理redis字符串值
     * */
    private static void testString() {
        System.out.println("================testString====================");
        // 清空数据
        System.out.println("清空库中数据:"+jedis.flushDB());
        
        System.out.println("=============增=============");
        jedis.set("name","william");
        jedis.set("gender","male");
        jedis.set("age","18");
        System.out.println("=============查=============");
        System.out.println("添加的键值对:");
        System.out.println("(name,"+jedis.get("name")+")");
        System.out.println("(gender,"+jedis.get("gender")+")");
        System.out.println("(age,"+jedis.get("age")+")");
        
        System.out.println("=============删=============");
        System.out.println("删除gender键值对:"+jedis.del("gender"));
        System.out.println("获取gender键的value:"+jedis.get("gender"));
        
        System.out.println("=============改=============");
        System.out.println("改变name键的value:"+jedis.set("name","Allen"));
        System.out.println("获取name键的value:"+jedis.get("name"));
        //2、直接覆盖原来的数据
        System.out.println("在name的value后追加smith:"+jedis.append("name"," Smith"));
        System.out.println("获取name的value:"+jedis.get("name"));
    }
    /**
     * Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
     * */
    private static void testList() {
        System.out.println("================testList====================");
        // 清空数据
        System.out.println("清空库中数据:"+jedis.flushDB());
        System.out.println("=============增=============");
        System.out.println("在头部添加元素:");
        jedis.lpush("names","William");
        jedis.lpush("names","Allen");
        jedis.lpush("names","Smith");
        jedis.lpush("names","Jack");
        System.out.println("在尾部添加元素:");
        jedis.rpush("scores","89");
        jedis.rpush("scores","93");
        jedis.rpush("scores","84");
        jedis.rpush("scores","91");
        
        System.out.println("=============查=============");
        System.out.println("names:"+jedis.lrange("names",0,-1));
        System.out.println("scores:"+jedis.lrange("scores",0,-1));
        
        System.out.println("=============删=============");
        System.out.println("删除names中的Smith:"+jedis.lrem("names",1,"Smith"));
        System.out.println("删除score中的93:"+jedis.lrem("scores",1,"93"));
        System.out.println("删除Smith后names:"+jedis.lrange("names",0,-1));
        System.out.println("删除93后scores:"+jedis.lrange("scores",0,-1));
        // 列表元素出栈
        System.out.println("列表出栈:"+jedis.lpop("names"));
        System.out.println("names出栈后:"+jedis.lrange("names",0,-1));
        
        System.out.println("=============改=============");
        // 修改list中指定下标的值
        jedis.lset("names", 0, "Thompson");
        System.out.println("names修改后:"+jedis.lrange("names",0,-1));
        System.out.println("=============查=============");
        // list长度
        System.out.println("names长度:"+jedis.llen("names"));
        System.out.println("scores长度:"+jedis.llen("scores"));
    }
    /**
     * Redis的Set是string类型的无序集合。
     * 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
     * */
    private static void testSet() {
        System.out.println("================testSet====================");
        // 清空数据
        System.out.println("清空库中数据:"+jedis.flushDB());
        
        System.out.println("=============增=============");
        System.out.println("向nation1添加一个元素:"+jedis.sadd("nation1","China"));
        System.out.println("向nation1添加多个元素:"+jedis.sadd("nation1","USA","English","France","Japan"));
        System.out.println("查看nation1中的所有元素:"+jedis.smembers("nation1"));
        System.out.println("再新增一个集合nation2:"+jedis.sadd("nation2","France","Japan","Germany"));
        System.out.println("查看nation2中的所有元素:"+jedis.smembers("nation2"));
        
        System.out.println("=============删=============");
        System.out.println("删除Japan:"+jedis.srem("nation1", "Japan"));
        System.out.println("删除并返回集合中一个随机元素:"+jedis.spop("nation1"));
        System.out.println("删除后的nation1:"+jedis.smembers("nation1"));
        
        System.out.println("=============查=============");
        System.out.println("查看France是否在nation1中:"+jedis.sismember("nation1", "France"));
        System.out.println("查看nation1中元素个数:"+jedis.scard("nation1"));
        
        System.out.println("=============集合运算=============");
        System.out.println("查看nation1中的所有元素:"+jedis.smembers("nation1"));
        System.out.println("查看nation2中的所有元素:"+jedis.smembers("nation2"));
        System.out.println("nation1和nation2交集:"+jedis.sinter("nation1", "nation2"));
        System.out.println("nation1和nation2并集:"+jedis.sunion("nation1", "nation2"));
        System.out.println("nation1和nation2差集:"+jedis.sdiff("nation1", "nation2"));
    }
    /**
     * Redis sorted set 和 set 一样也是string类型元素的集合,且不允许重复的成员。
     * 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
     * sorted set的成员是唯一的,但分数(score)却可以重复。
     * */
    private static void testSortedSet() {
        System.out.println("================testSortedSet====================");
        // 清空数据
        System.out.println("清空库中数据:"+jedis.flushDB());
        
        System.out.println("=============增=============");
        Map<String,Double> scoreMember = new HashMap<String, Double>();
        scoreMember.put("USA",7.0);
        scoreMember.put("English",6.0);
        scoreMember.put("France",3.0);
        scoreMember.put("Japan",2.0);
        System.out.println("向nation添加一个元素:"+jedis.zadd("nation",9.0,"China"));
        System.out.println("向nation添加多个元素:"+jedis.zadd("nation",scoreMember));
        System.out.println("查询nation中的所有元素:"+jedis.zrange("nation", 0, -1));
        
        System.out.println("=============删=============");
        System.out.println("删除nation中的English:"+jedis.zrem("nation","English"));
        System.out.println("删除English后nation的所有元素:"+jedis.zrange("nation", 0, -1));
        
        System.out.println("=============查=============");
        System.out.println("查询nation中的元素个数:"+jedis.zcard("nation"));
        System.out.println("查询nation中4.0-8.0之间元素个数:"+jedis.zcount("nation",4.0,8.0));
    }
    /**
     * Redis hash 是一个键值(key=>value)对集合。
     * Redis hash 是一个 string 类型的 key 和 value 的映射表,hash 特别适合用于存储对象。
     * */
    private static void testHash() {
        System.out.println("================testHash====================");
        //清空数据
        System.out.println("清空库中数据:"+jedis.flushDB());
        
        System.out.println("=============增=============");
        Map<String,String> stuMap=new HashMap<String, String>();
        stuMap.put("pb13025002","William");
        stuMap.put("pb13025003","Smith");
        stuMap.put("pb13025004","Jack");
        stuMap.put("pb13025005","Linda");
        System.out.println("在student中添加一个键值对:"+jedis.hset("student","pb13025001","Allen"));
        System.out.println("在student中添加多个键值对:" +jedis.hmset("student",stuMap));
        
        System.out.println("=============查=============");
        System.out.println("查询student中所有的key:"+jedis.hkeys("student"));
        System.out.println("查询student中所有的value:"+jedis.hvals("student"));
        System.out.println("查询pb13025001是否在student的key中:"+jedis.hexists("student","pb13025001"));
        System.out.println("查询pb13025001对应的value:"+jedis.hget("student","pb13025001"));
        
        System.out.println("=============删=============");
        System.out.println("删除pb13025001字段:"+jedis.hdel("student","pb13025001"));
        System.out.println("删除pb13025001后所有的key:"+jedis.hkeys("student"));
        System.out.println("删除pb13025001后所有的value:"+jedis.hvals("student"));
        
        System.out.println("=============改=============");
        System.out.println("将pb13025005的value改为Thompson:"+jedis.hset("student","pb13025005","Thompson"));
        System.out.println("查询pb13025005对应的value:"+jedis.hget("student","pb13025005"));
    }
    /**
     * redis支持5种数据类型:string(字符串),list(列表),set(集合),sorted set(有序集合),hash(哈希)
     * */
    public static void test() {
        testString();
        testList();
        testSet();
        testSortedSet();
        testHash();
    }
    
    /* * * 获取客户端连接 * */ 
    public static void init(){ 
        initialPool(); 
        jedis = jedisPool.getResource(); 
    } 
    public static void main(String[] args) { 
        init(); 
        System.out.println("测试jedis运行情况: "+jedis.ping());
        test();
        jedis.close(); 
    } 
}

下面是程序运行结果:

连接成功:PONG
================testString====================
清空库中数据:OK
=============增=============
=============查=============
添加的键值对:
(name,william)
(gender,male)
(age,18=============删=============
删除gender键值对:1
获取gender键的value:null
=============改=============
改变name键的value:OK
获取name键的value:Allen
在name的value后追加smith:11
获取name的value:Allen Smith
================testList====================
清空库中数据:OK
=============增=============
在头部添加元素:
在尾部添加元素:
=============查=============
names:[Jack, Smith, Allen, William]
scores:[89, 93, 84, 91]
=============删=============
删除names中的Smith:1
删除score中的93:1
删除Smith后names:[Jack, Allen, William]
删除93后scores:[89, 84, 91]
列表出栈:Jack
names出栈后:[Allen, William]
=============改=============
names修改后:[Thompson, William]
=============查=============
names长度:2
scores长度:3
================testSet====================
清空库中数据:OK
=============增=============
向nation1添加一个元素:1
向nation1添加多个元素:4
查看nation1中的所有元素:[English, USA, France, China, Japan]
再新增一个集合nation2:3
查看nation2中的所有元素:[Germany, Japan, France]
=============删=============
删除Japan:1
删除并返回集合中一个随机元素:USA
删除后的nation1:[English, China, France]
=============查=============
查看France是否在nation1中:true
查看nation1中元素个数:3
=============集合运算=============
查看nation1中的所有元素:[English, China, France]
查看nation2中的所有元素:[Germany, Japan, France]
nation1和nation2交集:[France]
nation1和nation2并集:[France, China, English, Germany, Japan]
nation1和nation2差集:[English, China]
================testSortedSet====================
清空库中数据:OK
=============增=============
向nation添加一个元素:1
向nation添加多个元素:4
查询nation中的所有元素:[Japan, France, English, USA, China]
=============删=============
删除nation中的English:1
删除English后nation的所有元素:[Japan, France, USA, China]
=============查=============
查询nation中的元素个数:4
查询nation中4.0-8.0之间元素个数:1
================testHash====================
清空库中数据:OK
=============增=============
在student中添加一个键值对:1
在student中添加多个键值对:OK
=============查=============
查询student中所有的key:[pb13025004, pb13025003, pb13025005, pb13025002, pb13025001]
查询student中所有的value:[Allen, Jack, Linda, Smith, William]
查询pb13025001是否在student的key中:true
查询pb13025001对应的value:Allen
=============删=============
删除pb13025001字段:1
删除pb13025001后所有的key:[pb13025004, pb13025003, pb13025005, pb13025002]
删除pb13025001后所有的value:[Jack, Linda, Smith, William]
=============改=============
将pb13025005的value改为Thompson:0
查询pb13025005对应的value:Thompson

猜你喜欢

转载自www.cnblogs.com/earthhouge/p/9172693.html
今日推荐