Redis精品小案例:Redis支持五种基本数据类型及案例解析

Redis支持五种基本数据类型,分别是:string(字符串)、hash(哈希)、list(列表)、set(集合)及zset(sorted set:有序集合)。以下是这些数据类型及其用法的简要说明:

  1. String(字符串)

    • 是Redis最基本的数据类型,你可以理解为与Memcached一模一样的类型,一个key对应一个value。
    • 示例:SET key "value" 将字符串值 value 关联到 key。
  2. Hash(哈希)

    • 类似于Java里面的Map<String, Object>,是一个键值对集合。
    • 示例:HSET key field value 将哈希表 key 中的字段 field 的值设为 value。
  3. List(列表)

    • 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
    • 示例:LPUSH key value 将一个或多个值 value 插入到列表 key 的表头。
  4. Set(集合)

    • Set 是string类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
    • 示例:SADD key member 将一个或多个 member 元素加入到集合 key 中,已经存在于集合的 member 元素将被忽略。
  5. Zset(sorted set:有序集合)

    • 和set一样也是string类型元素的集合,且不允许重复。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的元素进行从小到大的排序。
    • 示例:ZADD key score member 将一个或多个 member 元素及其 score 值加入到有序集合 key 中。

这些数据类型使得Redis非常灵活,可以应用于各种场景,如缓存、消息队列、分布式锁等。

Redis的LRU(Least Recently Used)缓存淘汰策略并不是通过传统意义上的LRU算法实现的,而是采用了一种近似LRU的策略。这是因为传统的LRU算法需要维护一个双向链表,并在每次访问时更新元素的位置,这在Redis这种大规模数据存储系统中会导致较高的开销。因此,Redis采用了一个更简单的近似算法来模拟LRU的行为。

Redis的近似LRU策略基于每个对象的最后一次访问时间来实现。Redis使用了一个LRU时钟来追踪哪些对象是最久未使用的。当Redis的内存达到最大限制,并且需要为新数据腾出空间时,它会查看哪些对象是最久未使用的,并淘汰这些对象。

具体来说,Redis的LRU淘汰策略是这样实现的:

  1. 当一个对象被访问时,Redis会更新该对象的最后一次访问时间。
  2. 当需要淘汰对象时,Redis会遍历它的键空间(key space),并使用一个LRU时钟来跟踪哪些键是最久未使用的。这个LRU时钟实际上是一个循环计数器,每次选择淘汰对象时都会递增。
  3. Redis会检查每个键的LRU时钟值,并与当前LRU时钟值进行比较。如果一个键的LRU时钟值与当前LRU时钟值相差最大,那么它就被认为是最久未使用的,并会被淘汰。
  4. 如果存在多个键具有相同的最大LRU时钟差值,Redis可能会使用其他策略(如随机选择或基于键的某种属性)来决定淘汰哪个键。

需要注意的是,由于Redis的LRU策略是近似的,因此它并不能保证始终淘汰最久未使用的对象。但在大多数情况下,这种近似策略已经足够好,能够满足大多数缓存应用的需求。

举例说明:

假设Redis的内存限制为100MB,当前已经使用了95MB。当一个新的对象需要被添加进来时,Redis需要淘汰一些旧的对象以腾出空间。此时,Redis会遍历它的键空间,并检查每个键的LRU时钟值。假设键A、B、C的LRU时钟值分别为10、20、30,而当前LRU时钟值为40。由于键C的LRU时钟值与当前LRU时钟值的差值最大(40-30=10),因此键C会被认为是最久未使用的对象,并会被淘汰。然后,新的对象就可以被添加到Redis中了。

相关推荐
用户0953675158319 小时前
在系统的学习 redis 前的疑惑
redis·go
吴声子夜歌1 天前
Redis 3.x——集群故障转移
java·数据库·redis·集群
明豆1 天前
Redis 分布式缓存生产实战
redis·分布式·缓存
海兰1 天前
【高速缓存】RedisVL 指南:从向量搜索到 AI 应用落地
人工智能·redis
weixin_727535621 天前
双Token认证体系深度拆解:Spring Security + JWT + Redis
redis·spring·wpf
William Dawson1 天前
【华为云 MRS Redis 安全集群 Kerberos 认证接入实战(Spring Boot \+ Jedis)】
redis·安全·华为云
zhouhui0011 天前
AI帮我写了个Spring Boot校验,线上漏掉了这组边界条件
java·spring boot·redis·ai编程
吃饱了得干活1 天前
扫码登录如何实现?从原理到实战
java·spring boot·redis
熊猫钓鱼>_>2 天前
Redis 突发缓存穿透:一次完整的定位复盘
数据库·人工智能·redis·缓存·ai·agent·智能
Ethan01072 天前
redis 热key问题如何解决+场景
redis