当前位置:   article > 正文

分布式缓存之redis介绍、安装、主从、集群实例_分布式有几个redis实例

分布式有几个redis实例

文章目录

1. redis介绍

开源的c语言编写,支持网络,基于内存亦可持久化的日志型、高性能的key-value数据库,并提供多种语言的apl,通常被称为数据结构服务器,因为值(value)可以是字符串,哈希,列表,集合和有序集合等类型
redis与其他key-value缓存产品的特点

  • 支持数据持久化,可以将内存放入数据保存在磁盘中,启动时再次加载进行使用
  • 支持多种数据结构的存储,丰富的数据类型-redix支持二进制案例strings,list,hashes,set以及oredred set数据类型的操作
  • 支持数据备份,即master-slave模式的数据备份
  • 所有操作都是原子性的,溶蚀redis还支持几个操作合并后的原子执行
  • 性能极高,redis的读的速度为110000次/s。写的速度为81000次/s

1.1 体系架构

(1) redis结构

在这里插入图片描述
互联网数据目前基本使用两种方式存储,关系数据库或者key value,但是这些互联网业务本身并不属于这两种数据类型,比如用户在社会化平台的关系,就是一个列表,如果用关系数据库存储就需要转换成一种多行记录的形式,这种形式存在很多冗余数据,每一行都需要存储一些重复的信息。如果用key value存储则修改和删除比较麻烦,需要讲所有数据读出再写入。
redis在内存中设计了各种数据类型,让业务能够高速原子的访问这些数据结构,并且不需要关心持久存储的问题,从架构解决了前面两种存储需要走一些弯路的问题。

(2)备份模式

AOF文件比RDB文件大,切恢复速度慢,这样导致违背高可用行性的本意。在redis中还有另一种方法来达到目的:replication。由于redis的高性能,复制基本没有延迟,这样达到了防止单点故障且实现了高可用。
在这里插入图片描述

(3)容灾模式

在这里插入图片描述

1.2 数据类型

redis支持五中数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)

(1)string(字符串)

是redis最基本的数据类型,可以理解成与memcache一模一样的类型。一个key对应一个value。意思是redis的string可以包含任何数据,比如jpg图片或序列化对象。
一个键最大存储512MB

127.0.0.1:6379> set var 123   # set赋值
OK
127.0.0.1:6636> get var	#get取值
"123"
  • 1
  • 2
  • 3
  • 4

(2)hash(哈希)

是一个键值对集合,一个string类型的field和value的映射表。hash特别适合用于存储对象

127.0.0.1:6379> HSET set1 name "zhangsan"
(integer) 1
127.0.0.1:6379> HSET set1 score "100"
(integer) 1
127.0.0.1:6379> HSET set2 name "lisi"
(integer) 1
127.0.0.1:6379> HSET set2 score "99"
(integer) 1
127.0.0.1:6379> HGET set1 name
"zhangsan"
127.0.0.1:6379> HGET set1 score
"100"
127.0.0.1:6379> HGET set2 name
"lisi"
127.0.0.1:6379> HGET set2 score
"99"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • hset&hget一次只能往哈希结构里面插入一个键值对,如果插入多个可以用hmset&hmget
127.0.0.1:6379> HMSET var:1 name zhangsan wanger lisi
OK
127.0.0.1:6379> HGETALL var:1
1) "name"
2) "zhangsan"
3) "wanger"
4) "lisi"
# 说明:var:1是键值,每个hash可以存储232-1键值对
hmset用于建立hash对象,hgetall用于获取hash对象
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • hset和hmset操作对比
127.0.0.1:6379> hset test1 name1 zhangsan name2 wanger name3 lisi name4 mazi
(integer) 4
127.0.0.1:6379> HMGET test2 name1 zhangsi name2 wangsan name3 liwu name4 mazi
1) (nil)
2) (nil)
3) (nil)
4) (nil)
5) (nil)
6) (nil)
7) (nil)
8) (nil)
127.0.0.1:6379> HGETALL test1
1) "name1"
2) "zhangsan"
3) "name2"
4) "wanger"
5) "name3"
6) "lisi"
7) "name4"
8) "mazi"
127.0.0.1:6379> HGETALL test2
(empty list or set)
127.0.0.1:6379> hget test1 name1
"zhangsan"
127.0.0.1:6379> hget test2 name1
(nil)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

