redis的基础知识
非关系型数据库是什么?有哪些?
非关系型数据库是相对于关系型数据库而言,一般不遵循ACID原则,不适合存储 海量数据和较为复杂的数据。redis、mem redis是c语言开发的。 mem的value是没有类型的
redis的端口号是什么?
6379
redis的客户端启动命令
redis-cli
redis一共多少个库
16个库
切换库
select 数字
redis项目中使用场景?
分布式锁、限流器(手机号登录频次、短信发送频次、某业务功能的使用频次) app首页访问流量高峰,支付高峰。 将常用和主要的数据,比如用户登录信息存储。使用redis时,要考虑数据是否常用, 数据命中率是否高,如果命中率低就没必要写入redis。读多写少可以放redis。数据量 很大,比如几百M,没必要放入redis。
reids的优缺点有哪些?
优点:- 读写性能优异。redis读速度是11w次/s,写速度是8W次/s- 支持数据持久化。RDB和AOF- 支持事务。reids所有的操作都是原子性的,还支持操作后的原子性- 数据结构丰富- 支持主从复制,可以进行读写分离缺点:- 容易受物理内存的影响,不能做海量数据读写- 主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端ip- 主机宕机,会有部分数据不能及时同步到从机- 不支持在线扩容
使用redis可能会出现的问题有哪些?
-
缓存雪崩 同一时间访问缓存失败,大量请求都访问数据库,导致数据库压力很大。原因是缓存中 数据失效时间是相同的,并且redis恰好将这部分数据删除。解决办法是:将缓存时间加一个 随机值,这样就会大幅降低同一时间失效。 如果是reids挂了,请求全部走数据库这种情况,解决办法是:实现redis的高可用,主从 架构;如果redis挂了,设置限流。redis重启后,进行持久化。 -
缓存穿透 查询一个缓存中不存在的数据,此时就会走数据库,大量请求会导致缓存不命中。 解决办法是:接口层增加校验,比如用户鉴权、参数校验; 将不存在的key的值设置为null放入缓存,设置一个略短的过期时间,一般是30s; 可以对单个ip访问做出访问上限; 使用布隆过滤器提前拦截,布隆过滤器的原理是: 利用算法高效判断出key是否存在,不存在就直接return。 -
双写一致性
redis 是单线程的还是多线程的?redis为什么这么快?
redis实例不是单线程的。 redis 单线程指的是网络请求模块使用一个线程,所以不需要考虑并发安全性。即一个线程处理所有网络请求,其他模块仍用了多个线程。 redis是基于Reactor模式开发了网络请求处理器,这个处理器是的消费是单线程的。redis 4新增了惰性删除是异步的, redis 6 新增了处理网络IO的多线程功能,redis 6 支持多线程主要在IO读写能力上,但是处理网络请求的执行命令的核心模块还是单线程。 redis 4之前单线程依然快的原因是:cpu不是redis的瓶颈,内存和带宽才是,基于内存操作、结构简单、IO多路复用、非阻塞IO、避免不必要的线程上下文切换,操作系统有一个内核的概念kernel,客户端连接先到达内核,redis进程和内核之间使用的是epoll,非阻塞的多路复用的概念。
epoll (IO模型)
计算机内核可以接收多个客户端连接, socket 是阻塞的,会有一个线程去等待读取请求,没有获取请求就阻塞,BIO (blocking) 这样就造成了资源浪费,因此,内核中网络IO进行了改良,发展为NIO (NoBlocking),同步非阻塞时期, 最后是多路复用NIO,为了减少内核态和用户态之间的切换 Linux内核中网络IO的演变过程
redis为什么这么块?
早期数据存在磁盘上,磁盘的寻址是毫秒级别,内存的寻址是纳秒级别,因此磁盘比内存慢 reids是基于内存存储的非关系型数据库,不需要进行磁盘IO,比传统数据库要快 单线程,无锁竞争,没有CPU上下文切换
redis 分布式锁
set key value nx : 如果设置成功会返回true,如果设置失败会返回nil 是一个原子操作
redis的value的数据结构有哪些?
string hash list set sortedset HyperLogLog Geospaysh Pub/Sub
string
type key : 查看key的类型 incrby key 22 : 字符串拼接 / 数字相加 decrby key 22 : 减法
incr 秒杀、抢购,可以规避对数据库的事务的操作,由redis 内存替代。微博中的点赞、评论数、好友数,看似不是特别重要的数据,不需要精准的可以使用redis, 关系到金额的需要染指事务。
bitmap
常用命令
setbit key len v bitcount bitpos bitop
使用场景
- 用户在线状态
- 统计活跃用户
- 用户签到
- 统计用户在一定范围时间内的登陆天数,用户登录的时候登记,且支持随即窗口查询
传统的做法是:在关系型数据库中创建一张用户登陆表,记录用户登录信息,如果数 据量比较大,在查询的时候,效率不会很高。因此需要优化。使用redis来处理。 bitcount - 电商活动周,对于登录的用户送礼物,假设一共有注册会员2E,相同用户登录最多送一次礼物,需要备货多少?
用户分为僵尸用户、忠诚用户、冷热用户, 因此要知道活跃用户量,才能避免过度备货,节省资金。 比如 1号-3号,一共有多少,相同用户去重
setbit 20200101 a 1
setbit 20200102 a 1
setbit 20200102 b 1
bitop or destkey 20210101 20200102
bitcount destkey 0 -1
https://www.cnblogs.com/wuhaidong/articles/10389484.html
|