redis总结

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

list

基本命令
  • Lpush : Lpush k a b c
    从左边开始放,先放a
  • Rpush:Rpush k a b c
    从右边开始放,先放c
  • Lpop:Lpop k
    从左边弹出一个元素,c
    先进后出,栈的数据结构
  • Rpop:Rpop k
    从右边弹出一个元素,a
    先进后出,栈的数据结构
  • Lrange:lrange k start end 实现队列
  • Lindex:Lindex k a 实现数组,获取元素下标
  • Lrem:Lrem k 2 a 移除2个a

hash

hIncrbyInteger k 1 : 可以进行计算
应用场景是:点赞、收藏、详情页、
hash 是一种简单的document,只不过value是hash

set

是一种去重的集合,不维护排序
sadd:添加
smembers:获取成员
sinter:取交集
sinterstore:取交集并存入一个新的集合中
sunion:取并集
sdiff:取差集
sdiff a b :结果是a中没有存在b中的结果
sdiff b a :结果是b中没有存在a中的结果
srandmember:
srandmember key count:count 是正数时候,随机取一个去重的结果集(不能超过已有集)
srandmember key count :count 是负数时,随机一个带重复的结果集
随机事件可以解决随机抽奖
spop k:随机弹出一个元素

sortedset

从小到大有序的不重复集合
zadd k1 8 apple 2 banana 3 orange : 存入三个元素,分值分别为 8 、2 、 3
zrange k1 0 -1 : 取出元素
apple banana orange
0 1 2
-3 -2 -1
zrange k1 0 -1 withscores : 取出带分数的元素
zrangebyscore k1 3 8 : 取出分数为3和8的元素
zrange k1 0 1 : 由低到高取出两个元素
zrevrange k1 0 1 : 由高到低取出两个元素
zscore k1 apple : 根据元素取出分值
zrank k1 apple : 取出元素的排名
zincrby k1 2.5 banana : 为元素增加分值
应用场景:排行榜,实时变更排序状态,若使用数据库,需要考虑事务,redis是单线程的,不需要考虑这些。

sortedset的集合操作
zunion 2 k1 k2 

sortedset 的排序是怎么实现的增删改查的速度

redis 提供有序集合比如zadd zrange 底层实现的原理是skip list 。
跳表这种随机的数据结构,可以看作是一个二叉树的变种,它在性能上与红黑树、AVL树很相近,但是跳表的实现比两者简单很多,

管道

批量发送命令,让通信成本变低

使用

yum install nc // 安装nc 命令
nc localhost 6379 // 建立scoket 通道

使用场景

对于实时性的,使用发布订阅
对于历史消息,使用数据库

redis 的事务

redis 不支持事务回滚,这种做法的优点是:redis只对错误的语法失败,当有报错时,会继续执行余下的命令,因为不需要回滚,因此内部可以保持简洁而快速。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值