Redis的使用 | 青训营

61 阅读4分钟

1.Redis是一个开源的内存数据存储系统,它可以用作数据库、缓存和消息代理。此外,它还支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,在不同场景下都能发挥作用。

Redis 的主要特点是将数据存储在内存中,这使得读写操作非常快速。所有的数据都存储在内存中,而硬盘用于持久化数据。因为内存速度远高于硬盘,所以 Redis 能够实现非常低延迟的数据访问。

Redis 支持数据持久化,可以将数据保存到硬盘上,以便在服务器重启后恢复数据。Redis 提供两种持久化方式:

  • RDB(Redis Database)快照:将当前数据库的数据保存到一个二进制文件中,用于全量备份。
  • AOF(Append Only File)日志:将每条写操作追加到一个文件中,用于记录所有写操作,以便在服务器重启后重放这些操作,实现数据恢复。

2.Redis的应用场景非常多,如连续签到、消息通知、计数、排行榜等场景。

以连续签到为例,首先需要连接到Redis数据库;

其次,我们记录用户签到,将用户签到信息存储到Redis中:

Jedis jedis = new Jedis("localhost", 8888);

String userId = "user123";
long currentTimeMillis = System.currentTimeMillis();
jedis.zadd("user_signins:" + userId, currentTimeMillis, String.valueOf(currentTimeMillis));

然后进行连续签到的判断,可以查询有序集合的成员个数来获取用户签到次数,并且通过查询最后一次签到的时间来判断是否连续

// 查询用户签到次数
long signinCount = jedis.zcard("user_signins:" + userId);

// 查询最后一次签到的时间戳
String lastSigninTimestamp = jedis.zrange("user_signins:" + userId, -1, -1).iterator().next();

// 判断是否连续签到
long currentTimeMillis = System.currentTimeMillis();
long lastSigninTime = Long.parseLong(lastSigninTimestamp);
boolean isContinuous = (currentTimeMillis - lastSigninTime) <= 24 * 60 * 60 * 1000; // 判断是否在一天之内

3.Redis使用注意事项:

1)大Key有两种,一种是String类型中value的字节数大于10KB即为大key;而针对其他如Hash、Set等复杂的数据结构类型,大key是指元素个数大于5000个或总value字节数大于10MB的。

其有一定的危害,比如读取成本高,容易导致慢查询,主从复制异常等问题。

消除大Key有以下方法:一是拆分,将大key拆分为小key;二是压缩,将value压缩后写入redis;三是针对集合类结构的大key,可以采取拆分或者区分冷热的方法。

热Key是指用户访问一个Key的QPS特别高,导致Server实例出现CPU负载突增或者不均的情况。

解决热Key有以下方法:一是设置Localcache,即在访问Redis前,在业务服务测设置Localcache,降低访问Redis的QPS;二是拆分,将key:value这一热key复制写入多份;三是使用Redis代理的热Key承载能力。

2)要避免一些容易导致redis慢查询的操作。

3)缓存穿透:是指热点数据查询绕过缓存,直接查询数据库;

缓存雪崩:是指大量缓存同时过期。

这两种情况都是在使用redis时需要注意避免的情形。

思考:Redis相比于传统的数据存储方法的优点在哪里?

通过查询资料,总结出了以下几点:

  1. 高性能:Redis 是基于内存的数据库,具有非常高的读写性能,适合处理高速读写的场景,比传统的基于磁盘的数据库要快很多。
  2. 低延迟:由于数据存储在内存中,Redis 能够实现非常低的读写延迟,适合对实时性要求高的应用场景。
  3. 支持多种数据结构:Redis 支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,使得开发者能够更灵活地处理不同类型的数据。
  4. 缓存功能:Redis 可以作为缓存层,将热门的数据存储在内存中,减轻后端数据库的压力,从而提升整体系统的性能。
  5. 持久化选项:Redis 支持多种持久化方式,可以将数据持久化到磁盘,保证数据不会因为系统重启而丢失。
  6. 原子操作:Redis 提供了多种原子操作,可以实现复杂的数据操作,如计数器、分布式锁等,保证数据的一致性。
  7. 发布订阅机制:Redis 支持发布订阅模式,可以用于实现实时消息推送、事件通知等功能。