Redis 中的 Hash 结构有扩容和缩容特性,扩容主要应用在当 hash 内部比较拥挤的时候,容易产生 hash 碰撞,这时需要扩容 hash 。申请新的两倍大小的数组;而缩容与扩容恰恰相反,虽然原理一样,但是申请的新数组要比旧的小一倍。
应用场景保存大量的对象数据
列表类型(List) redis list介绍在 java 中,列表类型有两种,一种是 ArrayList,实现方式是数组,所以根据索引查询数据速度快,而插入或者删除某个元素涉及到位移操作,会比较慢;另一种是 LinkedList,实现方式是双向链表(double linked list),每个元素都记录着前后元素的指针。所以在插入或删除某个元素时只需要更改该元素的前后指针指向就行,非常快,但是在查询上需要从头索引,特别是当数据量大的时候,索引起来还是比较慢的。
在 Redis 中的 List 类型,其内部使用的是双向链表实现的,所以它具有双向链表具有的相关特性。其常用操作就是向列表两端添加或删除元素。这使得 List 既可以当做栈(先进后出)来使用,也可以当做队列(先进先出)来使用。
相关操作命令 127.0.0.1:6379> lpush list 1 2 3 4 # 使用 lpush 将 1 2 3 4 依次插入到 list 的左端 (integer) 4 127.0.0.1:6379> rpush list 5 6 7 8 # 使用 rpush 将 5 6 7 8 依次插入到 list 的右端 (integer) 8 127.0.0.1:6379> lrange list 0 -1 # 使用 lrange 获取 指定区间上所有值(0 -1 表示获取全部) 1) "4" 2) "3" 3) "2" 4) "1" 5) "5" 6) "6" 7) "7" 8) "8" 127.0.0.1:6379> lpop list # 使用 lpop 弹出 list 左端的一个值,并返回弹出的值 "4" 127.0.0.1:6379> lpop list "3" 127.0.0.1:6379> rpop list # 使用 rpop 弹出 list 右端的一个值,并返回弹出的值 "8" 127.0.0.1:6379> rpop list "7" 127.0.0.1:6379> lrange list 0 -1 1) "2" 2) "1" 3) "5" 4) "6" 127.0.0.1:6379> llen list # 使用 llen 获取 list 中元素个数 (integer) 4 应用场景商品,博客,文章下面的评论列表。
集合类型(Set) redis set 介绍redis 中的 set 类型和 java 中的 HashSet 类似,其底层都是用HashMap 实现的,只不过所有的 value 都指向同一个对象。在 set 中,没有重复的元素。并且没有顺序。其常用的操作就是向集合中加入或删除一个元素、判断某个元素是否在集合中。另外 redis 还提供了多个集合之间的 交集、并集、差集的运算。
相关操作命令 127.0.0.1:6379> sadd set a b c 1 2 3 # 使用 sadd 将 a b c 1 2 3 添加到 set 集合中 (integer) 6 127.0.0.1:6379> sadd set a b 2 # 添加重复元素,返回成功添加 0 个,说明 set 中元素不重复 (integer) 0 127.0.0.1:6379> srem set a b 1 # 使用 srem 删除 set 集合中的 a b 1 三个元素 (integer) 3 127.0.0.1:6379> smembers set # 使用 smembers 获取 set 集合中所以元素 1) "2" 2) "c" 3) "3" 127.0.0.1:6379> sismember set a # 使用 sismember 判断 a 是否在 set 集合中 (integer) 0 127.0.0.1:6379> sismember set c # 使用 sismember 判断 c 是否在 set 集合中 (integer) 1 集合间的相关运算 集合的并集运算 A ∪ B 127.0.0.1:6379> sadd seta 1 2 3 (integer) 3 127.0.0.1:6379> sadd setb 3 4 5 (integer) 3 127.0.0.1:6379> sunion seta setb # 使用 sunion 计算 seta 和 setb 的并集 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 集合的交集运算 A ∩ B