1.缓存:
将频繁访问的数据存储在 Redis 中,以加速数据检索和响应速度。
示例
import redis.clients.jedis.Jedis;
Jedis jedis = new Jedis("localhost", 6379);
jedis.set("cache_key", "cache_value");
2.会话管理:
将用户会话数据存储在 Redis 中,以支持会话状态共享和快速访问。
示例
import redis.clients.jedis.Jedis;
Jedis jedis = new Jedis("localhost", 6379);
jedis.hset("user_session:123", "id", "123");
jedis.hset("user_session:123", "username", "example_user");
3.队列:
使用 Redis 的列表数据结构作为消息队列,用于异步任务处理、事件驱动等场景。
示例
import redis.clients.jedis.Jedis;
Jedis jedis = new Jedis("localhost", 6379);
jedis.lpush("task_queue", "task_data");
基于List的消息队列有哪些优缺点?
优点:
- 利用Redis存储,不受限于JVM内存上限
- 基于Redis的持久化机制,数据安全性有保证
- 可以满足消息有序性
缺点:
- 无法避免消息丢失
- 只支持单消费者
4.计数器和统计:
使用 Redis 的原子操作,如 INCR,来实现计数器和统计功能,如网站访问量计数、点击次数统计等。
示例
import redis.clients.jedis.Jedis;
Jedis jedis = new Jedis("localhost", 6379);
jedis.incr("page_views");
5.发布/订阅:
使用 Redis 的发布/订阅功能实现消息传递和事件通知,支持实时更新和广播消息。
示例
import redis.clients.jedis.Jedis;
Jedis jedis = new Jedis("localhost", 6379);
jedis.publish("channel_name", "message_data");
6.分布式锁:
使用 Redis 的分布式锁机制来确保多个进程或节点对共享资源的安全访问。
示例
import redis.clients.jedis.Jedis;
Jedis jedis = new Jedis("localhost", 6379);
String lockKey = "lock_key";
String lockValue = "lock_value";
String result = jedis.set(lockKey, lockValue, "NX", "EX", 10);
if (result != null && result.equalsIgnoreCase("OK")) {
// 已获取到锁
} else {
// 未获取到锁
}
7.队列系统:
Redis提供了可靠的消息队列,可以用于异步任务和应用程序间的通信。
# Python 示例代码使用redis-py客户端
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
r.lpush('task_queue', 'task1')
task = r.brpop('task_queue', 10)
8.限流和速率控制:
使用 Redis 的计数器和过期时间等功能来实现限流和速率控制,防止系统过载和恶意攻击。(如一天之内只能访问100次接口,如果超过就返回)
示例
import redis.clients.jedis.Jedis;
Jedis jedis = new Jedis("localhost", 6379);
Long count = jedis.incr("user:request_count");
if (count == 1) {
jedis.expire("user:request_count", 3600);
}
if (count > MAX_REQUESTS_PER_HOUR) {
// 超过限流阈值,拒绝请求或执行相应处理
}
9.使用sorted set做排行榜数据
10. 地理位置应用:
使用 Redis 的地理位置数据结构和功能来存储和查询地理位置信息,支持地理位置服务和应用。
示例
import redis.clients.jedis.GeoCoordinate;
import redis.clients.jedis.Jedis;
Jedis jedis = new Jedis("localhost", 6379);
// 存储地理位置信息
jedis.geoadd("locations", longitude, latitude, "location_name");
// 查询附近的地理位置信息
List<GeoCoordinate> nearbyLocations = jedis.georadius("locations", longitude, latitude, radius, Ge
11.使用INCRBY生成全局分布式ID
使用Redis 计数器实现,自增序列以天为单位存储,在实际业务中,比如生成订单编号组成规则都类似NO1699631999000-1(业务标识key+当前时间戳+自增序列)
public String generateId(String key) {
// 获取对应业务自增序列
Long incr = getIncr(key);
// 组装最后的结果,这里可以根据需要自己定义,这里是按照业务标识key+当前时间戳+自增序列进行组装
String resultID = key + System.currentTimeMillis() + "-" + incr;
return resultID;
}
12.实现延时队列
基于 Redis 目前有三种方式可以实现延时队列:
1、利用 Redis 过期消息实现延时队列。Redis 允许我们为每一个 key 设置过期时间,在 key 过期时,Redis 可以配置为发送一个过期事件。在应用程序通过监听这个过期事件,就可以实现延迟队列了。
2、使用 Sorted Set 实现延时队列:将任务的执行时间戳作为score,将任务数据作为value,将任务插入到zset中,每个任务有一个唯一的id(比如订单id),以及任务执行时间(比如30min),任务内容(比如订单超时支付系统自动取消)等信息体。然后另起一个线程,该线程会周期性地从zset中取出score小于当前时间戳的任务并执行,执行任务后,通过Redis的remove命令删除已经成功执行的任务即可。
3、Redisson 实现延迟队列