Redis的基本概念

news/2024/11/23 2:30:04/

文章目录

    • 1 为什么使用Redis
    • 2 为什么Redis这么快
    • 3 Redis命令参考
    • 4 Redis的数据结构
      • 4.1 string(字符串)
      • 4.2 list(列表)
      • 4.3 hash(字典)
      • 4.4 set(集合)
      • 4.5 zset(有序列表)
    • 5 过期时间
    • 参考

1 为什么使用Redis

  • Redis的性能高,官方宣称能支持10W QPS。
  • Redis的数据类型丰富,能够支撑很多的业务需求使用场景。
  • Redis支持持久化、复制、哨兵、集群等高级特效,可靠性高。

2 为什么Redis这么快

  • Redis的数据存储在内存中,并发能力强。
  • Redis的数据结构非常精简。
  • Redis采用分片存储,不会因为数据的增长而严重影响性能。
  • Redis通过单线程IO多路复用的方式,减少了线程上下文切换等消耗。

注意:关于IO多路复用,个人推荐一篇写的非常好的博客:select、poll、epoll之间的区别

3 Redis命令参考

推荐一个Redis命令参考手册

4 Redis的数据结构

此处的数据结构介绍写的比较精简,推荐大家阅读以下《Redis深度历险:核心原理和应用实践》这本书,里面有不仅有详细的介绍,还有示例演示。

4.1 string(字符串)

     string相当于Java中的ArrayList,即数组实现。string是Redis最基础的数据结构,Redis的key都是字符串类型,不同数据结构的差异是体现在value中。
     Redis在增长字符串时采用预分配冗余空间的方式来减少内存的频繁分配,每次扩容会多扩1 MB,字符串最大长度为512 MB。在缩短时采用惰性空间释放的方式,即不立即使用内存重分配来回收缩短后多出来的字节, 而是使用free属性将这些字节的数量记录起来,并等待将来使用。

4.2 list(列表)

     list相当于Java中的LinkedList,这时候已经不是链表而是数组了。所以和链表一样,插入和删除速度非常快,时间复杂度仅为O(1),但是index速度很慢,需要遍历查询,时间复杂度为O(n)。列表结构常常被用来做异步队列使用。
     当列表弹出最后一个元素之后,就会被自动删除,内存被回收。
     就如同Hashmap当链表长度大于等于7就会转换为红黑树一样,Redis的列表也并非单纯的linkedlist结构。当列表元素较少的情况下是使用一块连续的内存存储,此结构称为ziplist,也叫压缩列表,当数据量较多时会转化为quicklist。这是因为普通的列表需要的附加指针空间太大,会比较浪费空间,而且会加重内存的碎片化。

4.3 hash(字典)

     hash相当于Java中的HashMap,是无序字典。其内部结构和HashMap一致,第一维为数组,第二维为链表。
     但是在扩容时rehash的过程上和HashMap有所不同,因为HashMap在rehash时是直接一次性rehash,会停止当前线程的读写任务,过程非常耗时。而Redis采用了渐进式rehash策略,保证了当前线程可以继续执行读写任务。渐进式rehash是创建一个扩容后新hash,同时保留旧的hash,查询时会同时从查询两个hash,然后会开启一个任务循序渐进地将旧hash的内容一点点迁移到新的hash中。当hash移除了最后一个元素后,就会被自动删除,内存被回收。

4.4 set(集合)

     set相当于Java中的HashSet,它内部的键值对是无序、唯一的,可以用来做去重功能,set所有的value都是NULL。当set中最后一个元素移除后,就会被自动删除,内存被回收。

4.5 zset(有序列表)

    zset是Java中SortSet和HashMap的结合体,他内部的键值对是有序、唯一的。“唯一”是因为zset也属于set,“有序”是因为它可以给每一个value赋予一个score,通过value来排序,其内部实现使用了一种叫“跳跃列表”的数据结构。当zset中最后一个元素移除后,就会被自动删除,内存被回收。

5 过期时间

  1. 所有的数据结构都可以设置过期时间,是以倒计时的方式,如果时间到了,整个对象就会被删除,内存被回收。
  2. 如果一个字符串设置了过期时间,但是又被调用set方法做了修改,那么她的过期时间会失效。

参考

  1. 电子工业出版社,钱文品 著,《Redis 深度历险:核心原理与应用实践》。

http://www.ppmy.cn/news/768910.html

相关文章

RabbitMQ学习(一):基本概念

文章目录 1 为什么使用RabbitMQ2 为什么RabbitMQ这么快3 AMQP介绍3.1 AMQP的核心概念3.2 AMQP分层: 4 RabbitMQ的整体结构4.1 结构图4.2 不同的交换机类型 5 相关命令5.1 服务相关命令5.2 用户相关命令5.3 虚拟主机相关命令5.4 队列相关命令5.5 集群相关命令 参考 1…

Redis如何备份与恢复数据

文章目录 1 数据持久化1.1 快照1.2 AOF1.3 混合持久化1.4 从节点持久化 1 数据持久化 Redis有自己的持久化机制,以防宕机后内存中的数据丢失。当宕机后,便从磁盘恢复内存数据结构。 1.1 快照 Redis是使用COW机制实现快照持久化。 第一步:…

RabbitMQ学习(三):高级特性

文章目录 1 生产端如何可靠地投递消息1.1 消息落库打标1.2 消息延迟投递,通过二次确认回调检查。 2 生产者确认(Confirm消息确认机制)3 消息的幂等性保障3.1 唯一ID 指纹码 机制3.2 利用Redis的原子性实现 4 Return消息机制5 消息的分发与消…

Spring事务的一些总结

文章目录 1 Transactional 注解特性2 事务的属性3 事务的嵌套4 事务超时设置5 Transaction注解不回滚的可能原因6 事务的基本要素(ACID)7 事务的原理8 数据并发问题9 数据库隔离级别10 Spring隔离级别11 底层所使用的不同的持久化API或框架 1 Transactional 注解特性 可以在整…

计算机科学与技术万金油专业,盘点工学大类里的“万金油”专业

原标题:盘点工学大类里的“万金油”专业 教育部2012年最新修订的本科生专业名录中把专业重新进行了从学科门类到专业类和专业的划分,共计12大学科门类,分别是理、工、农、医 ,管、教、文、艺 经、史、法、哲.92大专业类&#xff0…

程序员的浪漫(使用python画图)比心心(待完善版)

本人给女朋友准备的小惊喜,如有需要可以取用。(代码内有注释可根据需要更改) #比心!! import turtle # turtle.bgpic(D:/python/bjtp/aa.jpg) turtle.speed(10)#画笔速度 turtle.setup(1800,700,70,70) turtle.color(b…

一行代码解决判断IE浏览器和提示升级问题

IE8及以下版本提示升级&#xff08;使用IE9和旧版IE支持 if IE 条件注释语句实现&#xff09; <!--[if lte IE 8]><script>alert("您正在使用的浏览器版本过低&#xff0c;为了您的最佳体验&#xff0c;请先升级浏览器。");window.location.href"h…

win7 ie11版本安装报此更新不适用于计算机问题

IE版本升级需要KB2729094、KB2731771、KB2533623、KB2670838、KB2786081五个补丁安装 五个补丁需要根据计算机决定并下载&#xff0c;如&#xff1a;32位选x86 64位选X64 补丁安装时如果也出现了此更新不适用于计算机问题&#xff0c;可以在dos&#xff08;管理员身份&#xf…