Redis key命令key的储存方式

 更新时间:2024年04月03日 11:18:28   作者:码农弓长先生  
这篇文章主要介绍了Redis key命令key的储存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Redis是目前使用比较广泛的nosql数据库,它也是一种基于key-value结构的数据库且支持多种数据类型,Redis中它的存储是使用一张hash表用于存储所有的key和对应value的地址。

因此key的命令是我们必须要掌握的。

前项

数据准备,首先我们先在redis中设置一些数据

arr1 =  beijing     
arr2 = shanghai   
arr3 = shenzhen 
arr4 = guangzhou
param1 = guangdong   
param2=hunan 
param3 = jiangxi 
param4 = hubei

Key命令使用

1. keys [pattern] 

查看当前库的key(*代表通配符)。

该命令慎用,keys命令会扫描所有key,由于redis的执行是串行执行,当key过多时使用keys命令时会导致阻塞其他命令的执行,从而导致redis服务的崩溃。

大多数生产使用redis时会将keys命令禁用。

keys *  查看所有的key

keys arr* 匹配以arr开头的key

 

keys *guangzhou  匹配以guangzhou结尾的key 

keys param1  指定查看key为param1

 

2. exists [key . . .] 

判断key是否存在,可以同时判断多个key

exists arr1  判断arr1 是否存在 返回1则存在 返回0则不存在

exists arr1 arr2 arr3 同时判断arr1 arr2 arr3 是否存在 匹配到n个key则返回n

如果都不存在则返回0

 

 

3. type key

查看key的类型,只能支持单个判断

4. del [key . . .]

删除指定的key 删除n个key 则返回n   

unlink [key . . .]异步删除

 

5. exprie key [second]

设置key的过期时间

6. ttl key

查看key还剩多少时间过期,数字代表剩下多少秒, -2 代表已过期, -1 代表永不过期

 

7. dbsize 

查看当前key的数量

Key的存储

redis中对key的存储使用的是一张全局的hashtable来存储,将每个key使用siphash函数生成一个64位的数字作为存储在hashtable里的索引。

当不同的键被落在同一个索引下时,使用链表结构来存储。

如下图:

渐进式rehash

当相同的索引键链表节点数过大,超过整个hashtable的数量时,那么查找key的效率就会降低,因此redis则会对该全局hashtable进行rehash的操作。

如果 key的数量过大时直接进行rehash操作进行扩容时有可能会导致redis服务阻塞,因此redis则采用的是渐进式的rehash操作。

渐进式rehash的过程

redis在启动时内部默认会分配两个hashtable(ht0 、ht1),在正常使用时则使用其中一个ht0,当需要进行rehash操作时ht1才需要被使用到。

渐进式rehash的操作步骤:

1、首先将原ht1的空间扩容,让ht1同时有ht0 和 ht1两个哈希表的空间大小。

2、进行rehash操作时,在ht0中维护一个索引计数器 rehashidx , 并将它的值设置为 0 。

3、在rehash期间,当执行添加、删除、查找或者更新操作时,redis会将ht0 哈希表在 rehashidx 索引上的所有键值对 rehash 到 ht1,同时rehashidx 的值加1。

4、当rehash的次数不断增多时,ht0的所有键值对都会被 rehash 至 ht1,此时rehashidx 属性的值设为 -1 ,则代表rehash 操作已经全部完成,那么ht1和ht0的位置进行交换,前面提到的默认操作都是在ht0上的。

总之

rehash操作主要是解决由于hash冲突导致key链表过大影响性能,而使用渐进式rehash操作则是未来避免key数量过大因rehash导致redis服务的阻塞。

这些机制最终的目的都是为了能够提高redis服务的性能。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Redis分布式限流生产环境落地方案

    Redis分布式限流生产环境落地方案

    本文主要介绍了Redis分布式限流生产环境落地方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-02-02
  • Redis中一个String类型引发的惨案

    Redis中一个String类型引发的惨案

    着存储的数据量越来越大,Redis的内存的使用量也快速上升,结果遇到了大内存Redis实例因为生成RDB而响应变慢的问题。很显然String类型并不是一种好的选择,那有什么办法可以降低内存消耗吗?带着这个问题一起通过本文学习下吧
    2021-07-07
  • Redis的数据过期策略和数据淘汰策略

    Redis的数据过期策略和数据淘汰策略

    本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • Redis实现分布式锁全过程

    Redis实现分布式锁全过程

    文章介绍Redis实现分布式锁的方法,包括使用SETNX和EXPIRE命令确保互斥性与防死锁,Redisson客户端提供的便捷接口,以及Redlock算法通过多节点共识提高容错性,同时强调需合理设置锁过期时间、唯一标识,并注意网络分区问题
    2025-08-08
  • Redis分布式锁的10个坑总结

    Redis分布式锁的10个坑总结

    日常开发中,经常会碰到秒杀抢购等业务,为了避免并发请求造成的库存超卖等问题,我们一般会用到Redis分布式锁,但是使用Redis分布式锁,很容易踩坑哦,本文将给大家分析阐述,Redis分布式锁的10个坑,需要的朋友可以参考下
    2023-05-05
  • Redis数据库的键管理示例详解

    Redis数据库的键管理示例详解

    这篇文章主要为大家介绍了Redis数据库的键管理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 解决Redis缓存击穿问题(互斥锁、逻辑过期)

    解决Redis缓存击穿问题(互斥锁、逻辑过期)

    本文介绍了背景缓存击穿问题及两种常见解决方案:互斥锁与逻辑过期,互斥锁通过获取锁来确保数据最新,但响应速度慢,可能有死锁风险,逻辑过期利用过期字段判断缓存是否过期,提高性能但不保证一致性,需要额外内存,通过JMeter测试,两种方案都能有效缓解缓存击穿问题
    2026-02-02
  • Redis高效安全的遍历所有key的几种方法

    Redis高效安全的遍历所有key的几种方法

    在 Redis 中,遍历所有的 key 是一个相对昂贵的操作,特别是当你有大量的数据时,直接使用 KEYS 命令会导致阻塞,这对于大规模的 Redis 实例来说是非常不安全的,所以本文给大家介绍了几种Redis高效安全的遍历所有key的方法,需要的朋友可以参考下
    2025-08-08
  • Redis中Zset类型常用命令的实现

    Redis中Zset类型常用命令的实现

    Zset是Redis的一种有序集合数据类型,Zset通过压缩列表和跳跃表两种底层编码方式支持小数据集和大数据集,支持多种操作,包括添加、查询、删除元素以及集合运算等,具有不同的时间复杂度,感兴趣的可以了解一下
    2024-10-10
  • Redis解决缓存击穿问题的两种方法

    Redis解决缓存击穿问题的两种方法

    缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Redis解决缓存击穿问题的两种方法,需要的朋友可以参考下
    2025-03-03

最新评论