redis

Redis是什么?

Redis是NoSQL数据库。Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:

  • 基于内存运行,性能高效
  • 支持分布式,理论上可以无限扩展
  • key-value存储系统
  • 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

相比于其他数据库类型,Redis具备的特点是:

  • C/S通讯模型
  • 单进程单线程模型
  • 丰富的数据类型
  • 操作具有原子性
  • 持久化
  • 高并发读写
  • 支持lua脚本

应用场景

缓存系统("热点"数据:高频读、低频写)、计数器、消息队列系统、需要高速读/写的场合使用它快速读/写(排行榜、社交网络和实时系统,);

redis数据类型

Redis提供的数据类型主要分为5种数据类型:String类型、哈希类型、列表类型、集合类型和顺序集合类型。 Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类型的数据结构的差异就在于 value 的结构不一样。

压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,Redis就会使用压缩列表来做列表键的底层实现

string类型

是一个二进制安全的字符串不仅能够存储字符串、还能存储图片、视频等多种类型, 最大长度支持512M。String类型的数据结构存储方式有三种int、raw、embstr

C语言 char[] 的四个问题

  • 字符数组必须先给目标变量分配足够的空间,否则可能会溢出
  • 查询字符数组长度 时间复杂度O(n)
  • 长度变化,需要重新分配内存
  • 通过从字符串开始到结尾碰到的第一个\0来标记字符串的结束,因此不能保存图片、音频、视频、压缩文件等二进制(bytes)保存的内容,二进制不安全

redis SDS

  • 不用担心内存溢出问题,如果需要会对 SDS 进行扩容
  • 因为定义了 len 属性,查询数组长度时间复杂度O(1) 固定长度
  • 空间预分配,惰性空间释放
  • 根据长度 len来判断是结束,而不是 \0

Hash:哈希表 类型

该类型是由field和关联的value组成的map。其中,field和value都是字符串类型的。

Hash对象的实现方式有两种分别是ziplist、hashtable

在Redis中,当散列中存储的键值对较少时,会使用「压缩列表」(ziplist)来节省空间。随着键值对数目增加或键和值的大小增长到一定程度时,Redis 会自动将其底层数据结构转换为一个真正的哈希表来提高性能。

List:列表类型

该类型是一个插入顺序排序的字符串元素集合, 基于双链表 实现。在3.2之前的版本是使用ziplistlinkedlist进行实现的。Redis 3.2 版本引入了快速列表(quicklist)来替代纯粹的双向链表

快速列表是压缩列表(ziplist)和双向链表的混合体,它将多个压缩列表组合在一起形成一个双向链表,既保证了良好的内存利用也保留了 List 类型的特性。

Set:无序集合类型

Set类型是一种无顺序集合, 它和List类型最大的区别是:集合中的元素没有顺序, 且元素是唯一的。Set类型的底层 是通过哈希表实现的。

ZSet:顺序集合类型:

ZSet是一种有序集合类型,每个元素都会关联一个double类型的分数权值,通过这个权值来为集合中的成员进行从小到大的排序。ZSet的底层实现是ziplistskiplist(跳跃表)实现的

  1. 跳跃表(SkipList):是一种有序的数据结构,支持插入、删除、搜索等操作。跳跃表可以保持有序集合元素的排序状态,同时它的插入、删除、查询的时间复杂度为O(log N)。跳跃表是由多层链表组成,每一层链表都存储着同样的有序元素。在跳跃表中查找数据时,首先从顶层链表开始,按照下层链表的指针逐层查找。跳跃表的有效性来自于可以快速地跳过一部分数据,从而降低查找时间复杂度。

  2. 散列表(HashTable):是一种常用的查找和存储数据结构,在Redis中,散列表用于存储有序集合的元素及其分数。散列表提供了O(1)的时间复杂度,用于快速查找、添加和删除操作。

redis特性

Redis特性1:事务

  • 命令序列化,按顺序执行
  • 原子性
  • 三阶段: 开始事务 - 命令入队 - 执行事务
  • 命令:MULTI/EXEC/DISCARD

Redis特性2:发布订阅(Pub/Sub)

  • Pub/sub是一种消息通讯模式
  • Pub发送消息, Sub接受消息
  • Redis客户端可以订阅任意数量的频道
  • "fire and forgot", 发送即遗忘
  • 命令:Publish/Subscribe/Psubscribe/UnSub

高速读/写的场合

  1. 当一个请求到达服务器时,只是把业务数据在 Redis 上进行读写,而没有对数据库进行任何的操作,这样就能大大提高读写的速度,从而满足高速响应的需求
  2. 但是这些缓存的数据仍然需要持久化,也就是存入数据库之中,所以在一个请求操作完 Redis 的读/写之后,会去判断该高速读/写的业务是否结束 ,如果结束,则触发事件将 Redis 的缓存的数据以批量的形式一次性写入数据库,从而完成持久化的工作。

参考:https://zhuanlan.zhihu.com/p/148562122

相关推荐
卷Java8 小时前
Python字典:键值对、get()方法、defaultdict,附通讯录实战
开发语言·数据库·python
wanhengidc8 小时前
跨境云手机适用于哪些场景
大数据·运维·服务器·数据库·科技·智能手机
Bdygsl9 小时前
MySQL(6)—— 视图
数据库·mysql
oradh9 小时前
数据库入门概述
数据库·oracle·数据库基础·数据库入门
BullSmall9 小时前
一套定制化高级 payload 合集
数据库·安全性测试
zbdx不知名菜鸡9 小时前
postgre sql 数据库查询优化
数据库·postgresql
9稳9 小时前
基于PLC的生产线自动升降机设计
开发语言·网络·数据库·嵌入式硬件·plc
四七伵10 小时前
Spring Boot项目中varchar字段为什么不用NULL?告别空指针从建表开始
数据库·后端
Mr.456710 小时前
JDK17+Druid+SpringBoot3+ShardingSphere5 多表分库分表完整实践(MySQL+PostgreSQL)
java·数据库·spring boot·mysql·postgresql
Elastic 中国社区官方博客10 小时前
使用 ES|QL 变量控件将仪表板转变为调查工具
大数据·运维·服务器·数据库·elasticsearch·搜索引擎·全文检索