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 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际是个双向链表&#x