本文共 12256 字,大约阅读时间需要 40 分钟。
字符串(string)、散列(hash)、列表(lists、集合(set)、有序集合(sorted set)
redis持久化操作,第一种是 rdb 形式,一种是 aof 形式
rdb:属于全量数据备份,备份的是数据
aof:append only if , 增量 持久备份,备份的是指令 如 【set key , del key】
redis 作为缓存的使用,搭配数据库使用的两种方案:
1.jedis整合使用方案
第一层在缓存进行查询,如果查询到数据则直接返回,如果查不到数据则到数据库中查询,并且刷新添加缓存
2.作为mybatis/hibernate二级缓存使用方案
一级缓存: sqlSession 进程缓存,单次链接有效
String操作类型:Set key value 设置key,valueGet key 获得值key对应的value的值Strlen key 获得key对应的value的长度Incr key 对key对应的value的值自增1Incrby key 【数字】 指定数字递增Decr key 对key对应的value的值自减1Decrby key 【数字】 指定数字递减Getrange key 0 -1 显示指定范围的key对应的value值(0到-1显示全部)Setrange key 0 x 从零开始,修改原来的值,将原来的修改;原来为“10”执行后为“x0”Setex key 【过期时间秒】 value 设置值的同时给定过期时间Setnx key value 若key不存在,设置value值才会成功【可用于分布式锁】Mset key value key value key value 一次性设置多个值Mget key key key 一次性获得多个值Msetnx key value key value 一次性设置多个之前不存在的值,若其中有一个key存在的话就不会成功
list操作类:Lpush key value value value 存值,结果[先进后出]Rpush key value value value 存值,结果按顺序,[先进先出]Lrange key 0 -1 查看list中的数据(0到-1显示全部)Lpop key 出栈,从左到右,每次出栈一个元素,相当于从list中删除Rpop key 出栈,从右到左,每次出栈一个元素,相当于从list中删除Lindex key 【下标】 具体显示list中角标对应的值,从0开始计数Lrem key 【数字】 【元素】 删除list中几个相同的元素Ltrim key 【下标1】【下标2】 截取出保存下标1到下标2的元素,其他下标对应的元素被删除Lset key 【下标】 【元素】 修改list数字中对应下标的元素Linsert key before/after 【元素1】【元素2】 在元素1的前面/后面 插入元素2,若元素1有多个,则只对最前面的那个匹配元素1的元素的前后进行操作 r是对底部进行操作,l是对顶部进行操作
set操作:Sadd key 【元素1】【元素2】【元素3】 一次性添加多个元素,会自动去重Smembers key 查看当前key中的所有元素Scard key 获取元素个数Srem key 【元素】【元素】【元素】 删除指定元素Srandmember key 【数字】 在指定的set中随机的显示三个数字Spop key 【数字】 随机出栈指定的个数个元素Smove key1 key2 【key1中的元素】 将key1中的元素剪切到key2中Sdiff key1 key2 显示出存在于set1中但不存在于set2中的元素Sinter key1 key2 显示出key1和key2共同拥有的元素 交集Sunion key1 key2 显示出key1和key2两者相加的所有元素 并集
hash的结构类似于 Map< String, Map<Object, Object> >
hash操作: 键值对Hset hash key1 value1 key2 value2 设置值,hash允许重复 当key重复的时候会覆盖前面出现的keyHget hash key 获取valueHgetall hash 获取所有的key和valueHmset hash key1 value1 key2 value2 一次存一个对象的多个不同的valueHdel hash key 删除指定的keyHlen hash 查看长度Hexists hash key 判断hash中key是否存在Hkeys hash 获取所有的key值Hvals hash 获取所有的value值Hincrby hash key 【整数数字】 指定的key按指定的数字递增Hincrbyfloat hash key 【小数】 指定的key按指定的小数递增Hsetnx hash key value 若key值在hash中不存在就添加
zset操作:有序集合 key不允许重复 zset(key value)key值必须是数字(key为序号,依据此序号来排序)Zadd zset key1 value1 key2 value2 一次性添加多个数据Zrange zset 0 -1 显示所有的value值,当范围为 0 到 -1 时显示全部,下标从0开始Zrange zset 0 -1 withscores 现在所有的key和value,当范围为 0 到 -1 时显示全部,下标从0开始Zrangebyscore zset 【key1】【key2】 显示key1到key2之间的key的值(包含数字1和数字2) 数字2比数字1大Zrangebyscore zset 【(key1】【key2】 显示key1到key2之间的key的值(加了前括号就不包含改数字)zrangebyscore zset 【key1】【key2】 limit【key3】【数字4】 从结果中截取key3开始截取 数字4 个元素Zrem zset value1 value2 value3 删除指定的key中的valueZcard zset 统计zset中key的个数Zcount zset 【key1】【key2】 统计key1到key2之间的key个数Zrank zset value 通过value的值value所在的下标Zscore zset value 获取key的值Zrevrank zset value 显示倒叙过来的下标Zrevrange zset 0 -1 倒叙显示所有valueZrevrangbyscore zset [key1] [key2] 倒叙显示key1到key2的之间的value值 这里key1比key2大
Redis 默认有16个数据库,即16个databaseSelect 【数字】 转到第几个数据库Dbsize 查看当前数据库有多少个keyKeys * 当前库的key查询出来Flushdb 清除当前库Flushall 清除所有库Auth 【密码】 认证密码Exists【key的名字】 判断某个key是否存在Move key 【db序号】 将当前库的key剪切到指定db序号Expire key【时间秒】 为给定的key设置过期时间,过期后会移除系统Ttl key 查看还有多少秒过期,-1表示永远不过期,-2表示已过期Type key 查看你的key是什么类型Del key 删除key
事务ACID特性:
原子性:事务作为一个整体被执行,包含在其中对数据的操作要么全部被执行,要么都不执行
一致性:事务应该确保数据库的状态从一个一致的状态转变成另一个一致的状态。
隔离性:多个事务并发执行时,一个事务的执行不应该影响其他事务的执行
持久性:已被提交的事务对数据库的修改应该永久被保存在数据库中
tenxun-redis:0> info replication # 查看redis信息"# Replicationrole:master # 角色 masterconnected_slaves:0 # 没有从机master_replid:6bddb5abc0f8067588d1d1bdba63cc7f2fbd1e88master_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0"
主机可以写,从机不能写只能读,主机中的所有信息和数据,都会自动被从机保存
master 配置文件:redis-6379.conf
port 6379daemonize yes # 后台运行logfile "6379.log" # 日志文件dbfilename "dump-6379.rdb" # 持久化文件dir "/opt/soft/redis/data"
pidfile /var/run/redis_6379.pid
slave-1 配置文件:redis-6380.conf
port 6380daemonize yeslogfile "6380.log"dbfilename "dump-6380.rdb"dir "/opt/soft/redis/data"# 关键配置:将这个 redis 指定为某个第一个 redis 的 slaverslaveof 127.0.0.1 6379
slave-2 配置文件:redis-6381.conf
port 6381daemonize yeslogfile "6381.log"dbfilename "dump-6381.rdb"dir "/opt/soft/redis/data"# 关键配置:将这个 redis 指定为某个第一个 redis 的 slaverslaveof 127.0.0.1 6379
启动redis:
redis-server redis-6379.conf
连接客户端:
redis-cli -p 6379
sentinel-26379.conf
#设置 sentinel 工作端口port 26379#后台运行 daemonize yes#日志文件名称logfile "26379.log"#设置当前 sentinel 监控的 redis ip 和 端口sentinel monitor mymaster 127.0.0.1 6379 2#设置判断 redis 节点宕机时间sentinel down-after-milliseconds mymaster 60000#设置自动故障转移超时sentinel failover-timeout mymaster 180000#设置同时故障转移个数sentinel parallel-syncs mymaster 1
sentinel-26380.conf
#设置 sentinel 工作端口port 26380#后台运行 daemonize yes#日志文件名称logfile "26380.log"#设置当前 sentinel 监控的 redis ip 和 端口sentinel monitor mymaster 127.0.0.1 6379 2#设置判断 redis 节点宕机时间sentinel down-after-milliseconds mymaster 60000#设置自动故障转移超时sentinel failover-timeout mymaster 180000#设置同时故障转移个数sentinel parallel-syncs mymaster 1
sentinel-26381.conf
#设置 sentinel 工作端口port 26391#后台运行 daemonize yes#日志文件名称logfile "26381.log"#设置当前 sentinel 监控的 redis ip 和 端口sentinel monitor mymaster 127.0.0.1 6379 2#设置判断 redis 节点宕机时间sentinel down-after-milliseconds mymaster 60000#设置自动故障转移超时sentinel failover-timeout mymaster 180000#设置同时故障转移个数sentinel parallel-syncs mymaster 1
针对几个监控设置的配置做一下详细说明:
sentinel monitor [master-group-name] [ip] [port] [quorum]
这个命令中【master-group-name】是 master redis 的名称;【ip】和【port】分别是其 ip 和端口,很好理解。最后一个参数【quorum】是”投票数“
举个栗子,redis 集群中有3个 sentinel 实例,其中 master 挂掉了,如果这里的票数是2,表示有2个 sentinel 认为 master 挂掉啦,才能被认为是正真的挂掉啦。其中 sentinel 集群中各个 sentinel 之间通过 gossip 协议互相通信。
具体怎样投票还涉及到 redis 集群中的【主观下线】和【客观下线】的概念,后面再详细介绍。down-after-milliseconds
sentinel 会向 master 发送心跳 PING 来确认 master 是否存活,如果 master 在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个 sentinel 会主观地认为这个 master 已经不可用了。而这个down-after-milliseconds 就是用来指定这个“一定时间范围”的,单位是毫秒。
failover-timeout
这个参数 redis 官方文档中并未做详细说明,但是很好理解,就是 sentinel 对 redis 节点进行自动故障转移的超时设置,当 failover(故障转移)开始后,在此时间内仍然没有触发任何 failover 操作,当前sentinel 将会认为此次故障转移失败。
parallel-syncs
当新master产生时,同时进行 slaveof 到新 master 并进行同步复制的 slave 个数,也就是同时几个 slave 进行同步。因为在 salve 执行 salveof 与新 master 同步时,将会终止客户端请求,因此这个值需要权衡。此值较大,意味着“集群”终止客户端请求的时间总和和较大,此值较小,意味着“集群”在故障转移期间,多个 salve 向客户端提供服务时仍然使用旧数据。
我们配置三个 sentinel 几点组成一个 sentinel 集群,端口分别是 23679,23680,23681
然后就可以启动 sentinel 集群了
启动 sentinel 有两种方式:
redis-sentinel /path/to/sentinel.conf
redis-server /path/to/sentinel.conf --sentinel
每个redis的配置:
daemonize yes // redis后台运行 prot 7000 cluster-enabled yes // 开启集群 cluster-config-file nodes.conf //集群的配置,首次启动自动生成 cluster-node-timeout 5000 // 请求超时(单位:毫秒) appendonly yes // aof日志开启,它会操作日志 bind 127.0.0.1 172.16.244.133 // (Redis安装这台的内网IP) 添加一个内网ip 不影响集群
创建集群
yum -y install ruby ruby-devel rubygems rpm-build gem install redis
如果gem install redis发现报错
curl -L get.rvm.io | bash -s stable source /usr/local/rvm/scripts/rvmrvm list knownrvm install 2.3.3rvm use 2.3.3ruby --versiongem install redis
开启集群工作
cd /usr/local/redis-4.0.6/src./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \ 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
测试集群是否正常
./redis-cli -c -p 7000
如果搭建失败,请用此命令将所有启动的redis server一个个关闭掉
./redis-cli -p 7000 shutdown
简介:Redis集群特点介绍
Redis 集群的数据分片
概念:Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,
举个例子,比如当前集群有3个节点,那么:
查看集群信息redis-cli -p 7000 cluster nodes | grep master
从Redis宕机讲解分布式锁执行的异常场景流程
从Server服务宕机讲解分布式锁执行的异常场景流程
Redis 集群的主从复制模型
Redis 一致性保证
手把手测试故障转移
redis-cli -p 7000 debug segfaultredis-cli -p 7001 cluster nodes | grep master
简介:玩转Redis集群节点分片重哈希
采用SSH连接远程服务器
集群重新分片
手动处理solt节点槽重新分片
添加一个新的主节点
./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
添加一个新的从节点
./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000
移除一个节点
./redis-trib.rb del-node 127.0.0.1:7000 <node-id>
第一个参数是任意一个节点的地址,第二个节点是你想要移除的节点地址。
简介:一起来进行Redis集群探索
图解探索【是不是只学习master cluster就行了】
分析cluster集群方式原理
水平切分于垂直切分相比,相对来说稍微复杂一些。因为要将同一个表中的不同数据拆分到不同的数据库中。 分片是一种基于数据库分成若干片段的传统概念扩容技术,它将数据库分割成多个碎片并将这些碎片放置在不同的服务器上。
垂直切分的最大特点就是规则简单,实施也更为方便,尤其适合各业务之间的耦合度非常低,相互影响很小,业务逻辑非常清晰的系统。按照业务维度将不同数据放入不同的表
故障转移
Twitter推特公司twemproxy服务端分片和客户端分片集群解决方案
什么是缓存雪崩?你有什么解决方案来防止缓存雪崩?