基础篇
基础命令
exists:检查某个键是否存在hexists:检查哈希表中某个字段是否存在,用法:hexists key fieldselect 1:切换数据库为db1set mykey value ex 60:设置过期时间为60秒,ex 60可选set mykey value222 nx:当mykey不存在时才添加数据,nx可选set mykey value333 ex 60 nx:当mykey不存在时添加数据,并设置过期时间为60秒
数据类型
String:原子操作加减Hash:存储商品的各属性List:有序集合,底层实现为双向链表Set:可以存储用户点赞收藏的帖子ZSet:延时队列,限流Bitmap:布隆过滤器Hyperloglog:统计页面访问量
使用场景
- 缓存
- 接口幂等(setnx)
- 限流、延时队列(zset)
- 分布式锁(setnx+expire)
- 网站页面访问量(hyperLogLog)
- 判断是否签到,是否是活跃用户(位图)
缓存一致性
先更新数据库,后删除缓存,这种方案能最终保持数据的一致性,其他方案像“先更新缓存、再更新数据库”,“先更新数据库、再更新缓存” 在并发情况下可能会导致数据不一致
解决方案:先更新数据库,后删除缓存(推荐)
@RequestMapping("/cache/db/delete")
@PutMapping
public String updateDelete(@RequestBody User user){
//更新数据
userMapper.updateById(user);
//删除缓存
stringRedisTemplate.delete("user:"+user.getId());
return "success";
}
持久化策略
Redis 提供了三种持久化机制:RDB 、 AOF、以及两者混合持久化机制,这三者都是开启子线程进行持久化不会影响主线程操作
RDB:在指定的时间间隔内将内存中的数据写入dump.rdb文件中AOF:将写操作命令写入appendonly.aof文件中,重启redis时会执行aof文件中的命令来恢复数据,aof是先执行命令,后写日志,只记录执行成功的命令,避免出现记录错误命令的情况
数据淘汰策略
- 惰性删除:每次访问键时,判断是否已过期,如果已过期则将其删除
- 定期删除:每隔一定时间随机检查一定数量的键,如果已过期则将其删除
- 主动删除:当内存使用达到设置的最大限制时,会促发内存回收机制,删除策略包括:删除最近最少使用的(
LRU)、存活时间最少的键(TTL)
架构篇
主从复制
将主节点的数据复制到多个从节点,主从架构可以实现读写分离,写操作请求主节点,读操作只请求从节点,从而减轻主节点的压力
哨兵模式
使用 Redis 主从服务的时候,会有一个问题,就是当 Redis 的主从服务器出现故障宕机时,需要手动进行恢复,为了解决这个问题,Redis 增加了哨兵模式,哨兵模式可以监控主从服务器,当主节点发生故障时 哨兵节点会选择一个合适的从节点升级为主节点

Redis集群
-
多个redis实例组成一个集群,每个实例存储部分数据(即每个实例之间数据是不重复的),整个reids集群把键空间分成16384个槽slot位,每个redis实例负责一定范围的哈希槽,数据的key 经过哈希函数计算后 对16384取余即可得到槽位号 进而定位到对应的redis节点
-
redis集群中每个节点之间都会保存完整的拓扑信息,包括每个节点的id、ip地址、端口、负责的哈希槽范围
-
客户端发送请求时,会连接集群中的任意一个节点,如果该节点存储了对应的数据则直接返回,否则会根据请求的key计算哈希槽 并路由到正确的节点
