常见缓存数据库
Redis数据类型及常用场景
-
string:简单的k,v值
- 应用:计数器,开关,分布式锁setnx
- 原理:最基础的数据结构
- 命令集:
1. SET/GET/APPEND/STRLEN: 2. INCR/DECR/INCRBY/DECRBY: 3. GETSET: 4. SETEX: 5. SETNX: 6. MSET/MGET/MSETNX:
-
list:列表的元素类型为string,按照插入顺序排序,在列表的头部或尾部添加元素
-
hash:彼此相关的信息的键值对
-
Set, 存储不重复的元素
- 应用:用户的关注者
- 原理:intset(<512)或hashtable(>512)
- 命令集:
1.SADD/SMEMBERS/SCARD/SISMEMBER: 2. SPOP/SREM/SRANDMEMBER/SMOVE:
-
sorted set,有序集合
Redis高级特性
持久化方式
- .RDB文件:快照方式
- 优点:定时手动备份时间点的数据文件,恢复速度快
- 缺点:某个时间点宕机了,有一段时间内的数据丢失
- .AOF(Append only file):每一个写命令追加到.aof文件中
- 优点:宕机不会缺失数据
- 缺点:恢复速度不如RDB,文件大
redis事务
- 多个请求打包,一次性按顺序执行
- MULTI,EXEC, WATCH[key]命令
原子性不支持回滚, 一致性有watch实现, 隔离性本身就是单线程,持久性不支持
go实现
使用 TxPipeline 或 TxPipelined 方法将 pipeline 命令使用 MULTI
和EXEC
包裹起来
Pipeline
将多个命令放入pipeline打包发送给sever,节省网络往返时间
分布式锁
为什么要分布式锁
- 用户下单
锁住 uid,防止重复下单。
- 库存扣减
锁住库存,防止超卖。
- 余额扣减
锁住账户,防止并发操作。
分布式系统中共享同一个资源时往往需要分布式锁来保证变更资源一致性。
特性
- 排他性
锁的基本特性,并且只能被第一个持有者持有。
- 防死锁
高并发场景下临界资源一旦发生死锁非常难以排查,通常可以通过设置超时时间到期自动释放锁来规避。
- 可重入
锁持有者支持可重入,防止锁持有者再次重入时锁被超时释放。
- 高性能高可用
锁是代码运行的关键前置节点,一旦不可用则业务直接就报故障了。高并发场景下,高性能高可用是基本要求。
实现
- setnx设置 key-value, expire设置超时时间
- 释放锁时,先判断有无锁,有锁及delete删除即可
常用的缓存使用模式
cache aside
Read/Write Through
先更新缓存,缓存负责同步更新数据库
Write Behind Caching
先更新缓存,缓存负责定期异步更新数据库
缓存坑
缓存穿透
起因:大量缓存查不到,数据库中也没有
解决:将返回NULL的也存到缓存,插入数据的时候删除NULL缓存(或者设置短的超时时间,)
缓存击穿
起因:热点数据key过期,大量请求数据库
解决(两种):
分布式锁:一个线程获取锁查数据库更新缓存,其他线程等待,直到缓存中存在了,直接取
缓存雪崩
起因:缓存服务不可用,或者大量key同时失效,大量请求数据库
解决:
针对缓存服务不可用---架构层的监控报警完善
针对大量key同时失效---key随机超时或多级缓存(不同级别的key不用的超时时间)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。