reids:
类型:
String: key value
常用 API:set [key] [value],get [key],setnx [key] [value],del [key],mset [key] [value] [key] [value],mget [key] [key],
incr [key],decr [key],incrby [key] [数量],decrby [key] [数量],
type [key], 返回key的value类型
object encoding [key] 返回key的value的存储类型
常用场景 :
单值缓存: set [key] [value]
对象缓存:1、set [key] [value(json格式数据)],2、mset [key] [value] [key] [value]
分布式锁:setnx [key] [value] 返回1代表取锁成功,返回0代表取锁失败
计数器:incr [key]
web集群session共享:spring session + redis实现session共享
分布式系统全局序列号:incrby [键] [数量] redis批量生成序列号
Hash:<key <field value>>
常用 API: hset [key] [field] [value],hsetnx [key] [field] [value],hmset [key] [field] [value] [field] [value],
hget [key] [field],hmget [key] [field] [field],
hdel [key] [field] [field],
hlen [key] , 返回key中field的数量
hgetall [key], 返回key中所有的键值
hincrby [key] [field] [increment] 为key中field键的值加上increment
常用场景:
购物车操作:
添加商品:hset [购物车ID] [商品ID] [商品数量]
增加数量:hincrby [购物车ID] [商品ID] [商品数量]
商品总数:hlen [购物车ID] 删除商品:heel [购物车ID] [商品ID]
获取购物车所有商品:hgetall [购物车ID]
缺点:1、过期功能只能使用在key上,不能使用在field上;2、在redis集群架构中不适合大规模使用
list: key value value
常用 API:
lpush [key] [value] [value], 将一个或多个value插入到key列表到表头
rpush [key] [value] [value], 将一个或多个value插入到key列表到表尾
lpop [key], 移除并返回列表key的头元素
rpop [key], 移除并返回列表key的尾元素
lrange [key] [start] [stop], 返回列表key指定区间内的元素
blpop [key] [timeout], 从列表key表头弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
brpop [key] [timeout], 从列表key表尾弹出一个元素,若列表中没有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待
常用场景:
数据结构:
栈 = lpush + lpop —先进后出
队列 = lpush + rpop —先进先出
阻塞队列 = lpush + brpop
微博消息和公众号消息的关注推送:排序操作(可以利用栈的先进后出的思路解决)
set:
常用API:
sadd [key] [member] 往集合key中存入元素,元素存在则忽略,若key不存在则新建
srem [key] [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中删除
运算操作:
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)参与抽奖加入集合:sadd [key] [用户ID];
2)查看参与抽奖的所有用户:smembers [key];
3)抽取count名中奖者:srandmember [key] [count] //spop [key] [count]
微信微博点赞,收藏:
1)点赞:sadd [消息ID] [用户ID]
2)取消点赞:srem [消息ID] [用户ID]
3)检查用户是否点过赞:sismember [消息ID] [用户ID]
4)获取点赞的用户列表:smembers [消息ID]
5)获取点赞用户数:scard [消息ID]
集合运算可以实现(微关系):推荐好友的好友(可能认识的人),获取共同关注的人
zest:有序集合
常用API:
zadd key score member [score member] 往有序集合中key中加入带分值元素
zrem key member [member] 从有序集合中删除元素
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下标的元素
运算操作:
zunionstore destkey numkeys key [key…] 并集计算 zinger store destkey numkeys key [key…] 交集计算
常用场景:
1、记录浏览量 zincrby hotnews:20230326 1 守护香港
2、展示当日排行前十 zrevrange hotnews:20230326 0 9 withscores
3、七日搜索榜单计算 zunionstore hotnews:20230319-20230326 7
4、展示七日排行前十 zrevrange hotnews:20230319-20230326 0 9 withscores
nginx:负载均衡
同步代码块(synchronized):单机环境可用,分布式多节点集群环境不可用
分布式锁:
setnx:
1、系统异常,锁未被删除导致死锁(finally解决)
2、宕机了,锁未被删除导致死锁(加一个过期时间expire)
3、代码处理逻辑复杂,执行时间超过过期时间导致锁被删除,后面的线程进入,前面的线程会删除掉后面线程的锁,导致锁失效(给每个线程赋一 个唯一值作为锁标志,在删除锁的时候做个对比在删除)
4、锁续命,如果过了超时时间的1/3,判断主线程是否持有锁,如果持有则延长它的超时时间
redisson(续命锁):高并发环境可用
RLock redissonlock = redisson.getlock(lockkey); 获取锁对象
redissonlock.lock(); 加锁
redissonlock.unlock(); 释放锁
源码分析:有一段lua脚本(当成一条命令来执行),判断锁是否存在,如果不存在,就使用hset给锁对象赋值,给锁对象设置过期时间,加锁成功后, 异步调用一个定时任务给锁续命
分段加锁:
JMeter:压测工具
1、 什么是缓存雪崩?怎么解决?
缓存雪崩:
缓存用于缓冲对 DB 的冲击,如果缓存宕机,所有请求将直接打在 DB,造成 DB 宕机——从而导致整个系统宕机。
解决办法:
1). 对缓存做高可用,防止缓存宕机
2). 使用断路器,如果缓存宕机,为了防止系统全部宕机,限制部分流量进入 DB,保证部分可用,其余的请求返回断路器的默认值。
3).用加锁或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上