redis客户端
redis-cli -h 192.168.150.101 -p 6379 -a 密码
key为string类型,但是value类型多种多样
基本类型
特殊类型
keys *
DEL k1 k2 k3 k4
EXISTS key
EXPIRE key second
TTL key
set name Tom
get name
mset k1 v1 k2 v2
mset k1 v1 k2 v2
incr key
incrby key 3
setnx key value
setex key second value
有时候会遇到这样的问题,商品存在id,角色存在id,那么key如果都叫id的话没有办法进行区分。这边统一做了个命名规范,用:来进行层级划分。
如:项目名:业务名:类型:id
key | value |
---|---|
tdx:user:1 | {id:1,name:Tom,age:19} |
tdx:product:1 | {id:1,name:xiaomi11,price:4999} |
hset key field value
hget key field
hmset key f1 v1 f2 v2
hmget key f1 f2 f3
hgetall key
hkeys key
hvals key
hsetnx key field value
list可以看成数据结构中的双向链表
可以看成java中hashset的结构
特性:
每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
内存淘汰 | 超时剔除 | 主动更新 | |
---|---|---|---|
说明 | 不需要自己维护,可以直接利用redis内存淘汰机制 | 给缓存添加ttl | 编写业务逻辑,更新数据库时候主动更新缓存 |
一致性 | 差 | 一般 | 好 |
维护成本 | 无 | 低 | 高 |
主动更新策略一般有如下方案:
问题1:更新数据库时删除缓存还是更新缓存?
- 更新:每次更新数据库更新缓存,无效写操作多
- 删除:更新数据库时让缓存失效,查询时再更新缓存(推荐)
问题2:如何保证数据库操作和缓存操作同时成功或者失败?
- 单体:将缓存与数据库操作放在同一个事物
- 分布式:利用TCC等分布式事务的方案
问题3:如何保证线程安全问题?
- 先写数据库再写缓存,这种方案出现线程安全问题的概率小。
本质也是自己实现一个cache aside pattern服务
优点:解耦,支持分布式场景
缺点:维护成本比较高
优点:读写速度快
缺点:异步会导致缓存与数据库数据不一致
定义:指的是客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求全部都打到数据库。
解决方案:
缓存空对象:一旦业务逻辑识别到缓存与数据库中都不存在,那么缓存中该key存空值
布隆过滤
https://blog.csdn.net/qq_40124555/article/details/122810154
一般使用方案1
定义:同一时段大量缓存的key同时失效或者redis服务宕机,导致大量请求到达数据库带来压力。
解决方案:
定义:也称为热点key问题,一个被高并发访问并且缓存重建业务较复杂的key突然失效,无数的请求访问会在瞬间给数据库带来巨大的冲击。
解决方案:
实现分布式锁的基本方法:
获取锁
setnx lock thread1
设置超时时间,保证服务挂了后不至于死锁
set lock thread1 EX 10 NX
释放锁
del lock
redis实现分布式锁主要依赖的是redis命令原子性的特性
但是这么实现分布式锁存在问题, 也就是超时释放锁的逻辑,假如线程阻塞了,在ttl时间内业务没有执行完就把锁给释放了,就存在问题了。
所以解决这个问题的关键在于释放锁的时候,锁的标识是否与线程的一致。
实现方案是在获取锁的时候存入线程id,在释放锁的时候先判断当前线程id与存的id是否一致,如果一直则进行锁释放,如果不一致则不释放锁
到这边还不够,判断锁标识和释放锁这两个动作必须是原子操作。
解决方案:
如java语言redission
消息队列:存储和管理消息,也称为消息代理。
生产者:发送消息到消息队列。
消费者:从消息队列获取消息并处理消息。
redis提供3种不同方式实现消息队列:
优点:
缺点:
PubSub是redis2.0版本引入的消息传递模型。消费者可以订阅多个channal,生产者向对应的channal发送消息后,所有订阅者都能收到相关消息。(发布订阅模型)
优点:
缺点:
Stream是redis5.0版本引入的新数据类型,可以实现很完善的消息队列
发送消息
读取消息
特点:
RDB全称redis database backup file(redis数据备份文件),也被叫做redis数据快照。简单说就是把内存中所有数据存储到磁盘中。当redis实例故障重启后,从磁盘读取快照文件,恢复数据。
命令:
save 900 1 # 900秒内,如果至少有1个key被修改,则执行bgsave
缺点:如果你对数据的完整性非常敏感,那么RDB 方式就不太适合你,因为即使你每5 分钟都持久化一次,当Redis 故障时,仍然会有近5 分钟的数据丢失。
AOF全称Append Only File(追加文件)。redis处理的每一个写命令都会记录在AOF文件中,可以看作是命令日志文件。
缺点:在同样数据规模的情况下,AOF文件要比RDB文件的体积大。而且,AOF 方式的恢复速度也要慢于RDB 方式。
https://baijiahao.baidu.com/s?id=1708708753081996429&wfr=spider&for=pc