redis 支持的各种数据类型
1. String:
set:
get:
decr:
incr: (自增。可以用来做计数器,如果结合expire可以用来限制在一定时间内,访问次数等; 并且多线程调用incr,可以保证同步)。
mget:(一次取得多个key的value)
(做了一个测试:存了2500个key-value,用mget一次取出用了859毫秒;如果用get去循环取消耗的时间是10分钟,相差悬殊)
2. Hash:
hget:
hset:Hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。 比如如下代码就是存储一个key为per的人,其age是14, name是jack。
(这里注意: hset的key和set的key不能相同,否则会抛出异常)
jedis.hset("per","age", "44" ); jedis.hset("per","name", "jack");
hgetall:可以把上面的都取出来。
Map<String, String> all = jedis.hgetAll("per");
Hash的使用场景:
- 典型应用存储对象信息。string类型也可以实现存对象,对这个对象进行json序列化,然后取的时候再进行反序列化,但是,每次修改的时候只能整体修改,不能单个修改某个属性,且必须有实体类型的支撑。序列化和反序列化也需要消耗服务器性能。
- 一个存储空间保存多个健值对数据。
- 底层使用哈希表结构实现数据存储。
3.List:
应用广泛:比如微博的关注列表,粉丝列表,消息列表等功能。
Redis list 的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。
List可以用来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务
lrange 命令,就是从某个元素开始读取多少个元素,可以基于 list 实现分页查询,这个很棒的一个功能,基于 redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西(一页一页的往下走),性能高
lpush:
rpush:
lpop:
rpop:
lrange:
jedis.lpush("list","5","4", "8"); // 队头插入元素 jedis.rpush("list","1","3", "9"); // 队尾插入元素
List<String> resu = jedis.lrange("list", 2, 4); // 读取指定范围的数据
4.Set
set 对外提供的功能与list类似是一个列表的功能,特殊之处在于 set 是可以自动排重的。
当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。可以基于 set 轻易实现交集、并集、差集的操作
sadd
spop
smembers
jedis.sadd("set", "4","1","7" ,"2", "3", "9"); // 新建一个set;或者往已存在的set里加数据,会去重
Set<String> ressfd = jedis.spop("set", 3); // 注意: 取出的3个数据,是随机的。
jedis.smembers("set"); // 取出set的成员
sunion(并集) / sinter(交集) / sdiff(差集):
jedis.sadd("set1", "1","2","3"); jedis.sadd("set2", "3","4","5" ); Set<String> union = jedis.sunion("set1", "set2"); // 1,2,3,4,5 Set<String> inter = jedis.sinter("set1", "set2"); // 3 Set<String> diff = jedis.sdiff("set1", "set2"); // 1,2
5.Sorted Set
和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列
zadd,zrange,zrem,zcard