Redis简述
-
即远程字典服务,使用ANSI C开发,支持网络、基于内存和可持久化的日志型、NoSQL(非关系型数据库)开源内存数据库,提供多种语言的API
-
这是一个key-value存储系统,支持String字符串,List链表,Set集合,Zest有序集合和Hash哈希等类型
-
非关系型数据库
-
键值存储数据库
如Map的K-V存储数据库,Redis等
-
列存储数据库
关系型数据库是典型的行存储数据库,其存储时占用连续的存储空间,不适合大量数据存储。按列存储可以实现分布式存储,适合大量存储,如HBase
-
文档型数据库
如MongoDB,是NoSql和关系型数据库的结合,把记录存储为JSON
-
图形数据库
用于存放数据节点间关系的数据库,如Neo4j
-
-
Redis的主要用途是数据缓存
- 当客户端高并发请求服务器,数据库可能导致高访问的性能瓶颈,此时需要加入缓存层来减少数据库的访问
- 缓存层和数据库和服务器交互,缓存层位于内存,而数据库是存储在磁盘上,导致缓存层可以有更高的并发性能
- 写请求不通过缓存层,直接与数据库进行交互,可能导致缓存数据失效
- 缓存数据分类:
- 实时同步数据:要求缓存中数据和DB中保持一致,如果数据库数据改变,缓存中对应数据立刻删除(失效)
- 阶段性同步数据:没有必要实时和数据库中保持同步,非关键信息。为缓存数据添加生存时长,超过一定时长就使得数据失效。可以在服务器warmup阶段加载这些关键的数据
- 缓存数据分类:
Redis特性
-
性能极高,读写速度超过11w次/s和8w次/s
- 数据操作完全在内存中
- 使用C语言开发
- 基于K-V键值对,查询快
-
可持久化,可以进行内存到磁盘的持久化,数据安全。使用RDB和AOF两种方式
-
高可用集群,提供了高可用的主从集群功能,保证系统的安全性和健壮性
-
丰富的数据类型,是一种key-value存储系统
- String字符串、List链表、Set集合、Zest有序集合、Hash哈希类型
- BitMap(大数据量的二值性统计)、HyperLogLog(超级日志记录,对大量数据进行去重统计)、Geospatial(地理空间,主要用于地理位置相关计算)
-
功能强大,如设置数据生存时长、发布/订阅(简单消息系统)、简单事务、支持Lua脚本
-
支持语言广泛,提供了简单的TCP通讯协议,编程语言可以简单接入Redis
-
支持ACL权限控制,自redis6开始引入,为不同用户定制不同权限
ACL,Access Control List,一种细粒度权限管理策略,可以针对任意用户与组进行权限控制(Unix和Linux2.6之后支持ACL)
UGO,User Group Other是Unix和Linux默认的权限管理,是一种粗粒度的权限管理
-
支持多线程IO模型,自redis6之后支持
Redis的IO模型
Redis客户端提交的请求是如何被Redis处理的,这种处理架构乘坐Redis的IO模型
单线程模型
Redis3.0之前,使用单线程模型,所有客户端的请求都是被一个线程处理的。经过事件分发器后,对应的请求被放置任务队列中,使用一个线程选择对应的事件处理器处理任务队列中的任务,采用了多路复用技术。单线程模型可以避免并发问题,但性能不高。
多路复用技术:多路复用器的多路选择算法常见有三种,select模型(数组实现)、poll模型(链表实现)和epoll模型。
- poll模型:采用轮询算法,依次查询列表中已就绪可以处理的任务并进行选择。完整寻找一次列表后选择可处理的任务处理,导致了处理任务的延迟
- epoll模型:采用回调模式,对每个列表中的任务设置回调函数,就绪后触发回调函数通知多路选择器将任务加入处理队列即可。可以分为LT模型和ET模型
混和线程模型
处理任务队列的线程进行fork,产生一些子线程来处理任务队列中的任务,但连接请求处理仍然是单线程。
多线程模型
多线程模型会将请求按照请求顺序均衡分配给多个事件分发器,通过多个对应的IO线程将任务解析后放入一个任务队列,使用一个主线程处理任务队列中的请求。相当于使用多线程解析事件请求的类型,而主线程只负责执行执行。
模型优缺点总结
- 单线程模型:
- 优点:可维护性高,没有并发操作带来的问题(执行顺序不确定,线程切换开销,加锁/解锁问题)
- 缺点:性能较低,不能利用多核
- 多线程模型:
- 优点:结合了单线程和多线程的优点
- 缺点:在主线程处理任务队列时仍是单线程,不能算作完全的多线程模型
Redis安装
-
下载Redis7 https://redis.io/download/
-
将 下载的压缩包放入linux服务器,一般放在opt目录下
-
解压压缩包
tar -zxvf redis-7.0.10.tar.gz
-
进入redis目录,在目录下执行编译和安装
make && make install
-
安装完成后,可以看到进行测试的提示 “Hint: It’s a good idea to run ‘make test’ 😉”
-
查看默认安装目录 /usr/local/bin 中的Redis工具
- redis-benchmark 性能测试工具,可以在服务启动后运行来测试服务器性能
- redis-check-aof 修复有问题的AOF文件
- redis-check-dump 修复有问题的dump.rdb文件
- redis-cli 客户端,操作入口
- redis-sentinel redis集群服务
- redis-server Redis服务器启动命令
-
配置Redis配置文件,在opt/redis/redis.conf,但是一般不直接修改默认配置,所以拷贝一份该文件到目录再修改
mkdir /myredis cp redis.conf /myredis/redis7.conf
- 修改daemonize no 为 yes,使得其在后台启动而不占用控制台
- 修改protected-mode yes 改为 no,使得本机外可以访问Redis
- 注释掉 bind 127.0.0.1 -::1,运行远程ip连接
- 取消requirepass的注释,并自行设置一下密码
-
启动Redis服务,因为修改了配置,所以启动时需要指定配置文件的目录,没有反应则可以查看是否启动了服务
redis-server /myredis/redis7.conf ps -ef | grep redis|grep -v grep
-
连接Redis服务,即可进入redis客户端
redis-cli -a password -p 6379
如果登录时没有指定密码,则需要在客户端中输入授权
auth password
-
使用ping来查看是否连接存活,如果返回PONG则成功连接;可以进行测试
127.0.0.1:6379> set k1 helloworld! OK 127.0.0.1:6379> get k1 "helloworld!"
-
关闭
-
单实例关闭,直接使用SHUTDOWN在cli中关闭Redis服务
-
多实例关闭(可能存在多个端口)
redis-cli -p 6379 shutdown
-
-
卸载
- 停止redis-server服务
- 删除 /usr/local/lib 下全部和redis相关的服务
图形客户端
-
Redis Desktop Manager (https://resp.app)
https://github.com/RedisInsight/RedisDesktopManager/releases/tag/0.8.8
-
RedisPlus
-
Java代码客户端
Java对应的API,类似JDBC,是多个对应的jar包,提供了对Redis的接口操作