上海建设银行网站转账记录吗,网络推广推广公司,页面设计在哪里,网站优秀设计Redis 共有 5 种基本数据类型#xff1a;String#xff08;字符串#xff09;、List#xff08;列表#xff09;、Set#xff08;集合#xff09;、Hash#xff08;散列#xff09;、Zset#xff08;有序集合#xff09;。
这 5 种数据类型是直接提供给用户使用的String字符串、List列表、Set集合、Hash散列、Zset有序集合。
这 5 种数据类型是直接提供给用户使用的是数据的保存形式其底层实现主要依赖这 8 种数据结构简单动态字符串SDS、LinkedList双向链表、Dict哈希表/字典、SkipList跳跃表、Intset整数集合、ZipList压缩列表、QuickList快速列表。
Redis 5 种基本数据类型对应的底层数据结构实现如下表所示
StringListHashSetZsetSDSLinkedList/ZipList/QuickListDict、ZipListDict、IntsetZipList、SkipList
StringListHashSetZsetSDSLinkedList/ZipList/QuickListDict、ZipListDict、IntsetZipList、SkipListRedis 3.2 之前List 底层实现是 LinkedList 或者 ZipList。
Redis 3.2 之后引入了 LinkedList 和 ZipList 的结合 QuickListList 的底层实现变为 QuickList。从 Redis 7.0 开始 ZipList 被 ListPack 取代。
String字符串
介绍
String 是 Redis 中最简单同时也是最常用的一个数据类型。String 是一种二进制安全的数据类型可以用来存储任何类型的数据比如字符串、整数、浮点数、图片图片的 base64 编码或者解码或者图片的路径、序列化后的对象。
虽然 Redis 是用 C 语言写的但是 Redis 并没有使用 C 的字符串表示而是自己构建了一种 简单动态字符串Simple Dynamic StringSDS。相比于 C 的原生字符串Redis 的 SDS 不光可以保存文本数据还可以保存二进制数据并且获取字符串长度复杂度为 O(1)C 字符串为 O(N),除此之外Redis 的 SDS API 是安全的不会造成缓冲区溢出.
应用场景
需要存储常规数据的场景举例 缓存 Session、Token、图片地址、序列化后的对象(相比较于 Hash 存储更节省内存)。相关命令SET、GET。需要计数的场景举例用户单位时间的请求数简单限流可以用到、页面单位时间的访问数。相关命令SET、GET、 INCR、DECR 。分布式锁 利用 SETNX key value 命令可以实现一个最简易的分布式锁存在一些缺陷通常不建议这样实现分布式锁。
List列表
介绍
Redis 中的 List 其实就是链表数据结构的实现。许多高级编程语言都内置了链表的实现比如 Java 中的 LinkedList但是 C 语言并没有实现链表所以 Redis 实现了自己的链表数据结构。Redis 的 List 的实现为一个 双向链表即可以支持反向查找和遍历更方便操作不过带来了部分额外的内存开销。
常用命令
命令介绍RPUSH key value1 value2 …在指定列表的尾部右边添加一个或多个元素RPUSH key value1 value2 …在指定列表的尾部右边添加一个或多个元素LPUSH key value1 value2 …在指定列表的头部左边添加一个或多个元素LSET key index value将指定列表索引 index 位置的值设置为 valueLPOP key移除并获取指定列表的第一个元素(最左边)RPOP key移除并获取指定列表的最后一个元素(最右边)LLEN key获取列表元素数量LRANGE key start end获取列表 start 和 end 之间 的元素
我专门画了一个图方便大家理解 RPUSH , LPOP , lpush , RPOP 命令 应用场景
信息流展示 举例最新文章、最新动态。相关命令LPUSH、LRANGE。 消息队列 List 可以用来做消息队列只是功能过于简单且存在很多缺陷不建议这样做。 相对来说Redis 5.0 新增加的一个数据结构 Stream 更适合做消息队列一些只是功能依然非常简陋。和专业的消息队列相比还是有很多欠缺的地方比如消息丢失和堆积问题不好解决。
Hash哈希
介绍
Redis 中的 Hash 是一个 String 类型的 field-value键值对 的映射表特别适合用于存储对象后续操作的时候你可以直接修改这个对象中的某些字段的值。
Hash 类似于 JDK1.8 前的 HashMap内部实现也差不多(数组 链表)。不过Redis 的 Hash 做了更多优化。 常用命令
命令介绍HSET key field value设置指定哈希表中指定字段的值HSETNX key field value只有指定字段不存在时设置指定字段的值HMSET key field1 value1 field2 value2 …同时将一个或多个 field-value (域-值)对设置到指定哈希表中HGET key field获取指定哈希表中指定字段的值HMGET key field1 field2 …获取指定哈希表中一个或者多个指定字段的值HGETALL key获取指定哈希表中所有的键值对HEXISTS key field查看指定哈希表中指定的字段是否存在HDEL key field1 field2 …删除一个或多个哈希表字段HLEN key获取指定哈希表中字段的数量HINCRBY key field increment对指定哈希中的指定字段做运算操作正数为加负数为减
应用场景
对象数据存储场景举例用户信息、商品信息、文章信息、购物车信息。 相关命令HSET 设置单个字段的值、HMSET设置多个字段的值、HGET获取单个字段的值、HMGET获取多个字段的值。
Set集合
介绍
Redis 中的 Set 类型是一种无序集合集合中的元素没有先后顺序但都唯一有点类似于 Java 中的 HashSet 。当你需要存储一个列表数据又不希望出现重复数据时Set 是一个很好的选择并且 Set 提供了判断某个元素是否在一个 Set 集合内的重要接口这个也是 List 所不能提供的。你可以基于 Set 轻易实现交集、并集、差集的操作比如你可以将一个用户所有的关注人存在一个集合中将其所有粉丝存在一个集合。这样的话Set 可以非常方便的实现如共同关注、共同粉丝、共同喜好等功能。这个过程也就是求交集的过程。
常用命令
命令介绍SADD key member1 member2 …向指定集合添加一个或多个元素SMEMBERS key获取指定集合中的所有元素SCARD key获取指定集合的元素数量SISMEMBER keymember判断指定元素是否在指定集合中SINTER key1 key2 …获取给定所有集合的交集SINTERSTORE destination key1 key2 …将给定所有集合的交集存储在 destination 中SUNION key1 key2 …获取给定所有集合的并集SUNIONSTORE destination key1 key2 …将给定所有集合的并集存储在 destination 中SDIFF key1 key2 …获取给定所有集合的差集SDIFFSTORE destination key1 key2 …将给定所有集合的差集存储在 destination 中SPOP key count随机移除并获取指定集合中一个或多个元素SRANDMEMBER key count随机获取指定集合中指定数量的元素
应用场景
需要存放的数据不能重复的场景
举例网站 UV 统计数据量巨大的场景还是 HyperLogLog更适合一些、文章点赞、动态点赞等场景。相关命令SCARD获取集合数量
需要获取多个数据源交集、并集和差集的场景
举例共同好友(交集)、共同粉丝(交集)、共同关注(交集)、好友推荐差集、音乐推荐差集、订阅号推荐差集交集 等场景。相关命令SINTER交集、SINTERSTORE 交集、SUNION 并集、SUNIONSTORE并集、SDIFF差集、SDIFFSTORE 差集。
需要随机获取数据源中的元素的场景
举例抽奖系统、随机点名等场景。相关命令SPOP随机获取集合中的元素并移除适合不允许重复中奖的场景、SRANDMEMBER随机获取集合中的元素适合允许重复中奖的场景。
Sorted Set有序集合
介绍
Sorted Set 类似于 Set但和 Set 相比Sorted Set 增加了一个权重参数 score使得集合中的元素能够按 score 进行有序排列还可以通过 score 的范围来获取元素的列表。有点像是 Java 中 HashMap 和 TreeSet 的结合体。 常用命令
命令介绍ZADD key score1 member1 score2 member2 …向指定有序集合添加一个或多个元素ZCARD KEY获取指定有序集合的元素数量ZSCORE key member获取指定有序集合中指定元素的 score 值ZINTERSTORE destination numkeys key1 key2 …将给定所有有序集合的交集存储在 destination 中对相同元素对应的 score 值进行 SUM 聚合操作numkeys 为集合数量ZUNIONSTORE destination numkeys key1 key2 …求并集其它和 ZINTERSTORE 类似ZDIFFSTORE destination numkeys key1 key2 …求差集其它和 ZINTERSTORE 类似ZRANGE key start end获取指定有序集合 start 和 end 之间的元素score 从低到高ZREVRANGE key start end获取指定有序集合 start 和 end 之间的元素score 从高到底ZREVRANK key member获取指定有序集合中指定元素的排名(score 从大到小排序)
应用场景
需要随机获取数据源中的元素根据某个权重进行排序的场景
举例各种排行榜比如直播间送礼物的排行榜、朋友圈的微信步数排行榜、王者荣耀中的段位排行榜、话题热度排行榜等等。相关命令ZRANGE (从小到大排序)、 ZREVRANGE 从大到小排序、ZREVRANK (指定元素排名)。
需要存储的数据有优先级或者重要程度的场景 比如优先级任务队列。
举例优先级任务队列。相关命令ZRANGE (从小到大排序)、 ZREVRANGE 从大到小排序、ZREVRANK (指定元素排名)。
总结
数据类型说明String一种二进制安全的数据类型可以用来存储任何类型的数据比如字符串、整数、浮点数、图片图片的 base64 编码或者解码或者图片的路径、序列化后的对象。ListRedis 的 List 的实现为一个双向链表即可以支持反向查找和遍历更方便操作不过带来了部分额外的内存开销。Hash一个 String 类型的 field-value键值对 的映射表特别适合用于存储对象后续操作的时候你可以直接修改这个对象中的某些字段的值。Set无序集合集合中的元素没有先后顺序但都唯一有点类似于 Java 中的 HashSet 。Zset和 Set 相比Sorted Set 增加了一个权重参数 score使得集合中的元素能够按 score 进行有序排列还可以通过 score 的范围来获取元素的列表。有点像是 Java 中 HashMap 和 TreeSet 的结合体。