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