什么是redis
1.Redis 是用C语言开发的一个开源的高性能键值对( key-value )内存数据库,它是一种NoSQL 数据库。
2.它是【单进程单线程】的内存数据库,所以说不存在线程安全问题。(ps:6.x版本为io多线程,工作线程单线程)
3.它可以支持并发 10W QPS,所以说性能非常优秀。因为底层采用了【IO多路复用(NIO思想)】
4.相比于同类产品memcache,更优秀的读写性能,及丰富的数据类型。
5.五种数据类型来存储【值】:字符串类型(string)、散列类型(hash)、列表类型(list)、集合类型(set)、有序集合类型(sortedset、zset)
redis应用场景
1.内存数据库(登录信息、购物车信息、用户浏览记录等)
2.缓存服务器(商品数据、广告数据等等)(最多使用)
3.解决分布式集群架构中的session 分离问题( session 共享)
3.任务队列(秒杀、抢购、12306等等)
4.分布式锁的实现
5.支持发布订阅的消息模式
6.应用排行榜(有序集合)
7.网站访问统计
8.数据过期处理(可以精确到毫秒)
reids安装(limux)
1.安装C语言需要的GCC 环境
yum install -y gcc-c++
yum install -y wget
2.下载并解压
wget http://download.redis.io/releases/redis-5.0.4.tar.gz
tar -zxf redis-5.0.4.tar.gz
3.编译redis源码
cd redis-5.0.4
make
4.安装
make install PREFIX=/redis
5.启动&关闭
#前端启动
./redis-server
#关闭
ctrl+c
=====================================================================
#后端启动(守护进程)
cp /redis-5.0.4/redis.conf /redis/bin/ 拷贝redis.conf
vim redis.conf
# 将`daemonize`由`no`改为`yes`
daemonize yes
# 是否开启保护模式,由yes该为no
protected-mode no
#启动服务
./redis-server redis.conf
#关闭服务
./redis-cli shutdown
6.其他命令
redis-server :启动redis 服务
redis-cli :进入redis 命令客户端
redis-benchmark : 性能测试的工具
redis-check-aof : aof 文件进行检查的工具
redis-check-dump : rdb 文件进行检查的工具
redis-sentinel : 启动哨兵监控服务
redis为什么快?
redis为了追求高性能,做了非常多的优化, 根据官方基测数据,redis的QPS可以达到10w。为了追求极致的快,redis的优化手段总结如下:
1.基于内存的实现
计算机各部分访问时间,如下图所示:
redis是基于内存实现的,读写都在内存中完成,操作不会因为磁盘IO速度的限制,速度非常快。
2.I/O 多路复用模型
Redis 采用 I/O 多路复用技术,并发处理连接。采用了 epoll + 自己实现的简单的事件框架。epoll 中的读、写、关闭、连接都转化成了事件,然后利用 epoll 的多路复用特性,绝不在 IO 上浪费一点时间。
它的基本原理是,内核不是监视应用程序本身的连接,而是监视应用程序的文件描述符。
Redis 线程不会阻塞在某一个特定的监听或已连接套接字上,也就是说,不会阻塞在某一个特定的客户端请求处理上。正因为此,Redis 可以同时和多个客户端连接并处理请求,从而提升并发性。
3.单线程模型
官方答案:因为 Redis 是基于内存的操作,CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。
Redis 的单线程指的是 Redis 的网络 IO 以及键值对指令读写是由一个线程来执行的。 对于 Redis 的持久化、集群数据同步、异步删除等都是其他线程执行。
优势:
-
不会因为线程创建导致的性能消耗;
-
避免上下文切换引起的 CPU 消耗,没有多线程切换的开销;
-
避免了线程之间的竞争问题,比如添加锁、释放锁、死锁等,不需要考虑各种锁问题。
-
代码更清晰,处理逻辑简单。
4.高效的数据结构
redis常用的5种数据类型与应用场景如下:
为了追求速度,redis设计了不同的数据结构来存储这些数据类型,底层数据结构主要有6种,它们和5种数据类型的关系如下:
Redis hash 字典
Redis 整体就是一个 哈希表来保存所有的键值对,无论数据类型是 5 种的任意一种。哈希表,本质就是一个数组,每个元素被叫做哈希桶,不管什么数据类型,每个桶里面的 entry 保存着实际具体值的指针。
整个数据库就是一个全局哈希表,而哈希表的时间复杂度是 O(1),只需要计算每个键的哈希值,便知道对应的哈希桶位置,定位桶里面的 entry 找到对应数据,这个也是 Redis 快的原因之一。
全局hash表冲突
1.全局hash表中采用链式hash:同一个桶里面使用链表保存
2.redis总共使用两个全局hash表:默认只使用其中一个表存数据,当数据量大时触发rehash:给另一个全局hash表申请更大空间,将数据重新映射到这个hash表中,释放先前那个hash表。
3.rehash过程不是一次性的,redis采用渐进式,将rehash分散到多次请求过程中(客户端请求时,先从 hash 表 1 中第一个索引开始,将这个位置的所有数据拷贝到 hash 表 2 中),避免长时间阻塞。
SDS 简单动态字符