Redis基于内存运行,并支持持久化,会将数据存入硬盘存储,Redis采用key-value(键值对)的存储形式。
Redis的优点
关系型数据库 | 非关系型数据库 |
---|---|
包括Oracle 、MySQL、SQL Server、Microsoft Access、DB2 等 | 包括Redis、MongDB、Hbase、CouhDB等 |
存储标准数据结构(int,float,double,char) | 存储类型一般为string |
数据库名称可以自定义 | 数据库名不能自定义,Redis默认(0-15)16个子数据库 |
存在表结构、主键、外键 | 只有键值对 |
面向记录 | 满足数据库高并发、海量数据吞吐、高可扩展性与高可用性要求 |
解压安装包,并编译
[root@redis1 ~]# tar xzf redis-5.0.7.tar.gz
[root@redis1 ~]# cd redis-5.0.7/
[root@redis1 redis-5.0.7]# make -j2
安装并设置安装路径,优化命令执行路径
[root@redis1 redis-5.0.7]# make PREFIX=/usr/local/redis install
[root@redis1 redis-5.0.7]# ln -s /usr/local/redis/bin/* /usr/local/bin/
运行软件自带的配置脚本,一路回车
[root@redis1 redis-5.0.7]# cd utils/
[root@redis1 utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379] #Redis实例端口号
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] #配置文件路径
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] #日志文件路径
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] #数据文件存储路径
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] #执行路径
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful! #启动成功
修改配置文件
[root@redis1 utils]# vi /etc/redis/6379.conf
:set nu 查看行号,在下面对应行去掉注释,或者进行修改
70 bind 127.0.0.1 192.168.247.130 ##加上本机Ip,监听192.168.237.130和环回口
93 port 6379 ##端口
137 daemonize yes ##启用守护进程
159 pidfile /var/run/redis_6379.pid ##指定PID文件
167 loglevel notice ###日志级别为notice
172 logfile /var/log/redis_6379.log ###指定日志文件
开启服务并查看运行状态
[root@redis1 utils]# /etc/init.d/redis_6379 start #执行路径,stop、restart也必须加上此路径
Starting Redis server...
[root@redis1 utils]# netstat -anpt | grep redis
tcp 0 0 192.168.247.130:6379 0.0.0.0:* LISTEN 21083/redis-server
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 21083/redis-server
登录Redis
[root@redis1 utils]# redis-cli -h 192.168.247.130 -p 6379 #-h Redis主机地址和-p 端口号
192.168.247.130:6379>
Redis支持五种数据类型:
set 和 zset 可以看做是属于string的无序和有序集合类型
192.168.247.160:6379> set name lili #给键设置值
OK
192.168.247.160:6379> get name #获取键值
"lili"
192.168.247.160:6379> type name #查看键的数据类型
string
192.168.247.160:6379> keys * #查看数据库中所有键
1) "name"
Redis hash是一个键值(key=>value)对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
每个hash可以存储2的32次方-1键值对。
作用场景:
健值对集合,即编程语言中的Map类型
适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值
#存取多个数据,stu为存储对象 name-lisi sex-男 sge-22 是对象的描述属性
192.168.247.160:6379> hmset stu name lisi sex 男 age 22
OK
192.168.247.160:6379> hget stu age #获取一个对象的描述
"22"
192.168.247.160:6379> hget stu sex #查看中文键值时有乱码,不支持中文
"\xe7\x94\xb7"
192.168.247.160:6379> type stu #查看类型
hash
192.168.247.160:6379> keys *
1) "name"
2) "stu"
192.168.247.160:6379> quit
[root@redis1 ~]# redis-cli -h 192.168.247.160 -p 6379 --raw #--raw使得支持中文
192.168.247.160:6379> hget stu sex
男
Redis列表是简单的字符串列表,按照插入顺序排序,可以重复。可以添加一个元素到 表的头部(左边)或者尾部(右边)
列表最多可存储2^32 -1 个元素。
作用场景:
1、增删快,提供了操作某一段元素的API
2、最新消息排行等功能(比如朋友圈的时间线)
3、消息队列
一个key写入多个value时,遵循着先入后出,后入先出的堆栈规则
存入的value可以重复
192.168.247.160:6379> lpush color white blue yellow pink #一个键存储多个值
4
192.168.247.160:6379> lrange color 0 3 #查看0-3的四个键值,最后存储的变成了第一个
pink
yellow
blue
whi
192.168.247.160:6379> lrange color 0 0 #查看0、1、2的键值
pink
192.168.247.160:6379> lrange color 1 1
yellow
192.168.247.160:6379> lrange color 2 2
blue
192.168.247.160:6379> lpush color yellow #新增一个重复的键值,可以存储
5
192.168.247.160:6379> lrange color 0 4
yellow
pink
yellow
blue
white
192.168.247.160:6379> type color #键值类型为list
list
Redis的 Set 是 string 类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是0(1)
作用场景:
1、比如QQ的共同好友
2、利用唯一性,统计访问网站的所有独立ip
3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
集合存储,不论有序还是无序都不能存储重复的值
192.168.247.160:6379> sadd room 101 102 103 104
4
192.168.247.160:6379> smembers room #查看键值,只能整体查看
101
102
103
104
192.168.247.160:6379> sadd room 101 #无法设置重复的键值
0
192.168.247.160:6379> smembers room
101
102
103
104
192.168.247.160:6379> type room
set
Redis zset和set一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
作用场景:
将Set中的元素增加一个权重参数score,元素按score有序排列
数据插入集合时,已经进行天然排序 1、排行榜 2、带权重的消息队列
192.168.247.160:6379> zadd hobby 0 ski #给值设置分数,决定了值的顺序
1
192.168.247.160:6379> zadd hobby 1 sing
1
192.168.247.160:6379> zadd hobby 2 writing
1
192.168.247.160:6379> zrangebyscore hobby 0 10 #查看分数在0-10的所有值
ski
sing
writing
192.168.247.160:6379> zadd hobby 1.6 shopping #也可以用小数插入数据
1
192.168.247.160:6379> zrangebyscore hobby 0 10
ski
sing
shopping
writing
Redis共有0-15,16个数据库,默认进去为数据库0
192.168.247.160:6379> select 2 #select 接数据库序号切换
OK
192.168.247.160:6379[2]>
192.168.247.160:6379[2]> select 0
OK
192.168.247.160:6379> keys *
room
stu
name
hobby
color
192.168.247.160:6379> move hobby 2 #move 加键名 加数据库序号
1
192.168.247.160:6379> select 2
OK
192.168.247.160:6379[2]> keys * #可以看到迁移过来了
hobby
会删除所有库的数据,不建议使用
删除单个库的数据
192.168.247.160:6379[2]> select 2 #删除2库的数据
OK
192.168.247.160:6379[2]> flushdb
OK
192.168.247.160:6379[2]> keys *
192.168.247.160:6379> exists color #存在返回1
1
192.168.247.160:6379> exists co #不存在返回0
0
192.168.247.160:6379> rename color co #方法一 rename将color命名为co
OK
192.168.247.160:6379> keys *
room
stu
co
name
192.168.247.160:6379> renamenx co color #方法二 renamenx
1
192.168.247.160:6379> keys *
room
stu
name
color
#向Redis发送100个并发连接,共100000个请求的性能测试
[root@redis1 ~]# redis-benchmark -h 192.168.247.160 -p 6379 -c 100 -n 100000
#测试存取大小为100字节的数据包的性能
[root@redis1 ~]# redis-benchmark -h 192.168.247.160 -p 6379 -q -d 100
#测试在本机上进行set与lpush操作时的性能
[root@redis1 ~]# redis-benchmark -t set,lpush -n 100000 -q
■持久化概述
●Redis是运行在内存中,内存中的数据断电丢失
●为了能够重用Redis数据,或者防止系统故障,需要将Redis中的数据写入到磁盘空间中,即持久化
■持久化分类
●RDB方式:创建快照的方式获取某- -时刻Redis中所有数
据的副本
●AOF方式:将执行的写命令写到文件的末尾,以日志的方式来记录数据的变化
■它是Redis的默认持久化方式
■默认文件名dump.rdb
■触发条件
●在指定的时间间隔内,执行指定次数的写操作(配置文件控制)
●执行save或者是bgsave (异步) 命令
●执行flushall命令,清空数据库所有数据
●执行shutdown命令,保证服务器正常关闭且不丢失任何数据
■优缺点
●适合大规模的数据恢复
●如果业务对数据完整性和一致性要求不高,RDB是很好的选择
●数据的完整性和一致性不高
●备份时占用内存
■通过RDB文件恢复数据
●将dump.rdb文件拷贝到redis的安装目录的bin目录下,重启redis服务即可
vim /etc/redis/6379 .conf
save 900 1
save 300 10
save 60 10000
##900秒之内至少-次写操作;300秒之内至少发生10次写操作;60秒之内发生至少10000次写操作;
##只要满足其中一个都会触发快照操作,注释所有的save项表示关闭RDB
dbfilename dump.rdb #RDB文件名称
dir /var/lib/redis/6379 #RDB文件路径
rdbcompression yes #是否进行压缩
■Redis默认不开启
■弥补RDB的不足(数据的不一致性)
■采用日志的形式来记录每个写操作,并追加到文件中
■Redis重启会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
■根据AOF文件恢复数据
●将appendonly.aof文件拷贝到Redis的安装目录的bin目录下,重启Redis服务即可
vim /etc/redis/6379.conf
appendonly yes #开启AOF持久化
appendfilename "appendonly.aof #AOF文件名称
#appendfsync always #同步持久化,每次发生数据变化会立刻写入磁盘
appendfsync everysec #默认推荐,每秒异步记录一次
#appendfsync no #不同步,交给系统决定如何同步
aof-load-truncated yes #忽略最后一条可能存在问题的指令
[root@redis1 6379]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@redis1 ~]# cd /var/lib/redis/6379/
[root@redis1 6379]# ll
总用量 4
-rw-r--r--. 1 root root 0 11月 10 19:38 appendonly.aof #新增了AOF文件
-rw-r--r--. 1 root root 233 11月 10 19:38 dump.rdb