-
set 类型介绍:
- 在集合中的每个元素都是不同的,且没有顺序
- 集合类型和列表类型的对比:
- 集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在
- 由于集合类型的 redis 内部是使用值为空的散列表实现,所有这些操作的时间复杂度都为 O(1)
- redis 还提供了多个集合之间的交集、并集、差集的运算
-
命令:
- 增加删除元素:
sadd key member member ... #增加元素 sadd key member member ... #增加元素
- 获得集合中所有的元素
smember key #查询集合中的所有元素
- 判断元素是否在集合中:
sismember key value #判断是否有 value 这个元素值
- 增加删除元素:
sorted set 数据类型:
-
介绍:
- 在集合类型的基础上,有序集合类型为集合中的每个元素一个分数
- 这使得我们不仅可以完成插入、删除和判断元素是否存在集合中
- 还能够获得分数最高或最低的前 N 个元素获取指定范围内的元素与分数有关的操作
- 有序集合和列表类型有类似点:
- 二者都是有序的
- 二者都可以获得某一范围的元素
- 二者区别:
- 列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢
- 有序集合类型使用散列列表实现,所有即使读取位于中间部分的数据也很快
- 列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改分数实现)
- 有序集合要比列表类型更耗内存
-
命令:
- 增加元素:
- 向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数
- 返回值是新加入到集合中的元素个数,不包含之前已经存在的元素
zadd key score member score member ... #向集合中添加元素
- 获取元素的分数:
zscore key member #查询元素的分数
- 获得排名在某个范围的元素列表:
- 按照元素分数从小到大的顺序返回索引从 start 到 stop 之间的所有元素(包含两端的元素)
zrange key start stop [withscores] #withsxores 显示元素的分数
- 按照元素分数从小到大的顺序返回索引从 start 到 stop 之间的所有元素(包含两端的元素)
- 获取指定分数范围的元素:
zrangebyscore key min max [withscores] [limit offset count]
- 增加某个的分数,返回值是更改后的分数
zincrby key increment member
- 获取集合中元素的数量:
zcard scoreboard
- 获取指定分数范围内的元素分数:
zcount key min max
- 增加元素:
-
jedis 应用:
package com.qcby.config.test; import com.qcby.config.RedisUtil; import org.junit.Test; import redis.clients.jedis.Jedis; import java.util.Set; public class SortSetTest { @Test public void test(){ Jedis jedis = RedisUtil.getJedis(); try { jedis.zadd("hackers",1940,"Alan Kay"); jedis.zadd("hackers",1953,"Richard Stallman"); jedis.zadd("hackers",1965,"Yukihiro"); jedis.zadd("hackers",1916,"Linus"); Set<String> setValues = jedis.zrevrange("hackers",0,-1); System.out.println("set 集合:" + setValues); Set<String> setValues2 = jedis.zrevrange("hackers",0,-1); System.out.println("set2 集合:" + setValues2); //清空数据 // System.out.println("清空数据:" + jedis.flushDB()); //添加数据: jedis.zadd("zset",10.1,"hello"); jedis.zadd("zset",10.0,"world"); jedis.zadd("zset",10.11,"everything"); System.out.println("元素个为:" + jedis.zcard("zset")); System.out.println("hello 的存活时间:" + jedis.zscore("zset","hello")); System.out.println("zset 集合:" + jedis.zrange("zset",0,-1)); System.out.println("删除 hello 元素:" + jedis.zrem("zset","hello")); System.out.println("取出指定元素:" + jedis.zcount("zset",10.1,10.0)); System.out.println("整个集合:" + jedis.zrange("zset",0,-1)); }catch (Exception e){ e.printStackTrace(); }finally { RedisUtil.closeJedis(jedis); } } }
-
keys 命令(演示命令):
- 设置 key 生存时间
- redis 在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间,到期后数据销毁:
expire key seconds #设置 key 的生存时间(单位:秒) key 在多少秒后会自动删除 ttl key #产看 key 剩余的生存时间 pexpire key milliseconds #生存时间设置单位为:毫秒
- redis 在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间,到期后数据销毁:
- 设置 key 生存时间
-
其他命令:
- keys:返回满足条件的所有 key:
keys user* #返回满足前缀为 user 的 key exists key #确认一个 key 是否存在 del key #删除一个 key rename oldkey newkey #重命名 key type key #key的返回类型
- 应用:
@Test public void testOther(){ Jedis jedis = RedisUtil.getJedis(); try { System.out.println("查询所有key:" + jedis.keys("*")); System.out.println("查询所有结尾带 set 的key:" + jedis.keys("*set")); System.out.println("删除指定 key(失败返回 0):" + jedis.del("sanmdde")); System.out.println("返回key 的有效时间(-1:表示永久):" + jedis.ttl("zset")); //指定 key 的存活时间,时间为 秒 jedis.setex("hackers",10,"min"); //睡眠 5s 剩余时间为 5 Thread.sleep(5000); System.out.println("hackers 剩余存活时间:" + jedis.ttl("hackers")); System.out.println("是否有hacksers:" + jedis.exists("hackers")); System.out.println("给 hackers 重命名为 time:" + jedis.rename("hackers","time")); System.out.println("再次获取 hackers:" + jedis.get("hackers")); System.out.println("获取 time key:" + jedis.get("time")); //jedis 排序 //此处 rpush 和 lpush 是 list 的操作 jedis.del("a"); jedis.rpush("a","1"); jedis.rpush("a","3"); jedis.rpush("a","7"); jedis.rpush("a","4"); jedis.rpush("a","2"); jedis.rpush("a","6"); jedis.rpush("a","5"); System.out.println("正常顺序:" + jedis.lrange("a",0,-1)); System.out.println("排序:" + jedis.sort("a")); }catch (Exception e){ e.printStackTrace(); }finally { RedisUtil.closeJedis(jedis); } }
- keys:返回满足条件的所有 key: