. Hash
其用法就跟Java中的HashMap中一样,都是往map中去丢键值对。
4.1 使用
基础的命令如下:
-
hset 在hash中设置键值对
-
hget 获hash中的某个key值
-
hdel 删除hash中某个键
-
hlen 统计hash中元素的个数
-
hmget 批量的获取hash中的键的值
-
hmset 批量的设置hash中的键和值
-
hexists 判断hash中某个key是否存在
-
hkeys 返回hash中的所有键(不包含值)
-
hvals 返回hash中的所有值(不包含键)
-
hgetall 获取所有的键值对,包含了键和值
其实大多数情况下的使用跟HashMap是差不多的,没有什么较为特殊的地方。
4.2 原理
hash的底层实现也是有两种,ZipList和HashTable。但具体采用哪一种与Redis的版本无关,而与当前hash中所存的元素有关。首先当我们创建一个hash的时候,采用的ZipList进行存储。随着hash中的元素增多,达到了Redis设定的阈值,就会转换为HashTable。
其设定的阈值如下:
-
存储的某个键或者值长度大于默认值(64)
-
ZipList中存储的元素数量大于默认值(512)
ZipList上面我们专门简单分析了一下,理解这个设定应该也比较容易。当ZipList中的元素过多的时候,其查询的效率就会变得低下。而HashTable的底层设计其实和Java中的HashMap差不多,都是通过拉链法解决哈希冲突。具体的可以参考从基础的使用来深挖HashMap这篇文章。
5. Set
Set的概念可以与Java中的Set划等号,用于存储一个不包含重复元素的集合。
5.1 使用
其主要的命令如下,key代表redis中的Set,member代表集合中的元素。
-
sadd sadd key member [...] 将一个或者多个元素加入到集合中,如果有已经存在的元素会忽略掉。
-
srem srem key member [...]将一个或者多个元素从集合中移除,不存在的元素会被忽略掉
-
smembers smembers key返回集合中的所有成员
-
sismember dismember key member判断member在key中是否存在,如果存在则返回1,如果不存在则返回0
-
scard scard key返回集合key中的元素的数量
-
smove move source destination member将元素从source集合移动到destination集合。如果source中不包含member,则不会执行任何操作,当且仅当存在才会从集合中移出。如果destination已经存在元素则不会对destination做任何操作。该命令是原子操作。
-
spop spop key随机删除并返回集合中的一个元素
-
srandmember srandmember key与spop一样,只不过不会将元素删除,可以理解为从集合中随机出一个元素来。
-
sinter 求一个或者多个集合的交集
-
sinterstore sinterstore destination key [...]与sinter类似,但是会将得出的结果存到destination中。
-
sunion 求一个或者多个集合的并集
-
sunionstore sunionstore destination key [...]
-
sdiff 求一个或者多个集合的差集
-
sdiffstore sdiffstore destination key [...]与sdiff类似,但是会将得出的结果存到destination中。
5.2 原理
我们知道Java中的Set有多种实现。在Redis中也是,有IntSet和HashTable两种实现,首先初始化的时候使用的是IntSet,而满足如下的条件时,就会转换成HashTable。
-
当集合中保存的所有元素都是整数时
-
集合对象保存的元素数量不超过512
上面已经简单的介绍了HashTable了,所以这里只聊聊IntSet。
5.2.1 IntSet
intset底层是一个数组,既然数据结构是数组,那么存储数据就可以是有序的,这也使得intset的底层查询是通过二分查找来实现。其结构如下。

(编辑:通化站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|