redis是一款开源的内存数据结构存储
,用作数据库,缓存,消息中间件
,支持多种数据结构,如:strings,hashes,lists,sets,带有范围查询的sorted sets ,bitmaps,hyperloglogs,带有半径查询的geospatial Indexes,和stream;
Redis内置了的主从复制,事务,以及不同级别的持久化功能,
并通过Sentinel和自动分区的Cluster提供了高可用性
;
在redis中可以对这些类型进行原子操作(线程安全)
;
为了获得优秀的性能,redis把数据存储在内存
中,根据实际情况你可以每隔一段时间将数据转存至磁盘或者追加每一个操作指令到log中,来实现持久化;如果只需要用于内存缓存,你可以禁用持久化;
redis还支持异步主从复制和非常快的非阻塞的首次同步,自动重连和部分数据重新同步在遇到网络分裂(异常)时;
Redis使用c编写,可以运行于绝大多数POSIX系统上,例如 Linux,OS X,BSD,而且不需要任何的外部依赖,Linux和OS X是Redis开发和测试最多的两个操作系统,建议使用LInux系统部署,Windows版本没有官方支持。
官网:https://redis.io
可以看出redis和mysql有非常大的区别,主要体现在数据结构
和存储方式
上。
mysql是关系型数据库,存储数据前必须明确定义表结构和数据类型
,数据之间可以存在关联关系,
而redis中并不需要提前定义数据模型,随时可以添加新的结构到数据库中,redis也不能维护数据间的关系;
非关系型数据库优势:
这里不得不提到的一个名称就是NoSQL,NoSQL有两种含义
No Relations和Not Only SQL,通常我们谈及NoSQL都是泛指非关系型数据库,即数据之间没有关系;
NoSQL伴随着web2.0开始崛起,web2.0时代(要处理大规模的数据,且经常存在非结构化的数据)传统数据库表现的力不从心,而且出现一系列难以攻克的问题;
redis是单线程:客户端所有对数据的操作都会交给数据操作线程来处理,保证了线程安全,避免了加锁和解锁带来的效率影响。
效率的高低,取决于是否充分利用了CPU;通常情况下,之所以效率低是因为没有处理好IO操作。
对于连接并不是单线程,
通过对比可以发现NoSQL和关系型数据库各自有各自的优缺点,那么在实际运用中该如何选择呢?
一定要强调的是,两者不是非此即彼的关系,而是优势互补
通常我们把项目的关键数据(必须需要保证ACID)放在关系型数据库中
而对于一些临时的,非关键性的,访问频率非常高的数据放在NoSQL中;
另外Redis也经常用于消息中间件;
windows下使用VMare安装CentOS7:链接
CentOS 7下安装Redis:链接
上述两链接转自:bing_bg
直接运行bin/redis-server
将以前端模式启动,
前端模式启动的缺点是:
在redis的旧版本中ssh命令 窗口关闭则redis-server程序结束
最新版的redis并不会因为ssh连接的关闭而关闭,但是还是会占用ssh连接,故此不推荐使用此方法。如下图:
以守护进程模式启动的话需要 redis.conf
配置文件。在配置文件中设置redis 的启动模式。从 redis源码目录 redis-5.0.7 中复制 redis.conf 文件到 /usr/local/redis/bin
目录下,然后修改其中的配置信息:
daemonize yes
将 no 改为 yes 启动redis时,指定使用的配置文件:
> ./redis-server redis.conf
这样redis就以守护进程模式启动了。
上述两种模式都需要:[root@localhost ~]# cd /usr/local/redis/bin
下面是守护进程模式启动过程
#进入bin目录
cd /usr/local/redis/bin
#启动redis
[root@localhost bin]# ./redis-server redis.conf
#利用客户端连接测试
[root@localhost bin]# ./redis-cli -h 192.168.10.131 -p 65533
192.168.10.131:65533>
#看见如下内容表示已经服务端已经正常运行
1.如果是前端方式启动的服务只需要ctrl+c
即可关闭服务器端
2.后台进程模式,需要通过redis-cli
客户端来关闭
#关闭运行在localhost上的redis服务
./redis-cli shutdown
#关闭运行在指定地址上的redis服务
./redis-cli -h 192.168.10.131 -p 65533 shutdown
3.强制停止,通过kill命令直接强行结束redis服务端进程,该方式存在不稳定性,生产环境勿用
#查询进程id
ps aux|grep redis
#根据进程id结束服务
kill 进程id
redis-cli连接服务器
语法: redis-cli -h 主机地址 -p 端口
其中主机地址和端口号均可省略 默认主机为localhost
,默认端口为:6379
yum软件包管理器自带的 yum install xxx
安装下载工具wget
rm 删除
ls或ll查看
make==javac
cp
kill 进程编号
./redis-cli -h -p shutdowm
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
string 是 redis 最基本的类型,你可以理解成与Map中的一模一样的数据类型,一个 key 对应一个value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。存储的任何内容都不会被做任何的转译
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其他类型,相当于一个key对应一个map,如下图所示:
hash类似于java的对象
redis列表是简单的字符串列表,按照插入顺序排序
。
你可以添加一个元素到列表的头部(左边)或者尾部(右边),一个列表最多可以包含2^32 - 1个元素(4294967295,每个列表超过40亿个元素)
可以通过list来实现栈(先进后出,例如方法嵌套调用、递归)和队列(先进先出)
对于list类型,如果push和pop在同一向进行,就可以实现栈
如果push和pop是在相反方向,则可以实现队列redis作为消息队列,也是通过list来实现的
redis的set是String类型的无序集合。集合成员是唯一、无序的。
redis中集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1)。
集合中最大的成员数是2^32 - 1(4294967295)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。
redis正是通过分数来为集合中的成员进行从小到 大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。
由于SortedSet所有的命令都是以 Z 开头所以SortedSet也叫做 zset 。
切换数据库:select [index]
192.168.10.131:65533> select 1
OK
查看当前数据库中的key:keys [partten]
192.168.10.131:65533> keys *
redis提供了两种不同的持久化方式
RDB持久化会按照指定的时间间隔为数据创建快照并写入磁盘
AOF持久化会记录服务器接收到的每一个写数据指令到文件中,这些指令将在服务器重启时进行重放,以此来重建原始数据,AOF产生的命令格式与redis本身的命令格式完全相同,并采用仅追加的方式,日志文件太大时,redis会在后台重写日志
如果希望数据仅在redis运行期间有效,则可以完全禁用持久化来使效率最大化
优点
缺点
然后输入:/save 900快速定位
上图中的:
save 900 1
save 300 10
save 60 10000
是一个个的保存点,第一个数字为时间间隔,第二个为操作次数。当二者全部满足则更新快照。频率太高影响性能,太低丢失数据,需要按照实际情况合理设置
保存点可以配置多个,如默认配置,更新快照的频率随着数据操作频率的增长而增长,可以尽可能的减少数据丢失,同时在数据操作频率低的时候,减少快照的更新操作。
优点
使用AOF时redis能提供更好的持久化,尽可能的减少数据丢失。可使用不同的fsync(文件同步)策略包括:完全没有fsync,每秒fsync,每个查询fsync。使用默认策略(每秒)时,每秒的写入性能仍然很好;
AOF日志是仅追加的日志,即使断电也不会损坏文件,即使由于某种原因意外停止,导致写入残缺指令,redis-check-aof工具也能修复日志文件
AOF文件过大时,redis会在后台重写AOF。重写是安全的,redis会继续追加指令到旧的文件,同时根据当前数据生成重建所需的精简指令,当第二个文件准备好后redis会切换到新的日志文件并开始追加新文件
AOF文件的指令格式非常简单,可以轻松的导出AOF,就像导出SQL一样简单,可以轻松的通过AOF文件恢复数据。例如错误的执行了删除所有数据的指令,只要重写操作没有触发,只需要删除最后的语句重启redis
缺点
对于同样的数据,AOF文件通常大于等效的RDB文件
根据具体的fsync策略,AOF可能比RDB慢。(通常,在将fsync设置为每秒的情况下,性能仍然很高,在禁用fsync的情况下,即使在高负载下,它也与RDB一样快)虽然如此,在巨大的写负载的情况下,RDB仍然能够尽可能的保证最大延迟
配置
启用AOF:
默认情况下AOF是禁用的,配置文件第1038行,将no修改为yes
文件同步策略
分别是
每执行一个写操作立马写入文件并完成磁盘同步
每隔一秒将写操作写入文件并完成磁盘同步
将写操作指令写入后,等待操作系统自动完成磁盘同步
AOF文件重写配置,配置文件1110行:
auto-aof-rewrite-percentage 100 #达到原始文件多少比例
auto-aof-rewrite-min-size 64mb #最小重写大小
AOF文件不完整(写入过程中意外关闭)时是否允许启动,配置文件1135行
aof-load-truncated yes
通常情况下AOF完整度是比RDB高的,所以重启后读取文件时,AOF优先于RDB;
另外当你对配置文件非常熟悉时完全可以创建一个空文件,添加需要修改的配置即可;