很多文章和书籍都有介绍 Redis 的基础理论知识,单纯的理论介绍很难让我们轻松的理解。
即使翻阅再多的书籍,遇到雪崩还是傻眼…
比如这个问题,1000 个线程压测时 Redis Incr 出现错误,就是 Timeout,怎么排查?
就问你看完那么多理论篇后能一下子给出解决方案不?
这种情况我建议:
先查看一下与 Redis 服务器相连的配置项是否正确,比如说 Maxidle、Maxwait、MaxActive 等。
然后看一下压测服务器以及 Redis 服务的资源情况如何,常见的 CPU、内存、磁盘、Load 等。
重点看一下 Redis 的连接数是什么情况,是不是连接数过多,导致超时,对比一下最大连接数和当前连接数。
又比如,Redis 集群很多个 Redis 的话,是把多个 IP 全部写到代码里面,那会不会导致压力不均衡?
我的回答是:Redis Cluster 集群模式,自动实现负载均衡的。哨兵其实就是一个监控或者容灾的作用,它下面实际的数据提供还是主从模式,所以如果是哨兵模式就不存在压力不均衡的模式了。
还有同学问到,一个转行的本科生即将干 Java 开发,想考一个本行业的研究生,有什么大学和专业和书本和实操推荐?
这些都能在 BAT 资深工程师写的这篇《Redis 场景实战解析》里得到答案。作者没有拘泥于原理去说,而是借用工作中会遇到的场景阐述怎样使用。通过本文我们能学习到:
- Redis 各个知识点在业务场景中的使用方式;
- Redis 可能遇到的困难以及解决方案(穿透、雪崩等);
- Redis 分布式环境的使用方案(分布式锁、自增 ID 等);
- Redis 集群模式总结;
- Redis 面试题目总结。
目前只需要 9.9 元就能学习到这些技能,而且还有作者根据大厂打量的面试题,已经有 1200 多人开始学习了 ?
Redis 基本数据结构与实战场景
基本类型
我们用一个简单的导图来简单复习一下 Redis 的基本数据类型:
常用指令
接下来看看每个数据结构常用的指令有哪些,我们用一张表比较清晰的展示:
序号 | 数据结构 | 常用命令 | 命令实例 |
---|---|---|---|
1 | String | 1.set :设置 key 对应的 value 值 2.get : 获取对应 key 的值,如不存在返回 nil 3.setnx : 只有设置的值不存在,才设置 4.setex :设置键值,并指定对应的有效期 5.mset/mget : 一次设置/获取多个 key 的值 6.incr/decr : 对 key 值进行增加 / 减去 1 操作 | 1.set name “tom” 2.get name 结果 :tom 3.setnx name “jim” 4.setex name 10 “tom” 5.mset key1 “hh” key2 “kk” 6.+1/-1 |
2 | list | 1.lpush/rpush :在 key 所对应的 list 左 / 右部添加一个元素 2.lrang/lindex :获取列表给定范围 / 位置的所有值 3.lset :设置 list 中指定下表元素的值 | 1.lpush list_name value1; rpush list_name value2 2.lrang list_name 0 -1 获取列表所有元素 3.lset list_name 1 valuex |
3 | set | 1.sadd :向名称 为key 的 set 添加元素 2.smembers :查看集合中的所有成员 3.spop :随机返回并删除 set 中一个元素 4.sdiff :返回所有 set 与第一个 set 的差集 5.sunion :返回给定集合并集 | 1.sadd wordset aa; sadd wordiest bb; 2.smembers wordset 3.spop wordset 4.sdiff wordset wordset1 5.sunion wordset wordset1 |
4 | hash | 1.hset :设置一个 hash 的 field 的指定值,如果 key 不存在先创建 2.hget :获取某个 hash 的某个 filed 值 3.hmset/hmget :批量设置 / 获取 hash 内容 4.hlen :返回 hash 表中 key 的数量 5.hkeys/hvals :返回 hash 表中所有的 key/value | 1.hset user name “tom" 2.hget user name 3.hmget user name sex 4.hlen user 5.hkeys user / hvals user |
5 | Sorted set | 1.zadd :将一个带有给定分值的成员添加到有序集合里面 2.zrange :取出集合中的元素 3.zcard :返回集合中所有元素的个数 | 1.zadd key 1 hello 2.zrang key 0 -1 3.zcard key |
####2.3 场景解析
String 类型使用场景
场景一:商品库存数
从业务上,商品库存数据是热点数据,交易行为会直接影响库存。而 Redis 自身 String 类型提供了:
incr key && decr key && incrby key increment && decrby key decrement
set goods_id 10;
设置 id 为 good_id 的商品的库存初始值为 10;decr goods_id;
当商品被购买时候,库存数据减 1。
依次类推的场景:商品的浏览次数,问题或者回复的点赞次数等。这种计数的场景都可以考虑利用 Redis 来实现。
场景二:时效信息存储
Redis 的数据存储具有自动失效能力。也就是存储的 key-value 可以设置过期时间:set(key, value, expireTime)
。
…
由于篇幅有限,将近 2w 字的干货没法全部附上,你们可以直接扫描二维码阅读。