Redis
2021-05-10 09:44:40 56 举报
Redis 三种架构
作者其他创作
大纲/内容
savle
布隆过滤器
master
slave
应用场景:对象缓存HMSET user {userId}:name xly {userId}:balance 1888HMSET user 1:name xly 1:balance 1888HMGET user 1:name 1:balance Hash常用操作:HSET key field value //存储一个哈希表key的键值HSETNX key field value //存储一个不存在的哈希表key的键值HMSET key field value [field value ...] //在一个哈希表key中存储多个键值对HGET key field //获取哈希表key对应的field键值HMGET key field [field] //批量获取哈希表key中多个field键值HDEL key field [field] //删除哈希表key中的field键值HLEN key //返回哈希表key中field的数量HGETALL key //返回哈希表key中所有的键值HINCRBY key field increment //为哈希表key中field键的值加上增量increment
redis.delete(mutexKey);
client
1 断开连接
F
6 生成完整的rdb文件并且load到内存
0
return
4 psync(offset)
1
存储空对象
7
value = db.get(key)
sentinel
a:1
7 持续通过长连接发送写命令
ZSet常用操作ZADD key score member [[score member]] //往有序集合key中加入带分值元素ZREM key member [member] //从有序集合key中删除元素ZSCORE key member //返回有序集合key中元素member的分值ZINCRBY key increment member //为有序集合key中元素member的分值加上increment ZCARD key //返回有序集合key中元素个数ZRANGE key start stop [WITHSCORES] //正序获取有序集合key从start下标到stop下标的元素ZREVRANGE key start stop [WITHSCORES] //倒序获取有序集合key从start下标到stop下标的元素Zset集合操作ZUNIONSTORE destkey numkeys key [key] //并集计算ZINTERSTORE destkey numkeys key [key] //交集计算
哨兵架构
hash哈希
rdb数据
repl_back_buffer
1 psync同步数据
b:2
(mysqlV = mysql.get(key)) == null
主从部分复制
Key
5 flush old data
主从全量复制
T:热点缓存失效
hash函数
slave-1
mysqlV==null
Set常用操作SADD key member [member] //往集合key中存入元素,元素存在则忽略, 若key不存在则新建SREM key member [member] //从集合key中删除元素SMEMBERS key //获取集合key中所有元素SCARD key //获取集合key的元素个数SISMEMBER key member //判断member元素是否存在于集合key中SRANDMEMBER key [count] //从集合key中选出count个元素,元素不从key中删除SPOP key [count] //从集合key中选出count个元素,元素从key中删除Set运算操作SINTER key [key] //交集运算SINTERSTORE destination key [key] //将交集结果存入新集合destination中SUNION key [key] //并集运算SUNIONSTORE destination key [key] //将并集结果存入新集合destination中SDIFF key [key] //差集运算SDIFFSTORE destination key [key] //将差集结果存入新集合destination中
1 获取master
2 收到同步命令,后台生成rdb快照
2.1 生成快照期间,仍进行写数据
JedisCluster
4
一大段重建缓存逻辑都在里面,这里我就简写了
redis.get(key)==null
value2
1. 缓存穿透 缓存中没有存贮key,导致请求穿透缓存,打到后端数据库层(黑客恶意攻击) 1) 存储空对象 2) 布隆过滤器2. 缓存雪崩 由于并发请求过多,导致缓存宕机,请求全部打到后端存储层,从而可能导致后端存储层也级联宕机 1) 集群搭建保证高可用,或者加入hystrix中间件进行降流处理 2) 项目提前设置好后备方案3. 缓存失效 大量缓存在同一时间失效,导致大量请求打到存储层,可能导致数据库宕机或失效 1) 因为是大量缓存同一时间失效,可以随机生成一个时间段内的时间,从而解决这个问题4. 热点key,重建缓存 采用缓存+过期时间的策略,可以加快数据读写,数据定时更新;但是如果一个热点key失效,一个热点缓存的重建不能短时间完成,那么会导致创建大量线程同时重建缓存。 1) 利用setnx互斥锁,保证一个线程重建缓存
应用场景:文章计数器,分布式锁字符串常用操作:SET key value //存入字符串键值对MSET key value [key value] //批量存储字符串键值对SETNX key value //存入一个不存在的字符串键值对GET key //获取一个字符串键值MGET key [key] //批量获取字符串键值DEL key [key] //删除一个键EXPIRE key seconds //设置一个键的过期时间(秒) 原子加减INCR key //将key中储存的数字值加1DECR key //将key中储存的数字值减1INCRBY key increment //将key所储存的值加上incrementDECRBY key decrement //将key所储存的值减去decrement 对象缓存1) SET user:1 value(json格式数据)2) MSET user:1:name xly user:1:balance 1888 MGET user:1:name user:1:balance 分布式锁SETNX product:10001 true //返回1代表获取锁成功SETNX product:10001 true //返回0代表获取锁失败 SET product:10001 true ex 10 nx //防止程序意外终止导致死锁
Thread.sleep(50);
c:3
3 发送rdb数据
String字符串
field1
线上性能优化
field2
5
3
a
布隆过滤器就是一个很大的位数组和几个hash函数,当算到几个位置都为1的时候,那这个值可能存在,不是都为1的,那么一定不存在;
b
redis.get(key) ==null
font color=\"#ff3333\
2 写命令
4 发送增量数据
2
redis五大数据结构
zset有序集合
client端
存在访问瞬断问题,并且支持并发难以提高
主从架构
F:互斥锁抢夺失败
1 发送请求
key
slave-2
6
集群架构
16384 个 slots(槽位)
value1
T
set集合
3 重新建立长连接
list列表
5 从masterbuffer缓中,offset以后的数据一次性同步发送
感知redis节点的变化,找到master节点
T:如果为空
名字叫小明
T:设置成功
c
0 条评论
下一页