Redis数据类型
2.1、Redis数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
2.1.1、字符串
String(字符串)是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。string类型是Redis最基本的数据类型,一个键最大能存储512MB。
public static void testString(){
@SuppressWarnings("resource")
Jedis jedis = new Jedis("10.108.169.6");
//清空数据库中的数据,若不删除该数据会一直存在内存中,其他的连接也能获得该数据
jedis.flushDB();
//向key-->name中放入了value-->JackGSmith
jedis.set("name", "JackGSmith");
//根据key-->name获取value
jedis.get("name");
//使用mset设置多个键值对
jedis.mset("name1","name1_value","name2","name2_value");
//使用mget获取多个value
List<String> list=jedis.mget("name","name1","name2");
//拼接
jedis.append("name", " is a name");
//删除某个键
jedis.del("name1");
//一次删除多个键
jedis.del(new String[]{"key201", "key202"});
//系统中所有key
Set<String> keys = jedis.keys("*");
Iterator<String> it=keys.iterator() ;
//遍历
while(it.hasNext()){
String key = it.next();
System.out.println(jedis.get(key));
}
//判断key是否存在
System.out.println(jedis.exists("name"));
//获取value字符串的子串
jedis.getrange("name",1,5);
//setnx,key不存在时设置value,返回值为1;key已存在时,无法设置value,返回0.
Long i = jedis.setnx("key", "value301");
//设置过期时间
System.out.println("设置 name的过期时间为5秒:"+jedis.expire("name", 5));
try{
Thread.sleep(2000);
}
catch (InterruptedException e){
}
// 查看某个key的剩余生存时间,单位【秒】.永久生存或者不存在的都返回-1
System.out.println("查看name的剩余生存时间:"+jedis.ttl("name"));
// 移除某个key的生存时间
System.out.println("移除name的生存时间:"+jedis.persist("name"));
System.out.println("查看name的剩余生存时间:"+jedis.ttl("name"));
// 查看key所储存的值的类型
System.out.println("查看name所储存的值的类型:"+jedis.type("name"));
jedis.disconnect();
}
set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string的value
setnx(key, value):添加string,名称为key,值为value
setex(key, time, value):向库中添加string,设定过期时间time
mset(key N, value N):批量设置多个string的值
msetnx(key N, value N):如果所有名称为key i的string都不存在
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的子串
2.1.2、Redis 哈希(Hash)
Redishash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。 public static void testHash(){
@SuppressWarnings("resource")
Jedis jedis = new Jedis("10.108.169.6");
jedis.flushDB();
//HSET key field value将哈希表key中的域field的值设为value。
jedis.hset("website", "google", "www.google.cn");
jedis.hset("website", "baidu", "www.baidu.com");
jedis.hset("website", "sina", "www.sina.com");
//HMSET key field value [field value ...] 同时将多个field - value(域-值)对设置到哈希表key中。
Map<String, String> map = new HashMap<String, String>();
map.put("cardid", "123456");
map.put("username", "jzkangta");
jedis.hmset("hash", map);
//HGET key field返回哈希表key中给定域field的值。
System.out.println(jedis.hget("hash", "username"));
//HMGET key field [field ...]返回哈希表key中,一个或多个给定域的值。
List<String> list = jedis.hmget("website","google","baidu","sina");
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
//HGETALL key返回哈希表key中,所有的域和值。
Map<String,String> map1 = jedis.hgetAll("hash");
for(Map.Entry entry: map1.entrySet()) {
System.out.print(entry.getKey() + ":" + entry.getValue() + "\t");
}
//删除key field
jedis.del("hash","username");
//判断是否存在
jedis.hexists("hash", "key003");
//hkeys(); key返回哈希表key中的所有域
System.out.println(jedis.hkeys("website"));
//HVALS key返回哈希表key中的所有值
System.out.println(jedis.hvals("website"));
//HLEN key 返回哈希表key中域的数量。
jedis.hlen("website");
//HINCRBY key field increment为哈希表key中的域field的值加上增量increment。
jedis.hincrBy("hash", "cardid", 7);
System.out.println(jedis.hget("hash", "cardid"));
jedis.disconnect();
}
hset(key, field, value):向名称为key的hash中添加元素field
hget(key, field):返回名称为key的hash中field对应的value
hmget(key, (fields)):返回名称为key的hash中field i对应的value
hmset(key, (fields)):向名称为key的hash中添加元素field
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
2.1.3、Redis 列表(List)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
public static void testList(){
@SuppressWarnings("resource")
Jedis redis = new Jedis("10.108.169.6");
redis.flushDB();
//LPUSH key value [value ...]将值value插入到列表key的表头。
redis.lpush("list", "abc");
redis.lpush("list", "xzc");
redis.lpush("list", "erf");
redis.lpush("list1", "abc1");
redis.lpush("list1", "xzc1");
redis.lpush("list1", "erf1");
//去除key的某个元素
System.out.println(redis.lindex("list", 2));
//删除下标0-1区间之内的元素
System.out.println(redis.ltrim("list1",0,1));
System.out.println(redis.lrange("list1", 0, -1));
//llen,获取key list的长度
System.out.println(redis.llen("list"));
redis.lpop("list");
System.out.println(redis.lrange("list", 0, -1));
//LRANGE key start stop返回列表key中指定区间内的元素,区间以偏移量start和stop指定。下标(index)参数start和stop都以0为底,也就是说,以0表示列表的第一个元素,以1表示列表的第二个元素,以此类推。你也可以使用负数下标,以-1表示列表的最后一个元素,-2表示列表的倒数第二个元素,以此类推。
List<String> list = redis.lrange("list", 0, -1);
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
redis.disconnect();
}
rpush(key, value):在名称为key的list尾添加一个值为value的元素
lpush(key, value):在名称为key的list头添加一个值为value的 元素
llen(key):返回名称为key的list的长度
lrange(key, start, end):返回名称为key的list中start至end之间的元素
ltrim(key, start, end):截取名称为key的list
lindex(key, index):返回名称为key的list中index位置的元素
lset(key, index, value):给名称为key的list中index位置的元素赋值
lrem(key, count, value):删除count个key的list中值为value的元素
lpop(key):返回并删除名称为key的list中的首元素
rpop(key):返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop命令的block版本。
brpop(key1, key2,… key N, timeout):rpop的block版本。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素
2.1.4、Redis 集合(Set)
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为 232 - 1 (4294967295,每个集合可存储40多亿个成员)。 public static void testSet(){
@SuppressWarnings("resource")
Jedis redis = new Jedis("10.108.169.6");
redis.flushDB();
//SADD key member [member ...]将member元素加入到集合key当中。
redis.sadd("testSet", "s1");
redis.sadd("testSet", "s2");
redis.sadd("testSet", "s3");
redis.sadd("testSet", "s4");
redis.sadd("testSet", "s5");
redis.sadd("Set", "s1");
redis.sadd("Set", "s2");
redis.sadd("Set", "s7");
//sinter(), 两个集合之间的交集
System.out.println(redis.sinter("testSet","Set"));
//sunion(), 两个集合之间的并集
System.out.println(redis.sunion("testSet","Set"));
//sdiff(), 两个集合之间的差集
System.out.println(redis.sdiff("testSet","Set"));
//获取Set中元素的数量
System.out.println(redis.scard("testSet"));
//移到集合元素
redis.smove("testSet", "Set", "s3");
System.out.println(redis.smembers("Set"));
//SREM key member移除集合中的member元素。
redis.srem("testSet", "s5");
//随机返回并删除名称为key的set中一个元素
redis.spop("testSet");
//SMEMBERS key返回集合key中的所有成员。
Set<String> set = redis.smembers("testSet");
Iterator<String> t1=set.iterator() ;
while(t1.hasNext()){
Object obj1=t1.next();
System.out.println(obj1);
}
//SISMEMBER key member判断member元素是否是集合key的成员。是(true),否则(false)
System.out.println(redis.sismember("testSet", "s4"));
redis.disconnect();
}
sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :移到集合元素
scard(key) :返回名称为key的set的基数
sismember(key, member) :member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
sunion(key1, (keys)) :求并集
sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
sdiff(key1, (keys)) :求差集
sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素
2.1.5、Redis 有序集合(sorted set)
Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295,每个集合可存储40多亿个成员) public static void testZSet(){
@SuppressWarnings("resource")
Jedis redis = new Jedis("10.108.169.6");
redis.flushDB();
redis.zadd("ZSet",2.0,"s1");
redis.zadd("ZSet",9.0,"s2");
redis.zadd("ZSet",4.8,"s3");
redis.zadd("ZSet",2.8,"s4");
//统计zset集合中权重某个范围内(1.0——5.0),元素的个数
System.out.println(redis.zcount("ZSet", 1.0, 5.0));
//查看Set中s2的权重
System.out.println(redis.zscore("ZSet", "s2"));
//按照权重值排序
System.out.println(redis.zrange("ZSet", 0, -1));//[s1, s4, s3, s2]
//获取Set中元素的数量
System.out.println(redis.zcard("ZSet"));
redis.zrem("ZSet", "s2");
System.out.println(redis.zrange("ZSet", 0, -1));//[s1, s4, s3]
redis.disconnect();
}