目录
一,什么是Redis
Redis 是c语言开发的,完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。数据存储在内存中,由于内容存取速度快所以redis被广泛应用在互联网项目中。
二,下载和安装(linux版)
下载地址:http://download.redis.io/releases/redis-3.0.0.tar.gz
安装过程:
1)安装c语言环境
yum install gcc-c++ #Redis是c语言开发的,所以需要c语言的环境。
2)拷贝到/usr/upload下解压源码
cd /usr/upload
tar -zxvf redis-3.0.0.tar.gz #解压源码
3)编译并安装
cd /usr/local/redis-3.0.7
make #编译
make install PREFIX=/usr/local/redis #安装到指定的位置
启动的过程:
1.前端启动:直接运行bin/redis-server将以前端模式启动。ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法
cd /usr/local/redis/bin
./redis-server关闭:ctrl+c
2.后端启动:
1)拷贝并修改配置文件
cp /usr/upload/redis-3.0.7/redis.conf /usr/local/redis/bin #把配置文件复制到指定的位置
vim /usr/local/redis/bin/redis.conf #修改文件
2)启动和关闭
启动:
./redis-server redis.conf
./redis-server -p 端口号 redis.conf
关闭:
./redis-cli shutdown
./redis-cli -p 端口号 shutdown
测试:
./redis-cli
./redis-cli -h 127.0.0.1 -p 6379
三,基本命令 :
cd /usr/local/redis/bin #进入启动文件
./redis-server redis.conf #启动redis
./redis-cli #进入命令模式
1、set和get命令: 使用set和get可以向redis设置数据、获取数据
2、keys *:查看所有key
3、exists:判断key值是否存在
4、expire 和 ttl:expire设置key的过期时间,ttl查看key的有效期
5、incr和decr:自增和自减
6、clear:可以使用clear命令对redis-cli终端屏幕清屏。
四,redis的五种数据类型
k--key v--value k-v 键值对
数据类型 | 赋值 | 取值 | 删除 |
---|---|---|---|
string | set k v | get k | del k |
hash | hset k k-v | hget k k | hdel k k |
list(linkedlist) | lpush/rpush k v... | lrange k 0 -1 | lrem k count v |
set | sadd k v... | smembers k | srem k v |
zset | zadd k scores v | zrange k 0 -1 withscores | zrem k v |
五种数据类型详细介绍:
String:
Hash:
List :
127.0.0.1:6379> lrange str3 0 -1 # 获取str3 的所有数据
1) "a" ----------------删掉
2) "a" ----------------删掉
3) "1"
4) "3"
5) "8"
6) "g"
7) "a" ----------------删掉
8) "r"
9) "1"
10) "3"
11) "2"
12) "2"
13) "a"
14) "g"
15) "r"
16) "g"
17) "r"
- count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
- count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
- count = 0 : 移除表中所有与 VALUE 相等的值。
127.0.0.1:6379> lrem str3 3 a #删除str3中的 “a” 三个 表头开始
(integer) 3
127.0.0.1:6379> lrange str3 0 -1
1) "1"
2) "3"
3) "8"
4) "g"
5) "r"
6) "1"
7) "3"
8) "2"
9) "2"
10) "a"
11) "g" ----------------删掉
12) "r"
13) "g" ----------------删掉
14) "r"
127.0.0.1:6379> lrem str3 -2 g #删除str3中的 “g” 二个 从表尾开始
(integer) 2
127.0.0.1:6379> lrange str3 0 -1
1) "1"
2) "3"
3) "8"
4) "g"
5) "r" ----------------删掉
6) "1"
7) "3"
8) "2"
9) "2"
10) "a"
11) "r" ----------------删掉
12) "r"127.0.0.1:6379> lrem str3 0 r #删除str3中的 “r” 全部
(integer) 3
127.0.0.1:6379> lrange str3 0 -1
1) "1"
2) "3"
3) "8"
4) "g"
5) "1"
6) "3"
7) "2"
8) "2"
9) "a"
127.0.0.1:6379>
Set:
127.0.0.1:6379> sadd str4 aaa bbb ccc ddd #无序 数据唯一,不重复
(integer) 4
127.0.0.1:6379> smembers str4
1) "ccc"
2) "bbb"
3) "aaa"
4) "ddd"
127.0.0.1:6379> sadd str4 aaa # 数据唯一,不重复
(integer) 0
127.0.0.1:6379> smembers str4
1) "ccc"
2) "bbb"
3) "aaa"
4) "ddd"
127.0.0.1:6379> srem str4 aaa
(integer) 1
127.0.0.1:6379> smembers str4
1) "bbb"
2) "ddd"
3) "ccc"
127.0.0.1:6379>
Zset:
有序集合的成员是唯一的,但分数(score)却可以重复。
redis 正是通过分数来为集合中的成员进行从小到大的排序。
127.0.0.1:6379> zadd str5 1 s1 2 s2 #赋值str5
(integer) 2
127.0.0.1:6379> zrange str5 0 -1 withscores #获取str5的字段值
1) "s1"
2) "1"
3) "s2"
4) "2"
127.0.0.1:6379> zadd str5 2 s3 2 s4 #赋值 scores(分数)相同的情况
(integer) 2
127.0.0.1:6379> zrange str5 0 -1 withscores #可以赋值添加
1) "s1"
2) "1"
3) "s2"
4) "2"
5) "s3"
6) "2"
7) "s4"
8) "2"
127.0.0.1:6379> zadd str5 3 s1 #元素相同时,不被允许添加,只会覆盖原有的
(integer) 0
127.0.0.1:6379> zrange str5 0 -1 withscores
1) "s2"
2) "2"
3) "s3"
4) "2"
5) "s4"
6) "2"
7) "s1"
8) "3"
127.0.0.1:6379> zrem str5 s1 s2 s4 #删除 s1 s2 s4
(integer) 3
127.0.0.1:6379> zrange str5 0 -1 withscores
1) "s3"
2) "2"
127.0.0.1:6379>
五,redis的多数据库实例
1、一个redis实例可以包括多个数据库,客户端可以指定连接某个redis实例的哪个数据库,一个redis实例最多可提供16个数据库,下标从0到15,不能修改下标,客户端默认连接第0号数据库,也可以通过select选择连接哪个数据库。不同节点的数据查询不到。
2、清空数据库的命令:
flushdb:清空当前数据库的数据
flushall:清空所有数据库的数据
六, 持久化
查看进程:ps -ef | grep redis 或 ps -aux | grep redis
1、RDB持久化(默认)
RDB是Redis用来进行持久化的一种方式,是把当前内存中的数据集快照写入磁盘,也就是 Snapshot 快照(数据库中所有键值对数据)。恢复时是将快照文件直接读到内存里。
策略:在redis.conf配置文件中默认有此下配置:
save 900 1 #900秒内容如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000 #表示60秒内如果超过10000个key被修改,则发起快照保存
优点:不影响性能
缺点:不能保证数据的完整性
测试:存的是数据
1.删除dump.rdb
2.set str abc
3../redis-cli shutdown--->dump.rdb 存的是数据
2、AOF持久化
配置修改:
默认情况下Redis没有开启AOF(append onlyfile)方式的持久化,可以通过appendonly参数开启:appendonly yes
AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改:appendfilename appendonly.aof
策略:在redis.conf配置文件中默认有此下配置:
#appendfsync always #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。
#appendfsync no #从不同步。高效但是数据不会被持久化。
缺点:影响性能
优点:保证数据的完整性
测试:存的是命令
1.设置appendonly为yes
2.set str1 abc
3.等待1秒观察appendonly.aop
七,主从复制
1、过程
- 从往主发送sync命令
- 主往从发送rdb文件
- 往从发送写命令
2、配置步骤
主:无需配置
从:slaveof 主ip 主port
实验:
- 往主写数据,观察从是否同步 :
把主和从的appendonly.aof文件删除
往主写数据,查看从是否有appendonly.aof文件和里面的数据是否和主一样 - 关闭主,往从写数据(主死类从只能读)
把主的redis关掉:./redis-cli -p 6379 shutdown
八,redis集群的介绍
1、redis集群是多少台?
投票容错超过半数:3台 高可用:3台
2、为什么集群中有一个节点挂了,则整个集群都挂类?
redis集群中有16384个槽分给了3个节点,存取数据时:crc16(key)%16384=[0~16383]
为了保证集群的高可用,每个master节点下面还需要添加至少1个slave节点,这样当某个master节点发生故障后,可以从它的slave节点中选举一个作为新的master节点继续提供服务。
1,搭建集群
1)安装ruby环境
cd /usr/upload #
yum install ruby
yum install rubygems
gem install redis-3.0.0.gem
2) 搭建伪分布式。可以使用一台虚拟机运行6个redis实例。需要修改redis的端口号7001-7006
注意:必须删除dump.rdb和appendonly.aof文件
cd /usr/local
mkdir redis-cluster
cp -r redis redis-cluster/redis-7001....
cp -r redis redis-cluster/redis-7006
3)修改redis.conf配置文件。把cluster-enabled yes前的注释去掉。
4)创建启动脚本:shutdown-all.sh,放在/usr/local/redis-cluster目录下。
cd /usr/local/redis-cluster/redis-7001/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-7002/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-7003/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-7004/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-7005/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-7006/bin
./redis-server redis.conf
5)使用ruby脚本创建redis集群
cd /usr/upload/redis-3.0.0/src
./redis-trib.rb create --replicas 1 192.168.122.133:7001 192.168.122.133:7002 192.168.122.133:7003 192.168.122.133:7004 192.168.122.133:7005 192.168.122.133:70066
6)测试
./redis-cli -c -p 7001
cluster info
cluster nodes
127.0.0.1:7001> cluster info
cluster_state:ok #状态表示集群可以正常接受查询请求
cluster_slots_assigned:16384 #已分配到集群节点的哈希槽数量
cluster_slots_ok:16384 #哈希槽状态不是FAIL
和PFAIL
的数量
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6 #集群中节点数量,包括握手状态还没有成为集群正式成员的节点
cluster_size:3 #至少包含一个哈希槽且能够提供服务的master节点数量
cluster_current_epoch:6 #集群本地Current Epoch
变量的值
cluster_my_epoch:1 #当前正在使用的节点的Config Epoch
值
cluster_stats_messages_sent:579 # 通过node-to-node二进制总线发送的消息数量
cluster_stats_messages_received:579 #通过node-to-node二进制总线接收的消息数量
每行的组成结构如下
<id> <ip:port> <flags> <master> <ping-sent> <pong-recv> <config-epoch> <link-state> <slot> <slot> ... <slot>