redis数据中有时间字段,怎么查找时间区间内的数据

redis数据中有时间字段,怎么查找时间区间内的数据,第1张

我们将这两个范围的起始位置存在Redis的Sorted Sets数据结构中,基本范围起始值作为score,范围名加start和end为其value值:

redis 127001:6379> zadd ranges 10 A_start

(integer) 1

redis 127001:6379> zadd ranges 20 A_end

(integer) 1

redis 127001:6379> zadd ranges 30 B_start

(integer) 1

redis 127001:6379> zadd ranges 40 B_end

(integer) 1

内存的读写速度很快

Epoll 模型

常用的五大Redis的数据结构,及他们各自的底层实现结构

string hash list set sortset(zset)

string 的底层实现是 简单动态字符串(SDS -simple dynamic string)

hash 的底层实现是 hash表 或则 压缩列表(ziplist)

list 的底层实现是 双向列表(quicklist) 或者 压缩列表

set 的底层实现是 hash表(hashtable) 或者 整数数组

sortset(zset) 的底层实现是 压缩列表 或者 跳表

各个数据结构的底层实现概览

value是 string 类型的时候分为三种情况

(1)、当设置的值是整数类型的时候,redis底层会将 string 类型转化为 int 来存储

(2)、设置的值小于等于44个字节的时候,使用的编码是 embstr

(3)、设置的值大于44个字节的时候,使用的编码是 raw

redis是用C语言编写的,在C语言中 string 类型是用字符数组 char[] 来实现的。redis实现字符串的底层并没有直接使用C语言中的字符数组的形式,而是进行了改造,构造出了一种SDS的数据结构

list的底层使用 快速双向链表quicklist 或者 压缩链表ziplist 来实现的。

list的底层并没有使用传统的双向链表的结构是因为

(1)、双向链表需要有一个 前指针 和 后指针 ,每个指针占用的空间分别都是8byte, 占用内存 比较多

(2)、双向链表所通用的一个问题是会形成很多的 内存碎片

压缩链表 ziplist 结构是

快速双向链表 quicklist 结构

hash的底层实现为 hashtable 或者 ziplist 。

hashtable的底层实现

当数据量比较小或者单个元素的时候,底层使用的是ziplist存储,具体可以通过配置来制定

1、 hashtable 是无序的 ziplist 是有序的

2、在能使用 hash 的情况下优先使用 hash ,不要使用 String ,因为使用太多的 String ,则会创建出过多的 key ,当 key 大量的时候,就会容易发生 hash碰撞 ,所以就需要频繁的 rehash ,每次 rehash 就会创建2倍的内存,造成内存浪费

hash的底层实现为 整数数组intset 或者 hashtable 。

当set都为整数的时候,set的底层实现都是使用 intset 结构实现

如果set中存在字符串的值,则使用 hashtable 来实现

intset 是有序的, hashtable 是无序的

sortset 底层使用 压缩列表ziplist 或 跳表skiplist 的结构实现

当数据量小的情况下,使用 ziplist 实现,当数据量大的情况下使用 ziplist 实现,具体可以通过配置设置

默认设置下的底层结构

skiplist 的底层实现

查找对应元素的时候,先从最高的索引层找,例如找c 150,则先从L1找,L1的指针指向b,查看b120小于150,则继续往后找,b的指针指向null,则向下一层找,向下一层b的指针指向c,查看c的score为150,所以找到对应的元素c

1、 >

zset相关的问题,算是面试中的高频问题了。那么zset到底是什么?底层的实现原理是什么?相关的使用场景有哪些?

1 zset是什么?

在redis官网( >

1 String——字符串

String 数据结构是简单的 key-value 类型,value 不仅可以是 String,也可以是数字(当数字类型用 Long

可以表示的时候encoding 就是整型,其他都存储在 sdshdr 当做字符串)。使用 Strings 类型,可以完全实现目前 Memcached

的功能,并且效率更高。还可以享受 Redis 的定时持久化(可以选择 RDB 模式或者 AOF 模式), *** 作日志及 Replication 等功能。除了提供与

Memcached 一样的 get、set、incr、decr 等 *** 作外,Redis 还提供了下面一些 *** 作:

2 Hash——字典

在 Memcached 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON

格式),比如用户的昵称、年龄、性别、积分等。这时候在需要修改其中某一项时,通常需要将字符串(JSON)取出来,然后进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。简单修改一个属性就干这么多事情,消耗必定是很大的,也不适用于一些可能并发 *** 作的场合(比如两个并发的 *** 作都需要修改积分)。而

Redis 的 Hash 结构可以使你像在数据库中 Update 一个属性一样只修改某一项属性值。

3 List——列表

List 说白了就是链表(redis 使用双端链表实现的 List),相信学过数据结构知识的人都应该能理解其结构。使用 List

结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的 TimeLine )。List 的另一个应用就是消息队列,可以利用 List 的 PUSH

*** 作,将任务存在 List 中,然后工作线程再用 POP *** 作将任务取出进行执行。Redis 还提供了 *** 作 List 中某一段元素的

API,你可以直接查询,删除 List 中某一段的元素。

4 Set——集合

Set 就是一个集合,集合的概念就是一堆不重复值的组合。利用 Redis 提供的 Set

数据结构,可以存储一些集合性的数据。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为 Redis

非常人性化的为集合提供了求交集、并集、差集等 *** 作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合 *** 作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

1共同好友、二度好友

2利用唯一性,可以统计访问网站的所有独立 IP

3好友推荐的时候,根据 tag 求交集,大于某个

threshold 就可以推荐

5 Sorted Set——有序集合

和Sets相比,Sorted Sets是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score

进行有序排列,比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score

就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。另外还可以用 Sorted Sets 来做带权重的队列,比如普通消息的 score

为1,重要消息的 score 为2,然后工作线程可以选择按 score 的倒序来获取工作任务。让重要的任务优先执行。

以上就是关于redis数据中有时间字段,怎么查找时间区间内的数据全部的内容,包括:redis数据中有时间字段,怎么查找时间区间内的数据、4、Redis高性能的根本原理、关于redis中的zset(sorted set)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9459814.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存