1、下载源码,解压缩后编译源码。
```linux
$ wget http://download.redis.io/releases/redis-2.8.3.tar.gz
$ tar xzf redis-2.8.3.tar.gz
$ cd redis-2.8.3
$ make
```
2、编译完成后,在Src目录下,有四个可执行文件redis-server、redis-benchmark、redis-cli和redis.conf。然后拷贝到一个目录下。
```linux
mkdir /usr/redis
cp redis-server /usr/redis
cp redis-benchmark /usr/redis
cp redis-cli /usr/redis
cp redis.conf /usr/redis
cd /usr/redis
```
3、启动Redis服务。
```linux
./redis-server ./redis.conf
```
4、然后用客户端测试一下是否启动成功。
```linux
./redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
```
5.修改redis到后台运行
1) vi redis.conf
2.)修改daemonize 的 no 为 yes
2.查看Redis有没有起来
[suguowen@localhost myredis]$ ps -ef|grep redis
3.打开Redis服务
[suguowen@localhost myredis]$ ./redis-server ./redis.conf
[suguowen@localhost myredis]$ kill -s 9 3398
5.启动Redis
[suguowen@localhost myredis]$ ./redis-cli
> 1.选择数据库
>
> ```linux
> select 1 -- 0~15都是redis默认库,不同库数据不共享
> ```
>
> 2.查看有多少个键值对
>
> ```linux
> DBSIZE
> ```
>
> 3.查看所有键值对的key
>
> ```linux
> keys *
> ```
>
> 4.删除key
>
> ```linux
> FLUSHDB -- 当前库
> FLUSHALL -- 所有库
> ```
>
> 5.是否存在k1(key)
>
> ```linux
> EXISTS k1
> ```
>
> 6.迁移key到其他2库
>
> ```linux
> move k1 2
> ```
>
> 7.设置key过期时间
>
> ```linux
> expire k1 10 -- 让k1,10秒钟过期(k1本来已经存在)
> setex k2 10 v1 -- 让k2,10秒过期(k2本来不存在,现在设置并赋值)
> ```
>
> 8.查看key还有多少秒过期
>
> ```linux
> ttl k1 -- -1表示永不过期,-2表示已过期(过期就会销毁)
> ```
>
> 9.设置key
>
> ```linux
> set k1 hello -- 设置k1的值为hello,如果存在同名k1则覆盖
> setnx k2 hello -- 设置k2的值为hello,如果存在则不覆盖,即此语句失效
> ```
>
> 10.查看数据类型
>
> ```linux
> type k1 -- 查看k1的数据类型
> ```
>
> 11.给key增加内容
>
> ```linux
> append k1 123 -- k1已经存在,在其value后面补123
> ```
>
> 12.返回value长度
>
> ```linux
> strlen k1 -- 返回k1的value的长度
> ```
>
> 13.自增/自减效果(value数字才能加减)
>
> ```linux
> incr k1 -- 每次+1
> decr k1 -- 每次-1
> ```
>
> 15.截取value一部分输出
>
> ```linux
> getrange k1 0 -1 -- 0~--1即全部输出
> ```
>
> 16.把value第n位替换
>
> ```linux
> setrange k1 0 xxx -- 把第0位的数换位xxx
> ```
7.rdb持久化实例(A,B是两个终端;代表A代表程序员,B代表运维,程序员负责测试redis,运维负责修复redis数据)
-- 如何触发快照保存:bgsave、save、配置文件、flushall(无意义
-- 如何恢复:将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可
vim redis.conf -- A:修改快照时间(可以不修改,等待时间长而已)
./redis-server ./redis.conf :A
./redis-cli :A
set k1 v1 :A
set k2 v2 :A
cp dump.rdb dump_pk.rdb :B:另开一个终端,拷贝dump文件(不能保证那台电脑挂,需要多备份)
flushall :A:模拟机器故障
shutdown :A
exit :A
---------------------
./redis-server ./redis.conf :A
./redis-cli :A
keys * :A:返回0,找不到任何记录,为什么呢??
rm -f dump.rdb B:怀疑dump文件损坏,删除
cp dump_pk.rdb dump.rdb :B:把bak文件修改回来查看
./redis-server ./redis.conf :A
./redis-cli :A
keys * :A:记录找回来了!!原来,上面shutdown的时候,把flushall这条命令也保存在快照了
8.aof持久化
-- 当dump和aof文件同时存在,肯定寻找aof文件,如果aof文件损坏,将无法连接数据库!!
-- aof文件损坏修复方式:./redis-check-aof --fix appendonly.aof
vim redis.conf -- 修改appendonly yes即可
redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK
10.Redis消息订阅
SUBSCRIBE redisChat -- A:终端A开启订阅redisChat的消息
PUBLISH redisChat "Redis is a great caching technique" -- B:终端B在redisChat频道发送消息
11.Redis的主从复制
-- 修改配置文件方法:
-- 1.拷贝多个redis.conf文件
-- 2.开启daemonize yes(开启守护进程)
-- 3.pid文件名字(管道名字,加_[端口名]即可)
-- 4.指定端口(不同终端开不同端口)
-- 5.log文件名字(eg:""→"6379.log",日志文件不能相同,不然会覆盖)
-- 6.dump.rdb名字(eg:"dump.rdb"→"dump6379.rdb"dump不能相同,不然会覆盖)
-- 第一步,配置文件
cp redis.conf redis_1.conf -- 多开
vim redis.conf -- 修改配置文件
vim redis_1.conf -- 修改配置文件
vim redis_2.conf -- 修改配置文件
-- 第二步,实验一主二从(终端A:6379;终端B:6380;终端C:6381)
info replication -- A/B/C:查看自己的身份
slaveof 127.0.0.1 6379 -- B、C:拜A为大哥
set k1 v1 -- A
set k2 v2 -- A
get k1 -- B:B能够拿到大哥A设置的值,一主二从完成
get k1 -- C:C能够拿到大哥A设置的值,一主二从完成
-- 第三步,实验薪火相传(终端A:6379;终端B:6380;终端C:6381)
slaveof 127.0.0.1 6379 -- B:拜A为大哥
slaveof 127.0.0.1 6380 -- C:拜B为大哥
set k1 v1 -- A
get k1 -- B:B能够拿到大哥A设置的值,薪火相传完成
get k1 -- C:C能够拿到大哥A设置的值,薪火相传完成
-- 第三步,实验哨兵模式(终端A:6379;终端B:6380;终端C:6381)
touch sentinel.conf
vim sentinel.conf -- 加这句话sentinel monitor host6379 127.0.0.1 6379 1
-- 这句话意思host6379随笔改,127..是大哥的ip,6379是大哥的端口,1是主机死了,从机票数多1做大哥
slaveof 127.0.0.1 6379 -- B、C:拜A为大哥
shutdown -- A:A死了
-- 这时候,B、C进行了N轮投票,然后选出了大哥,这里假设B成了大哥
info replication -- C:查看自己的身份,并且看到了大哥从A变成了B
set k1 v1 -- B
get k1 -- C:C能够拿到大哥B设置的值
-- 这时候A又回来了,但是不再是大哥了!!
get k1 -- A:A能够拿到大哥B设置的值,哨兵模式完成