运维操作
object encoding key
消息队列
Pub/Sub
Stream
事务操作
脚本函数
Redis 性能测试
Redis 性能测试是通过同时执行多个命令实现的
redis 性能测试的基本命令如下:
redis-benchmark [option] [option value]
| 序号 | 选项 | 描述 | 默认值 |
|---|---|---|---|
| 1 | -h | 指定服务器主机名 | 127.0.0.1 |
| 2 | -p | 指定服务器端口 | 6379 |
| 3 | -s | 指定服务器 socket | |
| 4 | -c | 指定并发连接数 | 50 |
| 5 | -n | 指定请求数 | 10000 |
| 6 | -d | 以字节的形式指定 SET/GET 值的数据大小 | 2 |
| 7 | -k | 1=keep alive 0=reconnect | 1 |
| 8 | -r | SET/GET/INCR 使用随机 key, SADD 使用随机值 | |
| 9 | -P | 通过管道传输 |
1 |
| 10 | -q | 强制退出 redis。仅显示 query/sec 值 | |
| 11 | –csv | 以 CSV 格式输出 | |
| 12 | ***-l*(L 的小写字母)** | 生成循环,永久执行测试 | |
| 13 | -t | 仅运行以逗号分隔的测试命令列表。 | |
| 14 | ***-I*(i 的大写字母)** | Idle 模式。仅打开 N 个 idle 连接并等待。 |
分布式session
分布式缓存
分布式锁
锁用于解决资源竞争问题
一个线程在操作资源时另一个线程也操作该资源可能会导致操作异常。例如:
a = 6
A线程:
- 判断a是否为2的倍数,若是则执行第2步,否则操作结束
- a = a + 2
B线程:
- 判断a是否为3的倍数,若是则执行第二步,否则操作结束
- a = a + 3
并发场景下,在A和B线程各自执行一次操作后a的值有如下可能
11
8
9
对于a1、a2、b1、b2四步操作,并发环境下,a1->a2、b1->b2的顺序是一定的,b1可能会在a1执行之后a2执行之前执行
此时需要对a加锁,A线程与B线程竞争获取锁,获取到锁的线程执行其两步操作后再释放锁,这样可以保证A线程和B线程的操作不会交叉执行
本地锁、分布式锁
本地锁保证当前服务中对某资源的操作安全,而对于分布式服务束手无策,此时需要引入分布式锁。
分布式锁方案
互斥:互斥是分布式锁的最基本的条件,使得程序串行执行
高可用:程序不易崩溃,时时刻刻都保证较高的可用性
高性能:由于加锁本身就让性能降低,所有对于分布式锁本身需要他就较高的加锁性能和释放锁性能
可重入,解决自身死锁问题
非阻塞+重试,不永久阻塞
自动续期
上面都是技术问题
下面才是业务问题
短信登录
商品秒杀
文章点赞
朋友圈
附近商户
用户签到
UV 统计
短信登录
- 基于session
- 基于redis解决session不共享问题,token(扩展为tomcat集群)
商户数据查询缓存
缓存穿透
被动防止
- 缓存空对象,优缺点
- 布隆过滤器,优缺点
主动防止
给id进行编码,设定规范,首先进行格式校验
史上最全springcloud
缓存雪崩
- 大量TTL同时到期,致使数据库压力过大甚至过期,尤其是批量导入时,增加随机数
- redis宕机,使用集群增加可用性
针对缓存业务进行降级限流
不仅redis这一层缓存,使用多级缓存
缓存击穿(热点key,即高并发访问且缓存重建业务比较复杂)
help setnx
秒杀券
- 超卖问题
- 线程安全问题
- 悲观锁
- 乐观锁
- 版本号法
- 实际场景的特殊,以库存作为版本号,CAS,本场景下一般失败率很高
- 线程安全问题
- 一人一单
- 分布式锁,基于redis的分布式锁,10s
- 锁误删
考虑问题从单机和集群两方面考虑
连锁,建不建立主从都可
异步秒杀,1.redis库存余量及购买资格判断并抢单,2.阻塞队列异步创建订单
存在问题,基于JDK内存存储数据,宕机如何,内存限制和数据安全问题
消息代理
rebbitmq、rocketmq、kafka
redis
redis实现消息队列
List阻塞方式(最基本点对点)
PubSub
中括号是可选参数、尖括号是必选参数
秒杀业务
单机:
库存超卖
一人一单,锁userId
集群:
分布式锁:锁误删问题(验证线程锁标记)、锁原子性问题(使用redis脚本,lua)、框架redssion
异步秒杀,redis完成判权、消息代理完成订单创建、redis消息队列
滚动分页,随时数据插入时,不能根据角标分页
Geo,基于ZSet
BitMap,基于String
BitMap,签到,优化签到,存数据库可能一个用户一天签到一行数据,假设一千万用户,平均一年30次,则一年3亿条
UV,unique visitor,独立访客量
PV,page、view,页面访问或者点击量
LogLog算法
HyperLogLog算法原理讲解 掘金
跨域问题???
基础
Redis API,Jedis、Lu,Spring Data封装
RedisTemplate,常用StringRedisTemplate
事务可以被中断么???
核心问题:redis到底使用内存如何
业务应用
基于session实现登录,服务器集群session共享,使用redis,分布式session
redis作为数据库缓存,缓存首页大栏信息,商铺信息等
- 缓存穿透,空类型、布隆过滤器
- 缓存击穿,互斥锁、逻辑过期
- 缓存雪崩
- 给不同的key的ttl添加随机变量
- 使用redis集群
- 缓存业务添加限流措施
- 业务添加多级缓存
秒杀业务
- 秒杀商品超卖
- 一人一单,redis操作的原子性,基于脚本和redis是单线程,乐观锁
- 服务器集群下使用redis构建分布式锁解决一人一单的线程安全问题
- 分布式锁误删问题、分布式锁原子性问题
- redis集群下分布式锁的处理
- 统合框架redission
- 锁重试
- 多重锁
- 异步秒杀
- 阻塞队列
- 消息代理
- redis,PubSub、Stream
用户动态模块
- 动态发布
- 动态查询
- 点赞功能
- 点赞排行榜
- 关注、取关、共同关注
- 动态推送
- 推拉结合
- 滚动分页
用户签到,BitMap
附近用户,geospatial
- 导入经纬度
- 排完序从数据库拿数据,前提是优化in
Unipue View,HyperLogLog
- 百万数据统计,假设有百万用户、千万用户
如何将redis与mysql封装隐藏缓存的处理???