expire 美 /ɪk'spaɪɚ/ 到期php
range 美 /rendʒ/ 范围java
idle美 /'aɪdl/ 闲置的node
mysql | redis | memcached | |
---|---|---|---|
类型 | 关系型 | 非关系型 | 非关系型 |
存储位置 | 磁盘 | 磁盘和内存 | 内存 |
存储过时 | 不支持 | 支持 | 支持 |
读写性能 | 低 | 很是高 | 很是高 |
存储结构 | 表来存储 | 支持list/set/string/zset/hash数据结构 | 普通键值对key-value |
redis和memcached的系统点和不一样点? mysql
相同点:都是key-value Nosql,数据存储在内存中,读写效率高,都支持存储过时(存储过时:一个数据存储是为他设置过时时间,时间一到数据就没有. 道具,会员,优惠券,订单,红包等)git
不一样点: 1) redis支持持久化 2) redis支持存储类型更多github
1.作缓存(重点)web
2.统计数量(利用自增的特性),好比:微博评论转发,注册人数,浏览人数面试
3.实时攻防系统(利用自增的特性)redis
4.有效期应用(利用能够设置过时时间),好比:红包,优惠券,会员时间算法
5.自动去重(利用能够用set数据结构去重)
6.实现队列(quene FIFO) (利用redis支持list数据结构)
7.支持订阅发布
redis是非关系型数据库,它的数据通常是存放在内存当中,若是设置了持久化,能够存放在磁盘当中。
它的持久化方案有两种,RDB,这个是默认的,它是周期性的去备份数据库的数据,周期的时间的能够去设置,在redis.windows.conf配置文件当中,去设置save 操做多少次 在多少时间内,只要达到这个标准,RDB持久化方案就会去备份数据,还有一种是AOF,它是须要手动开启的,开启是在一个redis.windows.conf文件里面去设置一个appendonly,把false改为true就能够开启AOF持久化方案,AOF持久化方案,保存的是操做数据的日志。
redis支持多种数据结构,有String、list、set、zset、hash
redis支持不少应用场景,由于存储在内存,访问速度快,还能够设置过时时间,能够用来作缓存。由于它+1,-1操做方便,能够用来统计数量,好比:记录点赞数、排行统计、浏览量统计。由于它能够设置过时时间,能够把它用在和有效期相关的场景,好比:红包、优惠券、秒杀。由于redis能够用lpush、rpush,能够用list数据结构来实现队列。利用set数据结构能够去重的特色,能够用redis存放具备惟一性的数据,好比:存放某一博客的惟一ip地址信息。
redis内存达到极限的时候,会执行淘汰策略。redis的淘汰策略有:volatile-lru,在设置了过时时间的数据中,淘汰最近最少使用的数据。volatile-ttl,在设置了过时时间的数据中,淘汰最快过时的数据。volatile-radom,在设置了过时时间的数据中,随机淘汰数据。allkeys-lru,在全部数据中,淘汰最近最少使用的数据。allkeys-radom,在全部数据中随机淘汰。no-envication,这个是不淘汰的策略。
SQL:它是关系型数据库的里面标准的查询语言
NoSQL(NoSQL = Not Only SQL ),意即“不只仅是SQL”,它泛指非关系型的数据库,为了解决关系型数据的一些不足,处理超大规模和高并发的数据
redis和memcached是key-value的Nosql,主要用来作缓存的
(1)Redis 是一个高性能的开源的、C语言写的Nosql(非关系型数据库),数据保存在内存或者磁盘中。
(2)Redis 是以key-value形式存储,和传统的关系型数据库不同。不必定遵循传统数据库的一些基本要求,好比说,不遵循sql标准,事务,表结构等等,redis严格上不是一种数据库,应该是一种数据结构化存储方法的集合。--数组,list,set,map.....
1.Redis:开源,高性能NoSQL数据库,数据能够存储在内存或者磁盘上
2.Redis主要key-value结构形式存储,Redis底层支持各类类型的数据存储结构,包括:list,set,map,string等
1.数据保存在内存,存取速度快,并发能力强
2.它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、 zset(sorted set --有序集合)和hash(哈希类型)。
5.Redis支持集群(主从同步)。数据能够主服务器向任意数量从的从服务器上同步,从服务器能够是关联其余从服务器的主服务器。
6.支持持久化,能够将数据保存在硬盘的文件中
注:之后用Redis主要是用来作缓存
mysql | redis | memcached | |
---|---|---|---|
类型 | 关系型 | 非关系型 | 非关系型 |
存储位置 | 磁盘 | 磁盘和内存 | 内存 |
存储过时 | 不支持 | 支持 | 支持 |
读写性能 | 低 | 很是高 | 很是高 |
Redis比Memcached的支持的数据存储类型更多
1.作缓存(重点)
2.计算器应用(利用自增的特性),好比:微博评论转发,注册人数,浏览人数
3.实时攻防系统(利用自增的特性)
4.有效期应用(利用能够设置过时时间),好比:红包,优惠券,会员时间
5.自动去重(利用能够用set数据结构去重)
6.实现队列(quene FIFO) (利用redis支持list数据结构)
7.支持订阅发布
下载Redis服务,Redis客户端
https://github.com/microsoftarchive/redis/releases
set key value //将字符串值value关联到key
get key //返回key关联的字符串值
mset key1 value1 key2 value2 //同时设置一个或多个 key-value 对
mget key1 key2 //返回全部(一个或多个)给定 key 的值
incr key //将 key 中储存的数字值增1(key不存在,则初始化为0,再加1)
decr key //将 key 中储存的数字值减1(key不存在,则初始化为0,再减1)
incrBy key //自增多少
decrBy key //自减多少
keys * //获取全部key列表
del key //删除key
expire key xx //设置key的过时时间(xx秒后过时)
ttl key //查看key的过时时间
flushall //清空整个redis服务器数据,全部的数据库所有清空
flushdb //清除当前库,redis中默认有16个数据库,名称分别为0,1,2,.....,15
select 库名 //选择数据库,好比:select 1:选择1数据库,默认是0数据库
list集合能够当作是一个左右排列的队列(列表)
lpush key value //将一个或多个值 value 插入到列表 key 的表头(最左边)
rpush key value //将一个或多个值 value 插入到列表 key 的表尾(最右边)
lpop key //移除并返回列表 key 的头(最左边)元素。
rpop key //移除并返回列表 key 的尾(最右边)元素。
lrange key start stop //返回列表 key 中指定区间内的元素,查询全部的stop为-1便可
lrem key count value //根据count值移除列表key中与参数 value 相等的元素count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。count = 0 : 移除表中全部与 value 相等的值。
lindex key index //返回列表 key 中,下标为 index 的元素
ltrim key start stop //对一个列表进行修剪,如ltrim w 0 1,即:把w集合中的0和1索引保留下来,其余删掉
注:
存放都是字符串,由redis组织成各类数据结构
rdis怎么实现栈(FILO)和队列(FIFO)???
list控制同一边进,同一边出就是栈
list控制一边进,另外一边出就是队列.
set集合是一个无序的不含重复值的队列
sadd key member //将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略
srem key member //移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略
smembers key //返回集合 key 中的全部成员。
hash类型相似于php的数组
hset key name value //添加一个name=>value键值对到key这个hash类型,如:hset map age 18
hget key name //获取hash类型的name键对应的值,如:hget map age
hmset key name1 key1 name2 key2 //批量添加name=>value键值对到key这个hash类型,如:hmset map age 28 sex man
hmget key name1 name2 //批量获取hash类型的键对应的值,如:hmget map age sex
hkeys //返回哈希表 key 中的全部键
hvals //返回哈希表 key 中的全部值
hgetall key //返回哈希表 key 中,全部的键和值
咱们将user:1(name:zhangsan,age:18,sex:nv)的信息保存在hash表.
multi //标记一个事务块的开始。
exec //执行全部事务块内的命令。
discard //取消事务,放弃执行事务块内的全部命令。
注:Redis的事务在执行exec指令时,才批量执行操做,没有回滚操做
subscribe channel [channel ...] //订阅给定的一个或多个频道的信息。如:subscribe CCTV1
publish channel message //将信息 message 发布到指定的频道 channel 。如:publish CCTV1 “This is my”
config set 命令能够动态地调整 Redis 服务器的配置而无须重启,重启后失效
config set requirepass 123456 //将密码设置为123456
config set requirepass "" //清除密码
auth 123456 //输入密码进行认证
在配置文件redis.widows.conf中增长一行代码
requirepass 123456
//字符串基本操做
使用链接池的好处:能够设置最大链接数,不用频繁的操做数据库
使用链接池简单访问Redis的流程:
1.建立链接池配置对象
2.配置
忙时:最大链接数
闲时,最大链接数
最大等待时间
获取链接时检查配置
3.经过链接池配置对象,建立链接池
4.经过链接池后去链接
5.执行操做
6.关闭链接、摧毁链接池
//链接池操做
//弱类型事务 -- 了解
Redis能够支持内存存储或者磁盘存储
若是要完成磁盘存储,必须了解一些持久化机制
Redis 提供了两种不一样级别的持久化方式:RDB和AOF,能够经过修改redis.windows.conf来进行配置.
RDB 持久化能够在指定的时间间隔内生成数据集的时间点快照,默认开启该模式.
默认开启该配置:redis.windows.conf配置
save(sec) (key change) 在sec秒以后,若是发现有key改变次数达到配置,就会进行同步
缺点:数据它有丢失,它是有时间节点,在这个节点内忽然断电,就不能同步到磁盘
AOF 持久化记录服务器执行的全部写操做命令,并在服务器启动时,经过从新执行这些命令来还原数据集,默认关闭该模式。
默认没有开启配置,须要redis.windows.conf里面进行配置
如何开启aof模式:
appendonly yes //yes 开启,no 关闭
若是有写的命令操做,就会把数据同步到aof里面,若是断电以后,再次启动,加载该文件,执行命令,在数据写到库里面
redis是怎么保存数据?
redis为了考虑效率,保存数据在内容中.而且考虑数据安全性,还作数据持久化,若是知足保存策略,就会把内存的数据保存到数据rdb文件,还来不及保存那部分数据存放到aof更新日志中。在加载时,把两个数据作一个并集。
淘汰一些数据,达到redis数据都是有效的。选择合适的淘汰策略进行淘汰。
volatile-lru(设置了过时时间中的数据,最近最少使用的被淘汰):从已设置过时时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl(设置了过时时间中的数据,过时时间最近的被淘汰):从已设置过时时间的数据集(server.db[i].expires)中挑选将要过时的数据淘汰
volatile-random(设置了过时时间中的数据,随机淘汰):从已设置过时时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru(所有数据中,最近最少使用被淘汰):从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random(所有数据中,随机淘汰):从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(不淘汰):禁止驱逐数据(不淘汰:通常都是热点数据,永不淘汰)
redis 肯定驱逐某个键值对后,会删除这个数据,并将这个数据变动消息发布到本地(AOF 持久化)和从机(主从链接)。
Sentinel 美 /'sɛntɪnl/ 哨兵
cluster美 /'klʌstɚ/ 集群
相同点:均可以解决高并发,都须要多台服务器
不一样点:
集群是指:多个服务器实现相同的业务功能。
分布式是指:多个服务器去拆分同一个业务功能。
1.解决单点故障问题 2.处理高并发 3.处理大量数据(解决存储问题)
1.方便维护 2.解决高并发,单点故障问题 3.便于扩容
主从复制(主备切换)是指:主服务器宕机了,从服务器顶上。
读写分离是指:主服务器专门用来写操做,从服务器专门用来读操做。
主从同步是指:主服务器把读来的数据同步到从服务器。
主从复制的缺点:容错困难,不支持自动恢复
哨兵模式是指:每一个哨兵进程去ping主服务器,若是在设置的时间内没有响应,那么就标记为主观下线,若是达到设定的个数的哨兵进程都标记了主服务器为主观下线,那么就把主服务器标记为客观下线。
优缺点:解决了主从复制的容错问题,也支持自动恢复功能。缺点:不方便扩容。
容错机制:选举过程是集群中全部master参与,若是半数以上master节点与故障节点通讯超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操做. 故障节点对应的从节点自动升级为主节点
优缺点:解决了哨兵模式的
1.准备6个redis服务器(79行改端口,707行改) 707 721 581 yes 715->更改号
集群就是 不少服务器组成的一个网络。指的是将多台服务器集中在一块儿,实现同一业务。
分布式是指将不一样的业务分布在不一样的地方. web应用和数据库服务分开.
1)两大关键特性
集群提供了如下两个关键特性:
一、可扩展性:(简单来讲就是随时能够增长新的服务器)
集群的性能不限于单一的服务实体,新的服务实体能够动态地加入到集群,从而加强集群的性能。动态添加服务器
二、高可用性:(简单来讲就是主服务器挂了,集群要有能力找能够正常使用额服务器继续提供服务器)
集群经过服务实体冗余使客户端免于轻易遇到out of service的警告。在集群中,一样的服务能够由多个服务实体提供。若是一个服务实体失败了,另外一个服务实体会接管失败的服务实体。集群提供的从一个出错的服务实体恢复到另外一个服务实体的功能加强了应用的可用性
2)两大能力
为了具备可扩展性和高可用性特色,集群的必须具有如下两大能力:
一、负载均衡--负载均衡能把任务比较均衡地分布到集群环境下的计算和网络资源。
二、错误恢复--因为某种缘由,执行某个任务的资源出现故障,另外一服务实体中执行同一任务的资源接着完成任务。这种因为一个实体中的资源不能工做,另外一个实体中的资源透明的继续完成任务的过程叫错误恢复。
负载均衡和错误恢复都要求各服务实体中有执行同一任务的资源存在,并且对于同一任务的各个资源来讲,执行任务所需的信息视图(信息上下文)必须是同样的
相同点:
都是能够处理高并发,并且都须要多台服务器协同.通常在一个系统中同时存在分布式和集群.
不一样点:
分布式:不一样服务处理不一样的业务,集群:不一样服务处理同一个业务
1) 防止单点故障
2) 处理高并发-太多请求一台服务器搞不定
3) 处理大量数据-太多内存数据一台服务器搞不定
主从复制的优缺点:
优势:处理高并发,支持主从同步,主机会自动将数据同步到从机,能够进行读写分离
缺点:主机或者从机宕机会有部分数据丢失
1.监控主服务器和从服务器是否正常运行。
2.主服务器出现故障时自动将从服务器转换为主服务器。
哨兵模式的优缺点:
优势:
哨兵模式是基于主从模式的,全部主从的优势,哨兵模式都具备。
主从能够自动切换,系统更健壮,可用性更高。
缺点:
Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂
Redis-Cluster采用无中心结构
特色:
1.全部的redis节点彼此互联(PING-PONG机制)
2.节点的fail是经过集群中超过半数的节点检测失效时才生效。
3.客户端与redis节点直连,不须要中间代理层.客户端不须要链接集群全部节点,链接集群中任何一个可用节点便可。
4.在redis的每个节点上,都有两个东西,一个是插槽(slot),它的的取值范围是:0-16383。还有一个就是cluster,能够理解为是一个集群管理的插件。
总结(简单来讲):
1.redis-cluster能够理解为哨兵模式的升级版本,经过槽的概念解决数据分布式存储
2.也有主从结构,解决一个槽挂了,从填充上去决绝单点故障
1 .准备6个redis服务器 (以分别命名为 6379-6384例)(3主3从)
(2) 修改配置
port 6379
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
appendonly yes
(3) 每一个redis服务 写一个startup.bat启动文件
如:6379的文件内容(6380的文件把6379改成6380)
title redis-6379
redis-server.exe redis.windows.conf
(4)安装ruby环境
傻瓜式安装:rubyinstaller-2.6.3-1-x64.exe
(5)安装Redis的Ruby驱动
a)解压 :rubygems-3.0.6
b)到Ruby文件目录,cmd后, 而后命令行执行:ruby setup.rb
(6)经过驱动安装的redis(须要联网)
a)进入6379的目录
b)cmd中,执行gem install redis命令
(7) 建立集群
a)启动 6379-6384服务
b)拷贝redis-trib.rb文件到6379的文件目录
c)cmd下,执行命令:redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
d)执行命令后,询问的时候,须要输入:yes
Set<HostAndPort> nodes = new HashSet();
nodes.add(new HostAndPort("127.0.0.1", 6379));
nodes.add(new HostAndPort("127.0.0.1", 6380));
nodes.add(new HostAndPort("127.0.0.1", 6381));
nodes.add(new HostAndPort("127.0.0.1", 6382));
nodes.add(new HostAndPort("127.0.0.1", 6383));
nodes.add(new HostAndPort("127.0.0.1", 6384));
JedisCluster cluster = new JedisCluster(nodes);
1)简单说一下你对分布式理解?
分布式是指将不一样的业务分布在不一样的地方. web应用和数据库服务分开
2)简单说一下你对集群理解?
集群就是 不少服务器组成的一个网络。指的是将多台服务器集中在一块儿,实现同一业务
3)说一下分布式和集群联系和区别
相同点:
都是处理高并发,并且都须要多台服务器协同.通常在一个系统中同时存在分布式和集群.
不一样点:
分布式:不一样服务处理不一样的业务,集群:不一样服务处理同一个业务
4)redis集群方式有哪些?
5)简单说一下redis-cluster里面槽?
槽是存放数据,存放是要经过key计算槽位,选择对应的服务器来存储,获取也是一样的算法.
默认16384个槽位要均匀分布到主节点上面
为了槽里面数据安全要对主节点进行1-N从节点备份
6)简单说一下redis-cluster里面选举投票机制
全部主节点都参与投票,默认半数以上挂点,启动容错机制,提高从节点为主节点.
7)怎么经过命令链接redis集群 :redis-cli -c -h -p
8)怎么经过jedis链接集群