本文共 8661 字,大约阅读时间需要 28 分钟。
字符串(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特性:
原子性:事务作为一个整体被执行,包含在其中对数据的操作要么全部被执行,要么都不执行
一致性:事务应该确保数据库的状态从一个一致的状态转变成另一个一致的状态。
隔离性:多个事务并发执行时,一个事务的执行不应该影响其他事务的执行
持久性:已被提交的事务对数据库的修改应该永久被保存在数据库中
master 配置文件:redis-6379.conf
port 6379daemonize yeslogfile "6379.log"dbfilename "dump-6379.rdb"dir "/opt/soft/redis/data"
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
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
什么是缓存雪崩?你有什么解决方案来防止缓存雪崩?
转载地址:http://dexxi.baihongyu.com/