远程字典服务器(Remote Dictionary Server, Redis)是一款由ANSI C语言编写、遵守BSD协议、支持网络访问、基于系统内存的开源软件,同时,Redis也是支持日志型和Key-Value键值对类型数据持久化的数据库。由于Redis中存储的Value值类型可以是字符串(String)、哈希(HASH)、列表(List)、集合(Sets)和有序集合(Sorted Sets)等类型,因此Redis通常也被称为数据结构服务器。
与Memcache缓存系统类似,为了保证高效的数据存取效率,Redis的数据都被缓存在内存中,但是Redis与Memcache在处理数据存储方式上有很大的差异,即Redis默认会周期性地把缓存中更新的数据写入磁盘进行永久保存,并将对缓存数据的修改操作追加到日志文件中,由于Redis本质上就是一个基于内存的数据库,因此Redis具备很多如日志记录等通用数据库的共性。Redis为了实现数据高可用,其利用已存入磁盘中的数据在不同节点之间进行同步操作,从而实现了Master-Slave模式的主从数据高可用,Redis的数据可以从Master服务器向任意数量的Slave服务器上进行同步。
相对Memcache缓存,Redis还提供了更多的语言支持,包括对Java、C/C++/C#、PHP、JavaScript、Perl、Object-C、Python、Ruby和Erlang等语言客户端API的支持。Redis数据交换在Redis缓存系统中,并非所有通过Redis客户端写入的数据都永久性地存储在物理内存中,这是Redis和Memcache缓存系统最为明显的区别,Redis会定期性地将物理内存中的数据写入磁盘。
由于相对磁盘存储,内存空间极其有限,为此,Redis实现了用虚拟内存(VM,Virtual Memory)机制来扩充逻辑可用的内存空间,当Redis认为物理内存空间使用量达到某个预设值时,Redis将自动进行内存页的交换(Page Swap)操作,从而将缓存中的数据写入磁盘中。通常在部署使用Redis时候,会根据系统实际物理内存的大小为其设置一个物理内存使用阈值,如果Redis发现物理内存的使用量超过了这个阀值,将会触发Redis的Swap操作,在数据交换过程中,Redis会根据一定的算法(如最少使用算法LRU)计算出哪些Key对应的Value需要交换到磁盘,之后就将这些Key对应的Value持久化到磁盘中,同时在内存中将其清除。Redis的VM机制使得Redis可以存储超过系统本身物理内存大小的数据。
Redis最显著的功能特点之一便是数据持久化功能,在Redis节点重新启动之后,丢失的缓存数据会从磁盘重新加载或者从日志文件中重新恢复,这一功能非常类似于商业数据库软件(如DB2和Oracle)的日志恢复功能。针对两种不同的缓存数据恢复方式,Redis提供了两种数据持久化的方式,分别是Redis数据库方式(RDB, Redis DataBase)和日志文件方式(AOF, Append Only File)。RDB持久化方式就是将Redis缓存数据进行周期性的快照,并将其写入磁盘等永久性存储介质中,而AOF采用的是与RDB完全不一样的数据持久化方式
在AOF方式下,Redis会将所有对缓存数据库进行数据更新的指令全部记录到日志文件中,待Redis重新启动时,Redis将会把日志文件中的数据更新指令从头到尾重复执行一遍,这是一个重现数据变更的过程,当执行到日志文件末尾时即可实现缓存数据的恢复,AOF恢复方式与DB2数据库的redo日志回滚恢复方式原理类似。
这里重点讲解AOF持久化方式:
AOF是一种操作日志记录形式的持久化方式,并且AOF的记录日志文件只允许往后追加不允许改写已记录的条目。AOF持久化方式的原理,就是将Redis执行过的数据更新指令追加到日志文件中,并在数据恢复时按照先后顺序将指令都执行一遍,即再现一次数据的缓存过程,从而将数据恢复到故障点。
AOF方式的开启很简单,只需将Redis配置文件Redis.conf中的appendonly设置为yes就可以打开Redis的AOF持久化功能,在开启AOF之后,如果对Redis缓存发起写请求(如SET命令),则Redis就会将SET命令作为一个新的记录追加到AOF文件的末尾。默认情况下,AOF持久化策略每秒进行一次日志文件的追加操作,并将缓存中的写指令记录到磁盘AOF文件中,因此,在默认AOF持久化情况下,当Redis故障恢复时,也仅有将近1秒钟的数据丢失。
Redis的两种持久化方式各有优缺点,用户可以选择其中一种进行Redis缓存数据的持久化,也可以同时使用RDB和AOF持久化数据,Redis官方推荐用户同时使用RDB和AOF。RDB的优点在于周期性批量进行持久化,恢复时只需将快照文件读入内存,因此恢复过程快速简单,但是由于存在快照周期,RDB方式很难保证数据恢复的完整性。与RDB相比,AOF方式在数据恢复的完整性上要高很多,但是在同等数据规模的情况下,AOF方式在数据恢复时,由于要重现日志文件中记录的全部操作,其恢复速度比RDB方式要慢很多。
在Redis的数据交换过程中,由于Redis会将部分Key对应的Value通过Swap操作写入磁盘中,因此当命中的Key所对应的Value未存储在物理内存中时,Redis就要通过Swap操作将数据从磁盘读回物理内存,然后再响应客户端请求。而在这种情况下,通常会出现I/O线程池的问题,默认情况下,Redis会使用阻塞方式来使I/O请求等待Swap操作将全部所需的Value数据块读回内存,然后才进行下一步操作,Redis的这种阻塞策略在少量客户端和批量操作情况下并无太大问题,但是在大型并发网站中,尤其是在大量并发随机小数据块请求的情况下,如果有很多命中Key对应的Value值都没有存储在物理内存中,则Redis的阻塞响应机制必然导致整个网站的访问请求极为缓慢,通常这种情况下必须设置Redis的运行I/O线程池,从而使得Redis并发进行磁盘到物理内存的数据读回操作,从而减少请求I/O的阻塞时间,提高网站的访问速率。
这里已经下载下来,只需要共享出来,就可以使用。
# systemctl stop firewalld
# setenforce 0
# yum install gcc gcc-c++ make -y 官网下载redis5.0.7版本(已下载)
# smbclient -L //192.168.100.1/ 查看windows共享的文件
# mount.cifs //192.168.100.1/share /mnt 把共享文件挂载到linux的/mnt目录下
# cd /mnt
# tar zxvf redis-5.0.7.tar.gz -C /opt
# cd /opt/redis-5.0.7
# make
# make PREFIX=/usr/local/redis/ install
# ln -s /usr/local/redis/bin/* /usr/local/bin
# cd /opt/redis-5.0.7/utils/
# ./install_server.sh
一路回车
Please select the redis executable path [ ] 后写: /usr/local/redis/bin/redis-server 扩展路径
回车
# netstat -ntap | grep 6379
/etc/init.d/redis_6379 stop 关闭redis
/etc/init.d/redis_6379 start 启动redis
/etc/init.d/redis_6379 restart 重启redis
/etc/init.d/redis_6379 status 查看redis状态
# redis-cli --连接本机 Redis 数据库
127.0.0.1:6379> ping --检测 redis 服务是否启动
PONG
远程主机连接数据库,需要在配置文件中添加监听地址
# vim /etc/redis/6379.conf
/bind 查找
在bind 127.0.0.1 后添加 192.168.195.128
# /etc/init.d/redis_6379 restart 重启
# redis-cli -h 192.168.188.136 -p 6379 登录redis客户端
-h 指定远程主机、 -p 指定 Redis 服务的端口号、 -a 指定密码
若不添加任何选项表示,连接本机上的Redis数据库
若未设置数据库密码可以省略-a选项
192.168.100.41:6379> info 查看 redis 服务的统计信息
192.168.100.41:6379> exit “exit” 或“quit” 命令即可返还原来的Shell环境
使用 help 命令可以获取命令类型的帮助, 其中 有三种获取命令帮助的方式
help @\: 获取中的命令列表
help \: 获取某个命令的帮助
help \: 获取可能帮助的主题列表
如:
127.0.0.1:6379> help @list 查看所有与 List 数据类型的相关命令
127.0.0.1:6379>help set 查看 set 命令的命令帮助
Redis 数据库采用 key-value(键值对) 的数据存储形式
●set: 存放数据, 基本的命令格式为: set key value
●get: 获取数据, 基本的命令格式为: get key
如执行” set teacher zhanglong”, 表示在当前数据库下存放一个 key 为 teacher, value 为 zhanglong 的数据, 执行“get teacher“命令即可查看刚才存放的数据
使用 keys 命令可以取符合规则的键值列表, 通常情况可以结合 * ? 等选项来使用
type 命令可以查看 key 对应的 value 值的类型
rename 命令是对已有 key 进行重命名,无论目标 key 是否存在都进行重命名,且源 key 的值会覆盖目标 key 的值,并且源key的值不存在了。 在实际使用过程中,建议先用 exists 命令查看目标 key 是否存在, 然后再决定是否执行 rename 命令, 以避免覆盖重要数据。
renamenx 命令是对已有 key 进行重命名, 并检测新名是否存在。
其命令格式与rename 的命令格式 除命令关键字不同外 基本相同。
使用renamenx 命令进行重命名时, 如果目标 key 存在则不进行重命名
Redis 支持多数据库, Redis 在没有任何改动的情况下默认包含 16 个数据库, 数据库名
称是用数字 0-15 来依次命名的。
Select 命令可以进行 Redis 的多数据库之间的切换,而使用 redis-cli 连接 Redis 数据库后, 默认使用的是序号为 0 的数据库。 提示符中则不显示序号, 如“127.0.0.1:6379>” 表示当前使用的是序号为 0 的数据库。使用 select 命令切换数据库后, 会在前端的提示符中显示当前所在的数据库序号,如“127.0.0.1:6379[10]>” 表示当前使用的是序号为 10 的数据库。
Redis 的多数据库在一定程度上是相对独立的, 例如在数据库 0 上面存放的 k1 的数据,
在其它的 1-15 的数据库上是无法查看到的。
Redis 数据库提供了一个 move 的命令, 可以进行多数据库间的数据移动。
命令的基本语法格式为” move key dbindex“。
其中“key“表示当前数据库的目标键,“dbindex “表示目标数据库的序号。
数据清空操作比较危险!!! 生产环境下不建议使用!!!
Redis 数据库的整库数据删除主要分为两个部分:
清空当前数据库数据,使用 FLUSHDB命令实现;
清空所有数据库的数据,使用 FLUSHALL 命令实现。
这里就不演示了。