Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set可以自动去重(相当于数学中的集合),当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
Redis的 set 是string类型的无序集合。底层是一个value位null的hash表,所以添加、删除、查找复杂度都是O(1)。
常用命令sadd 将一个或多个member元素加入到集合key中,已经存在的member元素将被忽略
smember 取出该集合的所有值
sismember 判断集合是否含有该值,有1,没有0
scard 返回该集合的元素个数
srem 删除集合中的某个元素
spop 随机从该集合中d出一个值
srandmember 随机从该集合中取出n个值。不会从集合中删除。
smove value 把集合中一个值从一个集合移动到另一个集合
sinter 返回两个集合的交集元素
sunion 返回两个集合的并集元素
sdiff返回两个集合的差集元素(key1中的,不包含key2中的)
数据结构 Set数据结构底层是dict字典,字典使用哈希表实现的。
Java中的HashSet的内部实现使用的是HashMap,只不过所有的value都指向一个对象。Redis的set结构也是一样,他的内部也使用hash结构,所有的value都指向同一个内部值。
Redis 哈希(Hash)- Redis hash 是一个键值对集合
- Redis hash 是一个string类型的fidle 和value 的映射边表,hash特别适合用于存储对象。
- 类似Java中的Map
存储{id=1,name=zhangsan,age=20}对象
第一种: user : {id=1,name=zhangsan,age=20}
第二种:分开存储
user:id 1
user:name zhangsan
user:age 20
第三种:hash
id 1
user name zhangsan
age 20
通过key + field就可以 *** 作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题
常用命令
hset 给key 集合中的 field键赋值为value
hget 从集合取出 value
hmset 批量设置hash的值
hexists查看哈希表key中,给定field是否存在
hkeys 列出该hash集合的所有field
hvals 列出hash集合所有的value
hincrby 为哈希表key中的域field的值加上增量1 -1
hsetnx 将哈希表key中的域field的值设置为value,当且仅当域field不存在。
数据结构 Hash类型对应的数据结构是两种:ziplist , hashtable 。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable.
Redis有序集合Zset(Sorted set) Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score),这个评分被用来按照最低分到最高分的方式排序集合中的成员。集合的成员是唯一的额,但是评分可以是重复的。
因为元素是有序的,所以可以很快的根据评分或者次序来获取一个范围的元素,访问有序集合的中间元素也是非常快的,因此能够使用有序集合作为一个没有重复成员的智能列表。
常用命令zadd 将一个或多个member元素及其score值加入到有序集合key当中。
zrange
zrangebyscore key min max [withscores]返回有序集key中,所有scre值介于min和max之间的成员按递增顺序排列。
zrevrangebyscore key max min [withscores] 同上,中不过是按递减顺序
zincrby 为元素的score加上增量
zrem 删除该集合下指定值的元素
zcount 统计该集合,分数区间内的元素个数
zrank 返回该值在集合中的排名,从0开始
数据结构 SortedSet(Set)是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map
zset底层使用了两个数据结构
- hash,hash作用就是关联元素value和权score,保障元素value的唯一性,可以通过元素value找到相应的score值。
- 跳跃表,跳跃表的目的在于给元素value排序,根据socre的范围获取元素列表。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)