缓存技术-Redis
什么是redis?
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。redis是将数据存放到内存中,由于内容存取速度快所以redis被广泛应用在互联网项目中 优点:存取速度快,官方称读取速度会达到30万次每秒,写速度在10万次每秒最有,具体限制于硬件. 缺点:对持久化支持不够良好,所以redis一般配合传统的关系型数据库使用。
redis的应用场景
缓存(数据查询)。<----->(这个是最多使用) 分布式集群架构中的session分离。 聊天室的在线好友列表。 任务队列。(秒杀、抢购、12306等等) 网站访问统计。
安装redis
因为是在linux中安装,以下操作步骤都为linux其中命令 一, 准备 Redis是c语言开发的。安装redis需要c语言的环境。
yum install gcc-c++
将redis-3.0.0.tar.gz拷贝到/usr/upload下解压源码
tar -zxvf redis-3.0.0.tar.gz
进入解压后的目录进行编译
cd /usr/upload/redis-3.0.0
make
安装到指定目录
make install PREFIX=/usr/local/redis
启动和关闭redis
前端启动
1、启动方式:
直接运行bin/redis-server将以前端模式启动。
cd /usr/local/redis/bin
./redis-server
2、启动缺点:
ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法
**4、前端启动的关闭:**ctrl+c
后端启动
第一步:进入源码目录,里面有一份配置文件 redis.conf,然后将其拷贝到安装路径下
cp /usr/upload/redis-3.0.0/redis.conf /usr/local/redis/bin
第二步:修改/usr/java/redis/bin下的redis.conf,将daemonize由no改为yes
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RrUaiYhu-1663759438961)(assets\1588858554831.png)]
第三步:启动
./redis-server redis.conf
关闭
到redis/bin目录下执行如下命令
./redis-cli -p 端口号 shutdown
redis的基本命令
redis-cli连上redis服务后,可以在命令行发送命令:
./redis-cli -h 127.0.0.1 -p 6379
1、set和**get:**使用set和get可以向redis设置数据、获取数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CVGMMyAf-1663759438961)(assets\1588858857065.png)]
2、**keys *:**查看当前库中所有的key值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s6jmMzix-1663759438962)(assets\1588858890464.png)]
3、exists:判断key值是否存在
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6i5s2une-1663759438962)(assets\1588859376977.png)]
4、expire 和 ttl:expire设置key的过期时间,ttl查看key的有效期
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RcfbJbRw-1663759438962)(assets\1588859832417.png)]
5、**clear:**可以使用clear命令对redis-cli终端屏幕清屏。
Redis的五种数据类型
:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
- String:是 redis 最基本的数据类型。一个 key 对应一个value。redis的String可以表示任何数据,比如 jpg图像或者序列化的对象,String的最大值能存储512MB。
- Hash:hash 是一个 string 类型的 field 和 value 的映射表
- List:有顺序可重复,内部是使用双向链表实现的
- Set:元素无顺序,不能重复
- SortedSet(zset):有顺序,不能重复
持久化
Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。
? Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者结合用。
RDB持久化
RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。
? RDB是Redis默认采用的持久化方式,在redis.conf配置文件中默认有此下配置:
save 900 1 #900秒内容如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000 #表示60秒内如果超过10000个key被修改,则发起快照保存
在redis.conf中:
? 配置dir指定rdb快照文件的位置
? 配置dbfilenam指定rdb快照文件的名称
Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。
AOF持久化
默认情况下Redis没有开启AOF(append onlyfile)方式的持久化,可以通过appendonly参数开启:appendonly yes AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改:appendfilename appendonly.aof AOF持久化策略如下: #appendfsync always #每次有数据修改发生时都会写入AOF文件。 appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。 #appendfsync no #从不同步。高效但是数据不会被持久化。
主从复制
1、 slave 服务启动,slave 会建立和master 的连接,发送sync 命令。
2、master启动一个后台进程将数据库快照保存到RDB文件中
3、master 就发送RDB文件给slave
4、slave 将文件保存到磁盘上,然后加载到内存恢复
5、master把缓存的命令转发给slave
注意:主死了,从只能读
主从配置
主redis配置
无需特殊配置。
从redis配置
修改从redis服务器上的redis.conf文件,添加slaveof 主redis ip 主redis端口
redis集群的搭建
redis-cluster架构图
redis集群的搭建
Redis集群中至少应该有三个节点。要保证集群的高可用,需要每个节点有一个备份机。
Redis集群至少需要6台服务器。
搭建伪分布式。可以使用一台虚拟机运行6个redis实例。需要修改redis的端口号7001-7006 使用ruby脚本搭建集群,需要安装ruby。 [root@upload ~]# yum install ruby [root@upload ~]# yum install rubygems [root@upload ~]# gem install redis-3.0.0.gem [root@localhost ~]# cd redis-3.0.0/src [root@localhost src]# ll *.rb 注意:必须删除dump.rdb和appendonly.aof文件
搭建伪分布式,需要6个redis实例放到/usr/local/redis-cluster目录下,并且运行在不同的端口7001-7006
cp -r /usr/local/redis /usr/local/redis-cluster/redis-7001
创建6个redis实例
每个实例运行在不同的端口。还需要修改redis.conf配置文件。配置文件中还需要把cluster-enabled yes前的注释去掉。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pb2f9ndc-1663760831335)(assets\1588862084740.png)]
4.2.2.2.启动每个redis实例
创建启动集群的脚本:start-all.sh 放在/usr/java/redis-cluster目录下。
cd redis-7001
./bin/redis-server bin/redis.conf
cd ..
cd redis-7002
./bin/redis-server bin/redis.conf
cd ..
cd redis-7003
./bin/redis-server bin/redis.conf
cd ..
cd redis-7004
./bin/redis-server bin/redis.conf
cd ..
cd redis-7005
./bin/redis-server bin/redis.conf
cd ..
cd redis-7006
./bin/redis-server bin/redis.conf
cd ..
[root@localhost redis-cluster]# chmod 777 start-all.sh
创建关闭集群的脚本:shutdown-all.sh,放在/usr/local/redis-cluster目录下。
cd redis-7001
./redis7001/ bin/redis-cli -p 7001 shutdown
./redis7001/ bin/redis-cli -p 7002 shutdown
./redis7001/ bin/redis-cli -p 7003 shutdown
./redis7001/ bin/redis-cli -p 7004 shutdown
./redis7001/ bin/redis-cli -p 7005 shutdown
./redis7001/ bin/redis-cli -p 7006 shutdown
[root@localhost redis-cluster]# chmod 777shutdown-all.sh
4.2.2.3.使用ruby搭建集群
切换到*.rb目录
[root@localhost src]# ./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005 192.168.25.153:7006
>>> Creating cluster
Connecting to node 192.168.25.153:7001: OK
Connecting to node 192.168.25.153:7002: OK
Connecting to node 192.168.25.153:7003: OK
Connecting to node 192.168.25.153:7004: OK
Connecting to node 192.168.25.153:7005: OK
Connecting to node 192.168.25.153:7006: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.25.153:7001
192.168.25.153:7002
192.168.25.153:7003
Adding replica 192.168.25.153:7004 to 192.168.25.153:7001
Adding replica 192.168.25.153:7005 to 192.168.25.153:7002
Adding replica 192.168.25.153:7006 to 192.168.25.153:7003
M: 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3 192.168.25.153:7001
slots:0-5460 (5461 slots) master
M: 8cd93a9a943b4ef851af6a03edd699a6061ace01 192.168.25.153:7002
slots:5461-10922 (5462 slots) master
M: 2935007902d83f20b1253d7f43dae32aab9744e6 192.168.25.153:7003
slots:10923-16383 (5461 slots) master
S: 74f9d9706f848471583929fc8bbde3c8e99e211b 192.168.25.153:7004
replicates 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3
S: 42cc9e25ebb19dda92591364c1df4b3a518b795b 192.168.25.153:7005
replicates 8cd93a9a943b4ef851af6a03edd699a6061ace01
S: 8b1b11d509d29659c2831e7a9f6469c060dfcd39 192.168.25.153:7006
replicates 2935007902d83f20b1253d7f43dae32aab9744e6
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.....
>>> Performing Cluster Check (using node 192.168.25.153:7001)
M: 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3 192.168.25.153:7001
slots:0-5460 (5461 slots) master
M: 8cd93a9a943b4ef851af6a03edd699a6061ace01 192.168.25.153:7002
slots:5461-10922 (5462 slots) master
M: 2935007902d83f20b1253d7f43dae32aab9744e6 192.168.25.153:7003
slots:10923-16383 (5461 slots) master
M: 74f9d9706f848471583929fc8bbde3c8e99e211b 192.168.25.153:7004
slots: (0 slots) master
replicates 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3
M: 42cc9e25ebb19dda92591364c1df4b3a518b795b 192.168.25.153:7005
slots: (0 slots) master
replicates 8cd93a9a943b4ef851af6a03edd699a6061ace01
M: 8b1b11d509d29659c2831e7a9f6469c060dfcd39 192.168.25.153:7006
slots: (0 slots) master
replicates 2935007902d83f20b1253d7f43dae32aab9744e6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost redis-cluster]#
4.2.2.4.测试
启动时使用-c参数来启动集群模式,命令如下:
./redis-cli -c -p 7001
|