简介:本文详细介绍了Redis的基础概念、核心特性、数据结构、持久化机制、集群部署及实际应用场景,帮助开发者快速掌握Redis的核心技术,适用于初学者及进阶开发者。
Redis(Remote Dictionary Server)是一个开源的、基于内存的键值对数据库,支持多种数据结构(如字符串、哈希、列表、集合等),因其高性能和灵活性被广泛应用于缓存、消息队列、实时分析等场景。其核心优势体现在以下方面:
save 60 10000表示每60秒内至少10000次修改时触发快照。INCR key)。HSET user:1000 name "Alice" age 30。LPUSH/RPOP实现消息队列。MULTI/EXEC实现事务。例如:
MULTISET key1 "value1"INCR counterEXEC
RDB(快照持久化)
通过save或bgsave命令生成数据快照,配置示例:
save 900 1 # 900秒内至少1次修改save 300 10 # 300秒内至少10次修改
适合灾难恢复,但可能丢失最后一次快照后的数据。
AOF(追加文件持久化)
记录所有写操作命令,支持always/everysec/no三种同步策略。配置示例:
appendonly yesappendfsync everysec
数据更安全,但文件体积较大。
主从复制
通过SLAVEOF命令建立主从关系,从库异步复制主库数据。例如:
redis-cli> SLAVEOF 192.168.1.100 6379
适用于读写分离,但主库故障时需手动切换。
哨兵模式(Sentinel)
监控主从节点,自动故障转移。配置示例:
sentinel monitor mymaster 192.168.1.100 6379 2
其中2表示至少2个哨兵同意才执行切换。
Redis Cluster通过分片实现水平扩展,支持1000个节点以上的大规模部署。关键特性:
CRC16(key)%16384分配到16384个槽。redis.conf启用集群模式:
cluster-enabled yescluster-config-file nodes.conf
redis-cli --cluster create初始化集群。
// 使用布隆过滤器过滤无效请求BloomFilter<String> filter = BloomFilter.create(...);if (!filter.mightContain(key)) {return null;}
// 为不同key设置随机过期时间int ttl = 60 + new Random().nextInt(30);redisTemplate.expire(key, ttl, TimeUnit.SECONDS);
使用SETNX实现简单分布式锁:
String lockKey = "order_lock";String lockValue = UUID.randomUUID().toString();try {Boolean success = redisTemplate.opsForValue().setIfAbsent(lockKey, lockValue, 30, TimeUnit.SECONDS);if (Boolean.TRUE.equals(success)) {// 执行业务逻辑}} finally {// 释放锁(需校验锁归属)if (lockValue.equals(redisTemplate.opsForValue().get(lockKey))) {redisTemplate.delete(lockKey);}}
使用Redis+Lua脚本实现令牌桶算法:
-- KEYS[1]: 令牌桶key-- ARGV[1]: 容量-- ARGV[2]: 速率(个/秒)-- ARGV[3]: 当前时间戳local key = KEYS[1]local capacity = tonumber(ARGV[1])local rate = tonumber(ARGV[2])local now = tonumber(ARGV[3])local last_time = redis.call("HGET", key, "last_time")last_time = last_time and tonumber(last_time) or nowlocal tokens = redis.call("HGET", key, "tokens")tokens = tokens and tonumber(tokens) or capacitylocal new_tokens = math.min(capacity, tokens + (now - last_time) * rate)if new_tokens < 1 thenreturn 0endredis.call("HSET", key, "last_time", now)redis.call("HSET", key, "tokens", new_tokens - 1)return 1
内存优化
INFO memory查看内存使用情况。maxmemory-policy选择淘汰策略(如volatile-lru)。慢查询日志
配置slowlog-log-slower-than 10000记录执行超过10ms的命令,通过SLOWLOG GET分析。
监控工具
redis_exporter采集指标。Redis入门需掌握三个层次:
学习路径建议:
通过本文,开发者可系统掌握Redis的核心技术,为后续深入学习分布式系统、大数据处理等领域打下坚实基础。