Redis 超详细总结

Redis 总结

作者:pox21s

1.NoSQL

NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。

NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。

  • 不遵循SQL标准

  • 不支持ACID

    Redis 自带原子性,后面会展开

  • 远超于SQL的性能

    读写性能优异:读11万、写8万(秒)

2.Redis 简介

2.1 概述

  • 几乎覆盖了 Memcached 的绝大部分功能

  • 数据都在内存中,支持持久化,主要用作备份恢复

  • 除了支持简单的 key-value 模式,还支持多种数据结构的存储,比如 list、set、hash、zset等。

  • 一般是作为缓存数据库辅助持久化的数据库

NoSQL 数据库的作用主要在于做热点数据缓存,减小类似 MySQL 关系型数据库的压力。

2.2 优点

  • 性能优异

    • 采用单线程设计,避免上下文切换和竞争条件

    • 完全基于内存

    • 数据结构简单

    • 使用多路 I/O 复用模型,非阻塞 IO

      IO 多线程其实指客户端交互部分的网络 IO 交互处理模块多线程,而非执行命令多线程。Redis 执行命令依然是单线程。

  • 支持持久化数据

    Memcached 不支持持久化

  • 支持事务

    所有的操作都是原子性、支持多个命令合并打包的原子执行(不支持回滚,后续展开)

  • 支持多做数据结构

  • 支持主从复制

  • 高性能:将用户访问的数据存在缓存中

  • 高并发:将数据库中部分数据移到缓存中

2.2.1 补充 - Redis 单线程 + 多路 IO 复用技术

Redis 的底层采用Nio中的多路IO复用的机制,能够非常好的支持这样的并发,从而保证线程安全问题。

Redis 单线程,也就是底层采用一个线程维护多个不同的客户端 IO 操作。但是 Nio 在不同的操作系统上实现的方式有所不同,在我们 windows 操作系统使用 select 实现轮训时间复杂度是为o(n),而且还存在空轮训的情况,效率非常低,其次是默认对我们轮训的数据有一定限制,所以支持上万的 tcp 连接是非常难。

所以在 linux 操作系统采用 epoll 实现事件驱动回调,不会存在空轮训的情况,只对活跃的 socket 连接实现主动回调这样在性能上有大大的提升,所以时间复杂度是为o(1)。

所以为什么 nginx、redis 都能够非常高支持高并发,最终都是 linux 中的 IO 多路复用机制 epoll,Redis 底层采用 nio epoll 实现。

注:windows操作系统是没有epoll,只有linux系统才有epoll

2.3 缺点

  • 受物理内存限制,不能作为海量数据高速读写
  • 不具备自动容错和恢复功能,主从机的宕机都会导致部分请求的失败
  • 主机宕机前,部分数据未同步从机,会引起数据不一致和数据丢失的问题
  • 在线扩容比较难

2.4 应用场景

  • 计数器
  • 缓存(内容可以失效)
  • 数据库缓存、会话缓存、全网页缓存(FPC)
  • 查找表(内容不能失效)
  • 消息队列(订阅/发布功能)
  • 分布式锁
  • redis支持的setnx实现分布式锁
  • 官方推荐的RedLock分布式锁

2.5 数据类型

2.5.1 基本数据类型
  • 字符串、整数、浮点数(String)

    对字符串或字符串部分进行操作;对数据可以进行自增减操作

  • 列表(List)

    从两端压入或弹出元素;对单个或多个进行修剪操作;保留一定范围的元素

  • 集合(Set)

    添加、获取、移除单个元素,检查一个元素是否存在,计算交、并、差集计算,在集合里面随机获取元素

  • 散列表(Hash)

    添加、获取、移除、单个键值对;获取所有键值对;检查某个键是否存在

  • 有序集合(ZSet)

    添加、获取、删除元素;根据分值范围或成员获取元素;计算一个键的排名

2.5.2 特殊数据类型
  • 地理位置(geospatial)
  • HyperLogLog 是用来做基数统计的算法
  • 位存储(bitmaps)
  • 发布和订阅

2.6 持久化

  • RDB
  • AOF
2.6.1 RDB (redis database缩写快照)

按照一定的时间将内存数据以快照的形式保存到硬盘中,采用写时复制技术。

1.优点
  • 只有一个 dump.rdb 文件,方便持久化

  • 容灾性好,一个文件可以保存在安全磁盘

  • 性能最大化,子进程完成数据备份,不影响主进程

  • 数据集大时比AOF恢复快

  • 性能比 AOF 好

2.缺点

数据安全性低,隔一段时间备份会有数据丢失的问题

2.6.2 AOF(append only file)

将redis执行的每次命令放到一个日志文件中记录;当开启两种方式备份时,优先使用AOF恢复数据。

1.优点
  • 数据安全,可以做到记录备份每一条数据
  • rewrite 模式会对过大的文件进行合并重写,删除其中的某些命令
  • 比 RDB 方式更安全
2.缺点

AOF文件比RDB文件大,数据恢复启动时慢。

3.基本数据类型详解

指令查询:http://www.redis.cn/commands.html

3.1 Redis字符串(String)

3.1.1 概述
  • String是Redis最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value

  • String类型是二进制安全的。意味着 Redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象

  • String类型是Redis最基本的数据类型,一个 Redis 中字符串value最多可以是512M

3.1.2 数据结构

String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于 Java 的 ArrayList ,采用预分配冗余空间的方式来减少内存的频繁分配。

如图中所示,内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度。**当字符串长度小于 1M 时,扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M的空间。**需要注意的是字符串最大长度为 512M。

3.2 Redis 列表(List)

3.2.1 概述

单键多值,Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值