一、简介
分布式缓存是分布式系统中的重要组件,主要解决高并发、大数据场景下,热点数据访问的性能问题,提供高性能的数据快速访问。
使用缓存常见场景是:项目中部分数据访问比较频繁,对下游 DB(例如 MySQL)造成服务压力,这时候可以使用缓存来提高效率。
缓存组件有很多种,大家熟知的 Redis、Tair、MemCache 等。今天我们重点介绍 Redis 缓存数据库相关的内容知识。
Redis 是开源免费,性能不错的 key-value 数据库。Redis 的特点包括:
- Redis 除了支持 key-value 类型的数据,同时还支持其他多种数据结构的存储;
- Redis 支持数据持久化存储,可以将数据存储在磁盘中,机器重启数据将从磁盘重新加载数据;
- Redis 支持数据的备份,即 Master-Slave 模式的数据备份。
Redis 作为缓存数据库和 MySQL 这种结构化数据库进行对比。
- **从数据库类型上,**Redis 是 NoSQL 半结构化缓存数据库, MySQL 是结构化关系型数据库;
- **从读写性能上,**MySQL 是持久化硬盘存储,读写速度较慢, Redis 数据存储读取都在内存,同时也可以持久化到磁盘,读写速度较快;
- **从使用场景上,**Redis 一般作为 MySQL 数据读取性能优化的技术选型,彼此配合使用。
接下来我们将重点向大家介绍关于 Redis 几个方向的知识内容:
- Redis 基本数据结构与实战场景
- Redis 常见异常及解决方案
- 分布式环境下常见的应用场景
- Redis 集群模式的介绍与总结
- Redis 常见面试题目详解
二、Redis 基本数据结构与实战场景
2.1 基本类型
我们用一个简单的导图来简单复习一下 Redis 的基本数据类型:
2.2 常用指令
接下来看看每个数据结构常用的指令有哪些,我们用一张表比较清晰的展示:
序号 | 数据结构 | 常用命令 | 命令实例 |
---|---|---|---|
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 场景解析
2.3.1 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)
。
比如,用户登录某个 App 需要获取登录验证码, 验证码在 30 秒内有效。那么我们就可以使用 String 类型存储验证码,同时设置 30 秒的失效时间。
keys = redisCli.get(key);
if(keys != null)
{
return false;
}