redis的各种数据类型
redis的数据类型有好集中,例如:string,hash,list,set,sort set,sub/pub。每一中在网络中都有大量的应用场景。结合jedis来讲解这些数据类型的使用方式和场景。
1、string
string的数据类型是[key:value]的键值对,它的key形式官方推荐为 xxx:xxx:xxx 的分类。在java中我们可以通过JSON工具,将object的数据转换为json字符串存放在其中,取值时在转换成object对象。
命令:
#设置、获取
>set string:test:1 string1 ->ok
>get string:test:1 ->string1
#根据字符串的长度获取字符
>getrange string:test:1 0 3 ->stri
#修改值
>setrange string:test:1 3 ->7 (修改后的字符串长度)
>get string:test:1 ->strong1
#设置新的获取旧值(替换)
>getset string:test:1 setgetstring1 ->string1
>get string:test:1 ->getsetstring1
#批量获取
>mget string:test:1 string:test:2
->getsetstring1
->string2
#批量设置
>mset string1 firststring string2 secendstring ->ok
#设置key的时间
>setex string:test:3 20 string3 ->ok
>ttl string:test:3 ->20
20s后查询
>get string:test:3 ->null
#递增、递减、加多少
>set string3 22
>incr string3 ->23
>decr string3 ->22
>incrby string3 5 ->27
>decrby string3 5 ->22
#追加
>set s1 s1
>append s1 s2 -->4
>get s1 ->s1s2
#删除key
>del string1 ->1
#当某个值不存在,就设置(可以用来检测是否存在)
redis:0>setnx s1 s111
1
redis:0>setnx s1 s222
0
#设置、获取
>set string:test:1 string1 ->ok
>get string:test:1 ->string1
#根据字符串的长度获取字符
>getrange string:test:1 0 3 ->stri
#修改值
>setrange string:test:1 3 ->7 (修改后的字符串长度)
>get string:test:1 ->strong1
#设置新的获取旧值(替换)
>getset string:test:1 setgetstring1 ->string1
>get string:test:1 ->getsetstring1
#批量获取
>mget string:test:1 string:test:2
->getsetstring1
->string2
#批量设置
>mset string1 firststring string2 secendstring ->ok
#设置key的时间
>setex string:test:3 20 string3 ->ok
>ttl string:test:3 ->20
20s后查询
>get string:test:3 ->null
#递增、递减、加多少
>set string3 22
>incr string3 ->23
>decr string3 ->22
>incrby string3 5 ->27
>decrby string3 5 ->22
#追加
>set s1 s1
>append s1 s2 -->4
>get s1 ->s1s2
#删除key
>del string1 ->1
#当某个值不存在,就设置(可以用来检测是否存在)
redis:0>setnx s1 s111
1
redis:0>setnx s1 s222
0
jedis使用:
/**
* @see 测试string类型
*/
@Test
public void stringTest() {
System.out.println(getJedis().set("string1", "string2"));
System.out.print(getJedis().get("string1"));
System.out.println(getJedis().getSet("string1", "string3"));
System.out.println(getJedis().get("string1"));
System.out.println(getJedis().mset("s1", "s1", "s2", "s2", "s3", "s3"));
System.out.println(getJedis().mget("s1", "s2", "s3"));
System.out.println(getJedis().setex("se1", 20, "sn1"));
System.out.println(getJedis().ttl("se1"));
System.out.println(getJedis().get("se1"));
System.out.println(getJedis().set("inc1", "33"));
System.out.println(getJedis().incr("inc1"));
System.out.println(getJedis().decr("inc1"));
System.out.println(getJedis().incrBy("inc1", 5));
System.out.println(getJedis().decrBy("inc1", 5));
System.out.println(getJedis().del("inc1", "s1", "string1", "s2", "s3"));
System.out.println(getJedis().setnx("s1", "s111"));
System.out.println(getJedis().setnx("s1", "s222"));
}
/**
* @see 测试string类型
*/
@Test
public void stringTest() {
System.out.println(getJedis().set("string1", "string2"));
System.out.print(getJedis().get("string1"));
System.out.println(getJedis().getSet("string1", "string3"));
System.out.println(getJedis().get("string1"));
System.out.println(getJedis().mset("s1", "s1", "s2", "s2", "s3", "s3"));
System.out.println(getJedis().mget("s1", "s2", "s3"));
System.out.println(getJedis().setex("se1", 20, "sn1"));
System.out.println(getJedis().ttl("se1"));
System.out.println(getJedis().get("se1"));
System.out.println(getJedis().set("inc1", "33"));
System.out.println(getJedis().incr("inc1"));
System.out.println(getJedis().decr("inc1"));
System.out.println(getJedis().incrBy("inc1", 5));
System.out.println(getJedis().decrBy("inc1", 5));
System.out.println(getJedis().del("inc1", "s1", "string1", "s2", "s3"));
System.out.println(getJedis().setnx("s1", "s111"));
System.out.println(getJedis().setnx("s1", "s222"));
}
2、hash
Redis的哈希值是字符串字段和字符串值之间的映射,所以他们是表示对象的完美数据类型。在Redis中的哈希值,可存储超过400十亿键值对。hash类型有点像对象,使用它来修改存放对象,每次修改数据不用全部修改完全。使用object转换为json字符串存放为string类型,每次修改会全部修改。
命令
#设置、获取
>hset stest name "h1" -->1
>hget stest name -->h1
#设置、获取多个
>hmset stext1 name "h2" age 22 cache "trueredis:0>" -->ok
>hmget stext1 name age cache
1) h2
2) 22
3) true
#将stext1建下的值作为一个hash列出来
>hgetall stext1
1) name
2) h2
3) age
4) 22
5) cache
6) true
#获取所有的hash字段
redis:0>hkeys stext1
1) name
2) age
3) cache
#获取建的散列字段个数
redis:0>hlen redis:0> stext1
4
#增加某个hash字段的value值
redis:0>hincrby stext1 age 1
23
#某个值不存在的时候设置
redis:0>hsetnx stext1 sex male
1
redis:0>hsetnx stext1 sex fredis:0>male
0
#获取所有的value
redis:0>hvals stext1
1) h2
2) 23
3) true
4) male
#设置、获取
>hset stest name "h1" -->1
>hget stest name -->h1
#设置、获取多个
>hmset stext1 name "h2" age 22 cache "trueredis:0>" -->ok
>hmget stext1 name age cache
1) h2
2) 22
3) true
#将stext1建下的值作为一个hash列出来
>hgetall stext1
1) name
2) h2
3) age
4) 22
5) cache
6) true
#获取所有的hash字段
redis:0>hkeys stext1
1) name
2) age
3) cache
#获取建的散列字段个数
redis:0>hlen redis:0> stext1
4
#增加某个hash字段的value值
redis:0>hincrby stext1 age 1
23
#某个值不存在的时候设置
redis:0>hsetnx stext1 sex male
1
redis:0>hsetnx stext1 sex fredis:0>male
0
#获取所有的value
redis:0>hvals stext1
1) h2
2) 23
3) true
4) male
jedis使用
/**
* @see 测试hash
*/
@Test
public void testHash() {
System.out.println(getJedis().hset("st1", "name", "t1"));
System.out.println(getJedis().hget("st1", "name"));
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("age", "22");
hm.put("sex", "male");
hm.put("cache", "true");
System.out.println(getJedis().hmset("st1", hm));
System.out.println(getJedis().hmget("st1", "name", "age", "sex", "cache"));
System.out.println(getJedis().hgetAll("st1"));
System.out.println(getJedis().hkeys("st1"));
System.out.println(getJedis().hlen("st1"));
System.out.println(getJedis().hvals("st1"));
System.out.println(getJedis().hsetnx("st1", "account", "111"));
}
/**
* @see 测试hash
*/
@Test
public void testHash() {
System.out.println(getJedis().hset("st1", "name", "t1"));
System.out.println(getJedis().hget("st1", "name"));
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("age", "22");
hm.put("sex", "male");
hm.put("cache", "true");
System.out.println(getJedis().hmset("st1", hm));
System.out.println(getJedis().hmget("st1", "name", "age", "sex", "cache"));
System.out.println(getJedis().hgetAll("st1"));
System.out.println(getJedis().hkeys("st1"));
System.out.println(getJedis().hlen("st1"));
System.out.println(getJedis().hvals("st1"));
System.out.println(getJedis().hsetnx("st1", "account", "111"));
}
3、list
Redis列表是简单的字符串列表,排序插入顺序。您可以在头部或列表的尾部Redis的列表添加元素。列表的最大长度为232 - 1 (每个列表超过4十亿元素4294967295)元素。list在可重复的一对多情况使用
命令
#一、添加数据
#1、从头部添加。(如果没有key,则添加新key)
redis:0>LPUSH tls t1 ->1
redis:0>LPUSH tls t2 ->2
#检查添加,如果有key则添加,否则就换回0
redis:0>LPUSHX tls t6 ->6
redis:0>LPUSHX tls1 t7 ->0
#2、添加数据到尾部
redis:0>RPUSH tls ts7 ->8
#检测插入尾部
redis:0>RPUSHX tls rp1 ->9
redis:0>RPUSHX tls1 rp2 ->0
#3、插入某个值前面
redis:0>LINSERT tls BEFORE t4 ti4 ->7
二、获取
#1、通过索引获取,从头部开始(最新一个)
redis:0>lindex tls 0 -t6
#2、长度
redis:0>llen tls ->9
#3、取出头部、并删除(最新一个)
redis:0>LPOP tls -->t6
redis:0>llen tls -->8
#4、获取尾部、并删除
redis:0>RPOP tls -->rp1
redis:0>llen tls -->7
三、修改
#1、修改list中的value范围,范围之外的删除
redis:0>LTRIM tls 0 4 ->OK
redis:0>LLEN tls ->5
#2、修改特定索引的值
redis:0>LSET tls 0 lst ->OK
四、获取所有
redis:0>lrange tls 0 -1
1) lst
2) ti4
3) t4
4) t3
5) t2
#一、添加数据
#1、从头部添加。(如果没有key,则添加新key)
redis:0>LPUSH tls t1 ->1
redis:0>LPUSH tls t2 ->2
#检查添加,如果有key则添加,否则就换回0
redis:0>LPUSHX tls t6 ->6
redis:0>LPUSHX tls1 t7 ->0
#2、添加数据到尾部
redis:0>RPUSH tls ts7 ->8
#检测插入尾部
redis:0>RPUSHX tls rp1 ->9
redis:0>RPUSHX tls1 rp2 ->0
#3、插入某个值前面
redis:0>LINSERT tls BEFORE t4 ti4 ->7
二、获取
#1、通过索引获取,从头部开始(最新一个)
redis:0>lindex tls 0 -t6
#2、长度
redis:0>llen tls ->9
#3、取出头部、并删除(最新一个)
redis:0>LPOP tls -->t6
redis:0>llen tls -->8
#4、获取尾部、并删除
redis:0>RPOP tls -->rp1
redis:0>llen tls -->7
三、修改
#1、修改list中的value范围,范围之外的删除
redis:0>LTRIM tls 0 4 ->OK
redis:0>LLEN tls ->5
#2、修改特定索引的值
redis:0>LSET tls 0 lst ->OK
四、获取所有
redis:0>lrange tls 0 -1
1) lst
2) ti4
3) t4
4) t3
5) t2
jedis作用
@Test
public void testList() {
// 从头部
System.out.println(getJedis().lpush("list1", "user1"));
System.out.println(getJedis().lpushx("list2", "user1"));
System.out.println(getJedis().lpop("list1"));
// 从尾部
System.out.println(getJedis().rpush("list1", "user2"));
System.out.println(getJedis().rpushx("list2", "user2"));
System.out.println(getJedis().rpop("list1"));
// 插入
System.out.println(getJedis().linsert("list1", LIST_POSITION.BEFORE, "user2", "user0"));
// 获取
System.out.println(getJedis().lindex("list1", 1));
System.out.println(getJedis().llen("list1"));
// 修改
System.out.println(getJedis().ltrim("list1", 0, 1));
System.out.println(getJedis().lset("list1", 0, "user3"));
}
@Test
public void testList() {
// 从头部
System.out.println(getJedis().lpush("list1", "user1"));
System.out.println(getJedis().lpushx("list2", "user1"));
System.out.println(getJedis().lpop("list1"));
// 从尾部
System.out.println(getJedis().rpush("list1", "user2"));
System.out.println(getJedis().rpushx("list2", "user2"));
System.out.println(getJedis().rpop("list1"));
// 插入
System.out.println(getJedis().linsert("list1", LIST_POSITION.BEFORE, "user2", "user0"));
// 获取
System.out.println(getJedis().lindex("list1", 1));
System.out.println(getJedis().llen("list1"));
// 修改
System.out.println(getJedis().ltrim("list1", 0, 1));
System.out.println(getJedis().lset("list1", 0, "user3"));
}
4、set
Set类型看作为没有排序的字符集合, 和List有排序的字符集和唯一的区别是,Set集合中不允许出现重复的元素,而且这些操作的时间复杂度为O(1),即常量时间内完成次操作。 Set可包含的最大元素数量是4294967295。换句话说,如果多次添加相同元素,Set中将仅保留该元素的一份拷贝。和List类型相比,Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如unions、intersections和differences。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。可以在例如用户的地址记录,操作记录,文章访问用户的记录等等一对多的场景。
命令
#一、添加(只能存放没有的数据)
redis:0>sadd stt a b c -->3
redis:0>sadd stt a b e -->1
#二、查询
#1、是否存在
redis:0>sismember stt a -->1
#2、所用
redis:0>smembers stt
1) c
2) e
3) a
4) b
#3、set中的值个数
redis:0>scard stt -->4
#4、随机返回
redis:0>srandmember stt -->e
#5、返回并删除一个
redis:0>spop stt -->a
redis:0>scard stt -->3
#一、添加(只能存放没有的数据)
redis:0>sadd stt a b c -->3
redis:0>sadd stt a b e -->1
#二、查询
#1、是否存在
redis:0>sismember stt a -->1
#2、所用
redis:0>smembers stt
1) c
2) e
3) a
4) b
#3、set中的值个数
redis:0>scard stt -->4
#4、随机返回
redis:0>srandmember stt -->e
#5、返回并删除一个
redis:0>spop stt -->a
redis:0>scard stt -->3
jedis
/**
* @see 测试set
*/
@Test
public void testSet() {
// 插入
System.out.println(getJedis().sadd("set1", "1"));
System.out.println(getJedis().sadd("set1", "2"));
System.out.println(getJedis().sadd("set1", "3"));
// 查询是否存在
System.out.println(getJedis().sismember("set1", "1"));
System.out.println(getJedis().sismember("set1", "4"));
// 个数
System.out.println(getJedis().scard("set1"));
// 随机返回
System.out.println(getJedis().srandmember("set1"));
// 随机删除
System.out.println(getJedis().spop("set1"));
}
/**
* @see 测试set
*/
@Test
public void testSet() {
// 插入
System.out.println(getJedis().sadd("set1", "1"));
System.out.println(getJedis().sadd("set1", "2"));
System.out.println(getJedis().sadd("set1", "3"));
// 查询是否存在
System.out.println(getJedis().sismember("set1", "1"));
System.out.println(getJedis().sismember("set1", "4"));
// 个数
System.out.println(getJedis().scard("set1"));
// 随机返回
System.out.println(getJedis().srandmember("set1"));
// 随机删除
System.out.println(getJedis().spop("set1"));
}
5、sort set(重要)
Redis有序集合类似Redis集合存储在设定值唯一性。不同的是,一个有序集合的每个成员带有分数,用于以便采取有序set命令,从最小的到最大的分数有关。Redis 有序set添加,删除和测试中的O(1)的存在成员(固定时间,无论里面包含的元素集合的数量)。列表的最大长度为232- 1元素(4294967295,超过4十亿每个元素的集合)。 有序集合和集合类似,但是每一个value都会有一个分数。这个类型的用途非常广,例如排名功能,有数据记录的功能等等需要。
命令
一、添加
#1、添加:key,score,value
redis:0> ZADD sost 0 -1 --> user1
二、修改
#1、增加某个value的score
redis:0>ZINCRBY sost 10 user2 -->15
三、查询
#1、获取总数
redis:0>zcard sost -->1
#2、递增查询
redis:0>zrange sost 0 -1 withscores
1) user3
2) 2
3) user4
4) 3
5) user2
6) 5
7) user1
8) 555
#3、分数范围个数范围查询
redis:0>zcount sost 3 555 -->3
#4、查询value的排序(应该是排在哪个档次,因为存在份数相同的情况)
redis:0>zrank sost user1 -->2
#5、递减查询
redis:0>zrevrange sost1 0 -1 withscores
1) user3
2) 4
3) user1
4) 3
5) user2
6) 2
7) user4
8) 1
#6、查询成员份数
redis:0>zscore sost1 user3 -->4
四、计算
#1、交集求和
redis:0>ZINTERSTORE sost2 2 sost sost1 -->4
#2、求并
redis:0>ZUNIONSTORE out 2 sost sost1 WEIGHTS 1 3 -->4
五、删除
#删除value成员
redis:0>ZREM sost user1 user2 -->2
一、添加
#1、添加:key,score,value
redis:0> ZADD sost 0 -1 --> user1
二、修改
#1、增加某个value的score
redis:0>ZINCRBY sost 10 user2 -->15
三、查询
#1、获取总数
redis:0>zcard sost -->1
#2、递增查询
redis:0>zrange sost 0 -1 withscores
1) user3
2) 2
3) user4
4) 3
5) user2
6) 5
7) user1
8) 555
#3、分数范围个数范围查询
redis:0>zcount sost 3 555 -->3
#4、查询value的排序(应该是排在哪个档次,因为存在份数相同的情况)
redis:0>zrank sost user1 -->2
#5、递减查询
redis:0>zrevrange sost1 0 -1 withscores
1) user3
2) 4
3) user1
4) 3
5) user2
6) 2
7) user4
8) 1
#6、查询成员份数
redis:0>zscore sost1 user3 -->4
四、计算
#1、交集求和
redis:0>ZINTERSTORE sost2 2 sost sost1 -->4
#2、求并
redis:0>ZUNIONSTORE out 2 sost sost1 WEIGHTS 1 3 -->4
五、删除
#删除value成员
redis:0>ZREM sost user1 user2 -->2
jedis
/**
* @see 测试sort set
*/
@Test
public void testSortSet() {
// 添加
System.out.println(getJedis().zadd("set1", 20, "user1"));
System.out.println(getJedis().zadd("set1", 17, "user3"));
// 修改积分
System.out.println(getJedis().zincrby("set1", 5, "user1"));
// 总数
System.out.println(getJedis().zcard("set1"));
// 查询
System.out.println(getJedis().zrange("set1", 0, -1));
System.out.println(getJedis().zrangeWithScores("set1", 0, -1));
System.out.println(getJedis().zscore("set1", "user1"));
// 分数范围内的value个数
System.out.println(getJedis().zcount("set1", 0, 25));
// 排序范围
System.out.println(getJedis().zrank("set1", "user1"));
// 删除
System.out.println(getJedis().zrem("set1", "user1"));
// 并集求和
System.out.println(getJedis().zinterstore("out", "set1", "set2"));
}
/**
* @see 测试sort set
*/
@Test
public void testSortSet() {
// 添加
System.out.println(getJedis().zadd("set1", 20, "user1"));
System.out.println(getJedis().zadd("set1", 17, "user3"));
// 修改积分
System.out.println(getJedis().zincrby("set1", 5, "user1"));
// 总数
System.out.println(getJedis().zcard("set1"));
// 查询
System.out.println(getJedis().zrange("set1", 0, -1));
System.out.println(getJedis().zrangeWithScores("set1", 0, -1));
System.out.println(getJedis().zscore("set1", "user1"));
// 分数范围内的value个数
System.out.println(getJedis().zcount("set1", 0, 25));
// 排序范围
System.out.println(getJedis().zrank("set1", "user1"));
// 删除
System.out.println(getJedis().zrem("set1", "user1"));
// 并集求和
System.out.println(getJedis().zinterstore("out", "set1", "set2"));
}
6、sub/pub
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
命令
一、订阅、退订
#1、订阅
redis:0>subscribe mytest mytest1
#2、匹配查询
redis:0>psubscribe mytest*
#3、退订
redis:0>unsubscribe mytest
二、发送记录
redis:0>publish mytest hello
一、订阅、退订
#1、订阅
redis:0>subscribe mytest mytest1
#2、匹配查询
redis:0>psubscribe mytest*
#3、退订
redis:0>unsubscribe mytest
二、发送记录
redis:0>publish mytest hello