- 相关产品:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
- 典型应用:内容缓存,主要用于处理大量数据的高访问负载
- 数据模型:一系列键值对
- 优势:快速查询
- 劣势:存储的数据缺少结构化
- 相关产品:Cassandra、HBase、Riak
- 典型应用:分布式的文件系统
- 数据模型:以列簇存储,将同一列数据存在一起
- 优势:查找速度快,可扩展性强,更容易进行分布式扩展
- 劣势:功能相对局限
- 相关产品:CouchDB、MongoDB
- 典型应用:Web应用(与Key-Value类似,Value是结构化的)
- 数据模型:一系列键值对
- 优势:数据结构要求不严格
- 劣势:
- 相关产品:Neo4J、InfoGrid、Infinite Graph
- 典型应用:社交网络
- 数据模型:图结构
- 优势:利用图结构相关算法
- 劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案
yum install -y gcc-c++
yum install -y wget
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar -zxf redis-3.2.9.tar.gz
cd redis-3.2.9
make
make install PREFIX=/usr/local/server/redis
* redis-server:启动redis服务
* redis-cli:进入redis命令客户端
* redis-benchmark:性能监测工具
* redis-check-aof:aof文件进行检查的工具
* redis-check-rdb:rdb文件进行检查的工具
* redis-sentinel:启动哨兵监控服务
cp redis.config /usr/local/server/redis/bin
vim redis.conf
# 将`daemonize` 由 no 改为 yes
daemonize yes
# 默认绑定的是回环地址,默认不能被其他机器访问
# bind 127.0.0.1
# 是否开启保护模式,由 yes 改为 no
protected-mode no
./redis-server redis.conf
./redis-cli shutdown
./redis-cli -h 127.0.0.1 -p 6379
* -h:redis服务器的IP地址
* -p:redis实例的端口号
./redis-cli
官方命令大全网址:http://www.redis.cn/commands.html
Redis中存储的数据是通过key-value格式存储数据的,其中value可以定义五种数据类型:
注意事项
- 当value为整数数据时,才能使用以下命令操作数值的增减
- 数值增减都是【原子】操作
- redis中的每一个单独的命令都是原子性操作。当多个命令一起执行的时候,就不能保证原子性,不过我们可以使用事物和lua脚本来保证这一点
使用该命令可以实现分布式锁的功能
hash类型也叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其他类型。如下:
HSET命令不区分插入和更新操作,当执行插入操作时,返回值1;当执行更新操作时,返回0
可以删除一个或多个字段,返回值是被删除的字段个数
hash类型适合存储那些对象信息,特别是对象属性经常发生【增删改】操作的数据。string类型也可以存储对象数据,将java对象转成json字符串进行存储,这种存储适合【查询】操作
- 当 count>0 时,LREM会从列表左边开始删除;
- 当 count<0 时,LREM会从列表右边开始删除;
- 当 count=0 时,LREM删除所有值为value的元素
* 用户针对某一商品发布评论,一个商品会被不同的用户进行评论,存储商品评论时,要按时间顺序排序
* 用户在前端页面查询该商品的评论,需要按照时间降序排序
集合类型 | 列表类型 | |
---|---|---|
存储内容 | 至多2^32-1个字符串 | 至多2^32-1个字符串 |
有序性 | 否 | 是 |
唯一性 | 是 | 否 |
* 二者都是有序的
* 二者都可以获得某一范围的元素
* 列表类型是通过链表实现的,获取靠近两端的数据速度极快、而元素增多后,访问中间数据的速度会变慢
* 有序集合类型使用散列表实现,所以即时读取位于中间部分的数据也很快
* 列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改分数实现)
* 有序集合要比列表类型更耗内存
- ZRANGE:按照元素分数从小到大的顺序返回索引从 start 到 stop 之间的所有元素(包含两端的元素)
- ZREVRANGE:按照元素分数从大到小的顺序返回索引从 start 到 stop 之间的所有元素(包含两端的元素)
- ZRANK:从小到大
- ZREVRANK:从大到小
原理:使用list类型的 LPUSH 和 RPOP 实现消息队列:
注意事项:
subscribe yw-channel
publish yw-channel "hello,everyone!!!"
Redis不支持事务回滚(为什么?)
- 大多数事务失败是因为语法错误或者类型错误,这两种错误在开发阶段都是可以预见的
- Redis为了性能方面就忽略了事务回滚
Redis是一个内存数据库,为了保证数据的持久性,他提供了两种持久化方案
特别说明:
Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存
根据数据量大小与结构和服务器性能不同,这个快照条件也需要不同。通常将记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需要花费20 ~ 30秒钟。
1. RDB持久化条件
save 900 1 :表示15分钟内至少1个键被更改则进行快照
save 300 10 :表示5分钟内至少10个键被更改则进行快照
save 60 1000:表示1分钟内至少1000个键被更改则进行快照
2. 配置dir指定rdb快照文件的位置
# Note that you must specify a directory here, not a file name.
dir ./
3. 配置dbfilename指定rdb快照文件的名称
# The filename where to dump the DB
dbfilename dump.rdb
* Redis调用系统中的 fork 函数复制一份当前进程的副本(子进程)
* 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件
* 当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此,一次快照操作完成
* Redis在进行快照的过程中不会修改 RDB 文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候 RDB 文件都是完整的。
* 这就使得我们可以通过定时备份 RDB 文件来实现 Redis 数据库备份,RDB 文件是经过压缩的二进制文件,占用的空间会小于内存中的数据,更加利于传输
# 可以通过修改redis.conf配置文件中的appendonly参数开启
appendonly yes
# AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的
dir ./
# 默认的文件名是appendonly.aof,可以通过appendfilename参数修改
appendfilename appendonly.aof
# 每次执行写入都会进行同步,这个是最安全但是效率比较低的方式
appendfsync always
# 每一秒执行(默认)
appendfsync everysec
# 不主动进行同步操作,由系统区执行,这个是最快但是最不安全的方式
appendfsync no
# 表示当前AOF文件大小超过一次aof文件大小的百分之多少的时候会进行重写。如果之前没有重写过,已启动时aof文件大小为准
auto-aof-rewrite-percentage 100
# 限制允许重写最小aof文件大小,也就是文件大小小于64MB的时候,不需要进行优化
auto-aof-rewrite-size 64mb
- 为现有的 AOF 文件创建一个备份
- 使用 Redis 附带的 redis-check-aof 程序,对原来的 AOF 文件进行修复:
redis-check-aof --fix readonly.aof
- 重启 Redis 服务器,等服务器载入修复后的 AOF 文件,并进行数据恢复
# 禁止RDB方式
save ""