Redis相关

Redis是什么?
Redis是一个开源的,使用C语言编写的,支持网络交互的,可基于内存也可持久化的key-value存储系统。

什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么?
持久化就是把内存的数据写到磁盘中,防止服务宕机了内存数据丢失。
Redis提供两种持久化方式:RDB(默认,Redis DataBase缩写)和AOF(Append-Only file缩写)。
区别:
1、RDB:持久化内存数据到磁盘,保存的是二进制数据文件;AOF:持久化修改数据命令,保存的是redis命令;
2、RDB:快照恢复速度快;AOF:命令过多速度慢;
2、RDB:可能丢数据;AOF:数据恢复完整性比RDB高;

使用Redis有哪些好处?
数据存储在内存中,读写速度快;
支持的数据类型资源丰富;
支持事务,操作都是原子性操作;
可以设置数据存活的生命周期。

Redis支持哪几种数据类型?
1、 string(字符串),最基本的数据类型,二进制安全的字符串,一个键最大能存储512MB。
格式:set key value(设置)
格式:get key(获取)
2、 list(列表),是简单的字符串列表,按照插入顺序排序。
格式:lpush name value(每个元素都添加到列表最左端)
格式:lpushx name value(只有name存在时,值添加到列表的最左端)
格式:llen name(元素个数)
格式:linsert name befor/after refvaleu value(refvalue值前或者后插入一个新值)
格式:lset name index value(某一个索引未知重新赋值)
格式:lrem name value num(删除指定值,num:0所有,1前往后1,-1后往前)
格式:lpop name(获取第一个元素并在列表中删除)
格式:lindex name index(根据索引获取元素)
格式:lrange name start end(获取start-end索引之间的值)
格式:ltrim name start end(删除没有在start-end索引之间的值)
3、 hash(哈希),key-value对的一种集合。
格式:hset name key value(设置一个键值对)
格式:hmset name key1 value1 key2 value2(批量设置键值对)
格式:hget name key(获取一个key的值)
格式:hmget name key1 key2(获取多个key的值)
格式:hgetall name(获取所有键值)
格式:hlen name(获取键值对的个数)
格式:hkeys name(获取所有key的值)
格式:hvals name(获取所有value的值)
格式:hexists name key(判断是否存在指定key)
格式:hdel name key(删除指定key的键值对)
4、 set(集合),无序的字符串集合,不存在重复的元素。
格式:sadd name value1 value2(设置,自动去重)
格式:smembers name(获取所有元素)
格式:scard name(获取元素个数)
格式:srem name value(删除指定集合元素)
格式:srandmember name count(随机出几个元素)
格式:spop name (随机出一个元素并删除)
5、 zset(sorted sety有序集合),有序的字符串集合。
格式:zadd name score value(设置)
格式:zrangebyscore name min max(按区间读取)
格式:zrangebyscore name -inf inf(查出所有的数据)
格式:zrangebyscore name -inf 5 withscores(查询score<=5的数据含score)
格式:zremrangebyscore name min max(删除数据)
格式:zrem name value(删除指定数据)

消息队列
作用:异步、解耦、削峰。
在业务的实现过程中,就算没有大量的流量,解耦和异步化几乎也是处处可用,此时MQ就显得尤为重要。但与此同时MQ也是一个重量级的组件,在中小型业务的开发过程中,过重的组件服务也会成倍增加工作量,所幸的是,redis提供的list数据结构非常适合做消息队列。

Redis实现消息队列的两种方式:Redis队列模式、Redis发布订阅模式。

Redis队列模式实现原理:
消息队列通过Redis 的 list(列表)来实现。
redis队列模式(两种命令方式,均满足 先进先出 的队列模式):lpush rpop :非阻塞式 、lpush brpop :阻塞式 ( 推荐此种方式 ,阻塞读在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来)。

消息延时队列:
延时队列可以通过 Redis 的 zset(有序集合) 来实现,主要用到了 Redis 的三个命令,ZADD、ZREM 和 ZRANGEBYSCORE。。
实现思路:
zadd 用于向有序集合中添加一条或多条数据,score 作为数据处理时间(当前时间戳+多少秒后处理数据),value 存放数据(不能重复)。
zrangebyscore 用于获取有序集合中指定时间范围内的数据(小于当前时间)
zrem 用于将一条或多条数据从有序集合中移除。

计数器
类型:string
命令:incr有默认的增长值 1;incrby 必须指定一个增长值,不然会报错;
命令:decr有默认的减少值 1;decrby 必须指定一个减少值,不然会报错;

缓存穿透,缓存击穿,缓存雪崩原因+解决方案
缓存穿透: 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过。
解决方案:
1、接口层增加校验,如id<=0直接拦截。
2、使用布隆过滤器,把所有不合法值缓存起来。
3、如果缓存和数据库中都没有的数据,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。

缓存击穿:缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大。
解决方案:
1、使用互斥锁,就是在缓存失效的时候(判断拿出来的值为空),不是立即去数据库读数据,而是先使用互斥锁,其他并行的线程等待几秒,再重新去缓存读数据,这样就防止都去数据库重复取数据,重复往缓存中更新数据情况出现。
2、设置热点数据永远不过期。

缓存雪崩: 缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机。
解决方案:
1、缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2、设置热点数据永远不过期。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值