一、概述
Redis
是互联网技术领域使用最为广泛的存储中间件,它是Remote Dictionary Service(远程字典服务)
的首字母缩写,Redis
以其超高的性能、活跃的社区、详细的文档以及丰富的客户端库支持在开源中间件领域广受好评,国内外很多大型互联网都在使用Redis
,比如:Github
、新浪微博、阿里巴巴、京东、Stack Overflow
等,可以说,深入了解Redis
应用和实践,已成为如今中高级后端加法绕不开的必备技能。
二、Redis常见应用场景
三、Redis有哪些数据结构
3.1 String字符串
🔥字符串典型的使用场景:
- 单值缓存
- 对象缓存
- 计数器
- 分布式锁
单值缓存
127.0.0.1:6379> set num 1
OK
127.0.0.1:6379> get num
"1"
127.0.0.1:6379>
复制代码
单值缓存
SET user:1 value(json格式数据)
复制代码
计数器
文章阅读量、点赞量、评论量
127.0.0.1:6379> incr article:read:id1
(integer) 1
127.0.0.1:6379> incr article:read:id1
(integer) 2
127.0.0.1:6379> incr article:up:id1
(integer) 1
127.0.0.1:6379> incr article:up:id2
(integer) 1
127.0.0.1:6379> incr article:comment:id1
(integer) 1
127.0.0.1:6379> incr article:comment:id1
(integer) 2
127.0.0.1:6379>
复制代码
分布式锁
- setnx
定时任务防止同一时刻重复执行,可以在业务执行代码前使用分布式锁控制。
127.0.0.1:6379> setnx job GlobalNotifyJob
(integer) 1
127.0.0.1:6379> get job
"GlobalNotifyJob"
127.0.0.1:6379> ttl job
(integer) -1
127.0.0.1:6379>
复制代码
伪代码如下:
@Slf4j
@Component
public class GlobalNotifyJob {
private static final String LOCK_KEY = "redis_notify_lock";
/**
* 每小时执行一次
*/
@Scheduled(cron = "0 0 0/1 * * ?")
public void notify() {
if (!lockService.grabLock(LOCK_KEY)) {
log.info("[GlobalNotifyJob] 没有拿到锁, 停止操作......");
return;
}
// 拿到锁,开始执行业务...
}
}
复制代码
- setex + 过期时间【SETNX KEY_NAME TIMEOUT VALUE】
127.0.0.1:6379> setex key1 60 value1
OK
127.0.0.1:6379> ttl key1
(integer) 53
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379>
复制代码
hash哈希
🔥哈希典型应用场景:
- 缓存对象信息(帖子标题、摘要、作者信息)
- 记录帖子的点赞数、评论数和点击数
- 电商购物车
命令 | 描述 |
---|---|
HSET key field value | 存储一个哈希表key的键值 |
HSETNX key field value | 存储一个不存储的哈希表key的键值 |
HMSET key field value [field value...] | 在一个哈希表key中存储多个键值对 |
HGET key field value | 获取哈希表key对应的field键值 |
HMGET key field value | 批量获取哈希表key中多个field键值 |
HDEL key field [field ...] | 删除哈希表key中多个field的键值 |
HLEN key | 返回哈希表key中field的数量 |
HGETALL key | 返回哈希表key中所有的键值 |
127.0.0.1:6379> hmset user:1 name austin age 25 address guangzhou ba