(3)list(列表)

127.0.0.1:6379> lpush lvar 1
(integer) 1
127.0.0.1:6379> lpush lvar a
(integer) 2
127.0.0.1:6379> lpush lvar ab
(integer) 3
127.0.0.1:6379> lrange lvar 0 1
1) "ab"
2) "a"
127.0.0.1:6379> lrange lvar 0 10
1) "ab"
2) "a"
3) "1"
127.0.0.1:6379> lrange lvar 2 2
1) "1"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

说明:lpush往列表的前面插入;lrange后面的数字是范围(闭区间)
列表最多可存储232-1元素(4294967295,每个列表可存储40多亿)

(4)set(集合)

redis的set是string类型的无序集合。
集合是通过哈希表实现的,

127.0.0.1:6379> sadd setvar redis
(integer) 1
127.0.0.1:6379> sadd setvar kongkong
(integer) 1
127.0.0.1:6379> sadd setvar kongkong
(integer) 0
127.0.0.1:6379> sadd setvar kongkongruye
(integer) 1
127.0.0.1:6379> SMEMBERS setvar
1) "kongkong"
2) "redis"
3) "kongkongruye"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

说明:set往集合中插入元素,smembers列举出集合中的元素
成功插入返回1;错误插入返回0

(5)zset(sorted set:有序集合)

zset和set一样也是string类型的集合,且不允许有重复的元素;不同指出在于zset关联一个double类型的分数,redis通过分数在对集合中的元素排序;zset的元素是唯一的,但分数可以是重复的

127.0.0.1:6379> ZADD zvar 1 redis
(integer) 1
127.0.0.1:6379> ZADD zvar 1 kongkong
(integer) 1
127.0.0.1:6379> ZADD zvar 1 kongkong
(integer) 0
127.0.0.1:6379> ZADD zvar 1 kongkongruye
(integer) 1
127.0.0.1:6379> ZRANGEBYSCORE zvar 0 2
1) "kongkong"
2) "kongkongruye"
3) "redis"
127.0.0.1:6379> ZRANGEBYSCORE zvar 0 4
1) "kongkong"
2) "kongkongruye"
3) "redis"

