Redis:K-V + Cache + Persistence(持久化)
简介
Redis(REmote DIctionary Server) 是一个开源的 key-value 存储系统。
用 C 语言编写的,遵守 BSD 协议,是一个高性能的(key/value) 分布式内存数据库,基于内存运行并支持持久化的 NoSQL 数据库,被称为"数据结构数据库"。
和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string(字符串)、list(链表)、set(集合)、zset(sorted set 有序集合)和 hash(哈希类型)。这些数据类型都支持 push/pop、add/remove 及取交集、并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis 支持各种不同方式的排序。
与 Memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是 Redis 会周期性地异步把更新的数据写入磁盘或者把修改操作写入追加的记录文件,同时不影响继续服务,并且在此基础上实现了 master-slave(主从) 同步。
应用场景
- 配合关系型数据库做高速缓存
- 由于其拥有持久化能力,利用其多样的数据结构存储特定的数据
安装步骤
- 下载 redis-3.2.5.tar.gz 后将它放入 Linux 目录 /opt
- 解压命令:
tar -zxvf redis-3.2.5.tar.gz
- 解压完成后进入目录:
cd redis-3.2.5
- 在 redis-3.2.5 目录下执行命令:
make
- 执行完
make
后,跳过make test
继续执行命令make install
运行 make 命令时出现故障意出现的错误解析:gcc 命令未找到,cc 未找到命令。
Redis 是编译安装型,C编写的。所以,能上网的直接:yum install gcc
,yum install gcc-c++
即可。若不能上网,则按照如下步骤执行 ↓
- 执行命令:
cd /run/media/root/CentOS 7 x86_64/Packages
- 在 ISO 文件中的 Packages 目录中找到如下 rpm 文件
- 在 opt 目录下创建 rpmgcc 目录,用于保存所有的 rpm 文件
- 进入 rpmgcc 目录中执行:
rpm -Uvh *.rpm --nodeps --force
-ivh
安装-Uvh
升级--nodeps
不检查依赖关系--force
强制安装
- 安装完成后使用如下命令查看版本
gcc -v g++ -v
- 在 redis-3.2.5 目录下再次执行
make
命令- 出现错误: Jemalloc/jemalloc.h 没有那个文件
- 解决方案:运行
make distclean
命令之后再make
启动客户端和服务端
查看默认安装目录
Redis-benchmark
性能测试工具,可以在自己本子运行,看看自己本子性能如何(服务启动起来后执行)Redis-check-aof
修复有问题的 aof 文件 (rdb 和 aof 是 2 种持久化方式)Redis-check-rdb
修复有问题的 rdb 文件redis-cli
客户端,操作入口Redis-sentinel
Redis 集群使用redis-server
Redis 服务器启动命令
启动 Redis 服务器
头一回启动服务的时候,默认是前台启动,占用当前进程。现在来设置后台启动:
- 备份 redis.conf:拷贝一份 redis.conf 到其他目录,如 /opt/myRedis
- 修改 redis.conf:将里面的
daemonize no
改成yes
,让服务在后台启动 - 根据自己的配置文件启动 Redis:
redis-server /opt/myRedis/redis.conf
启动 Redis 客户端
关闭服务器
除了 ps -ef | grep redis
直接 kill [pid]
以外的方式:
- 在命令行
- 单实例关闭:
redis-cli shutdown
- 多实例关闭(指定端口关闭):
redis-cli -p 6379 shutdown
- 单实例关闭:
- 在 Redis 服务端:
shutdown
相关知识
- 6379~Merz
- 默认 16 个数据库,类似数组下标从 0 开始,初始默认使用 0 号库。使用命令
select <dbid>
来切换数据库。如:select 8
- 统一密码管理,所有库都是同样密码,要么都 OK 要么一个也连接不上 // 没有用户,只有密码
- 串行 VS Memcached{多线程+锁} VS Redis{单线程+多路IO复用}
- Redis 是单线程 + 多路 IO 复用技术。其实的多路复用是指使用一个线程来检查多个文件描述符(Socket) 的就绪状态(起到"监视"效果),比如调用 select 和 poll 函数,传入多个文件描述符,如果有一个文件描述符就绪,则处理,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)。
- 简单理解