127.0.0.1:6379> ZRANGEBYSCORE zvar  -3
(error) ERR wrong number of arguments for 'zrangebyscore' command
127.0.0.1:6379> ZRANGEBYSCORE zvar  -3 10
1) "kongkong"
2) "kongkongruye"
3) "redis"
127.0.0.1:6379> ZRANGEBYSCORE zvar  -3 1
1) "kongkong"
2) "kongkongruye"
3) "redis"
127.0.0.1:6379> ZRANGEBYSCORE zvar  -1 0
(empty list or set)
分数为float(可正,负,0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

说明:成功插入返回1,否则返回0

1.3 应用场景

  • 缓存系统:与memcached类似
  • 计数器:例如转发数,评论数,有了原子递增,可以加上计数,用getset重置或者让其过期
  • 消息队列系统:类似于kafka,运行稳定并且快速,支持模式匹配,能够实时订阅与取消频道
  • 社交网络:redis可以非常好的与社交网络结合,用户和状态消息将会聚焦很多有用的信息,很多交互,如实时聊天就是通过redis来实现的
  • 过期项目处理:通过系统时间为关键词,用来保持列表能够按时间排序,对currenttime和timeto_live进行检索,完成查找过期项目的艰巨任务。
  • 实时系统:使用位图来布隆过滤器,例如实现垃圾邮件过滤系统的开发变得非常容易

2. redis持久化

2.1 方式

  • snapshotting
  • append-only file
  • 虚拟内存
  • diskstore

2.2 snapshotting

快照是默认的持久化方式,将内存中的数据以快照的方式写入二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式,可以配置redis在n秒内如果超过m个key被修改就自动做快照。

save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000
  • 1
  • 2
  • 3

在这里插入图片描述
client也可以用save或者bgsave命令通知redis做一次快照持久化,save操作是在主线程中保存快照的。由于redis使用一个主线程来处理所有client的请求,这种方式会阻塞所有的client请求,所以不推荐使用,另一点需要注意的事,每次快照持久化都是将内存数据完全写入到磁盘一次,并不是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能

另外由于快照方式是一定时间间隔做一次的,如果redis意外down掉的话,就会丢失最后一次快照后的所有修改,如果应用要求不能丢失任何修改的话,可以采用aof持久化方式。

2.3 append-only file

使用aof持久化方式时,redis会将每一个收到的写命令通过write函数追加到文件中(默认时appendonly.aof)。当redis重启时会通过重新执行文件中的保存的写命令来在内存中重建整个数据库的内容。由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样的aof方式的持久化也有可能会丢失部分修改。可以通过修改配置文件告诉redis,我们想要通过fsync函数强制os写入到磁盘的时机。有三种方式

appendonly yes  #启用aof持久化方式
# appendfsync always # 每次收到写命令就立即强制写入磁盘,速度最慢,但是保证了完全的持久哈,不推荐使用
appendfsync eversec  #每秒强制写入磁盘一次,在性能和持久化方面做了很好的折中。推荐
# appendfsync no # 完全依赖os,性能最好,持久化没保证
  • 1
  • 2
  • 3
  • 4

aof的方式同时带来了另一个问题,持久化文件会变的越来越大。例如:调用incr test命令100次,文件中必须保存全部的100条命令,其实有99条都是多余的。因为恢复数据库的状态只需要保存一条set test100 就够了。为了压缩aof的持久化文件,redis提供了bgrewriteaof命令,接收到此命令。redis将使用与快照类似的方式将内存的数据以命令的方式保存在临时文件中,最后替换原来的文件。如下
在这里插入图片描述
需要注意的时重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据内容用命令的方式重写了一个新的aof文件,这点和快照有点类似

2.4 数据持久化对比

RDB方式 AOF方式
描述 默认方式,实现方式是定时将内存的快照持久化到硬盘 aof即append only file,再写入内存数据的同时将操作命令保存到日志文件中
优点 使用单独的子进程进行持久化,主进程不会进行任何的io操作,保证redis的高性能 保证了数据的可靠性及高安全性,保证更高的数据完整性
缺点 RDB是件个月i段时间进行持久化,如果持久化之间redis发生故障,数据会丢失 在并发更改上万的系统上。命令日志是一个分场庞大的数据,管理维护成本非常高,回复创建时间会非常长;AOF文件比RDB文件大,且恢复速度慢
应用场景 更适合数据要求不严谨的时候 适合数据完整性要求高的场景

3. redis安装配置及运用

3.1 安装

[root@redis1 ~]# yum install gcc gcc-c++ make
[root@redis1 ~]# wget http://download.redis.io/releases/redis-5.0.4.tar.gz
[root@redis1 ~]# tar xf redis-5.0.4.tar.gz -C /usr/local/src/
[root@redis1 ~]# cd /usr/local/
[root@redis1 local]# ln -s /usr/local/src/redis-5.0.4 ./redis
[root@redis1 redis]# cd redis/
[root@redis1 redis]# make
[root@redis1 redis]# echo $?
0
[root@redis1 redis]# mkdir -p /data/redis
[root@redis1 redis]# make PREFIX=/data/redis install
[root@redis1 redis]# echo $?
0
[root@redis1 redis]# mkdir /data/redis/conf
[root@redis1 redis]# cp -p redis.conf /data/redis/conf/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

3.2 生成指令

[root@redis1 ~]# cd /data/redis/bin/
[ro
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/732595
推荐阅读
相关标签
  

闽ICP备14008679号