redis浅析
数据类型 | 底层的数据类型 | 可以存储的值 | 可以进行的操作 | 使用在哪些场景下面 |
---|---|---|---|---|
String | SDS(后续讲解) | 字符串,整数,浮点数 | 对字符串或者其中的一部分进行系类的操作处理 | 使用最为频繁,一般就是用作简单的键值对的缓存处理作为key值1. 可以用于保存单个字符串或是JSON字符串类型。2. 因为string类型是二进制安全的所以可以把一个图片文件的内容 作为字符串来存储。3. 计算器进行使用时候,对微博数,粉丝数目进行增和减。4. increment 本身就具有原子操作的特性。 |
List | 压缩列表 | 列表 | 1. 从两端压入或者弹出元素。2. 对单个或者多个元素进行修建,只保留一个返回内的元素 | 存储一些列表类型的数据结构。1. 消息队列 可以使用reids的lpush 与 brpop 来实现阻塞队列,保证负载均衡与高可用。2. 文章列表,每个用户都有数据自己的文章列表,需要分页展示文章列表,使用list 不但有序 还可以支持按照索引范围获取元素。最新消息排行等。 |
Set | insert | 无序不重复集合 | 添加、获取、移除单个元素检查一个元素是否存在于集合中计算交集、并集、差集从集合里面随机获取元素 | 1, 对于两个集合之间的数据进行交集,并集差集运算等。 2. 方便实现对于共同好友的采集,共同关注,二度好友等,对于以上说的集合操作,还可以使用不同的命令将结果返回给客户端或则是存放在一个新的集合里面。 3. 利用唯一性, 统计访问网站的所有独立IP信息。 |
Hash | 压缩列表 | 键值对集合 | 添加、获取、移除单个键值对获取所有键值对检查某个键是否存在 | 1. 用于存储一个对象2. 存储用户用户的具体信息,年龄,生日等数据 |
缓存与数据库双写的数据一致性
场景 | 描述 | 解决方案 |
---|---|---|
先写缓存,再写数据库,缓存写成功,数据库写失败 | 缓存写成功,但写数据库失败或者响应延迟,则下次读取(并发读)缓存时,就出现脏读 | 这个写缓存的方式,本身就是错误的,需要改为先写数据库,把旧缓存置为失效;读取数据的时候,如果缓存不存在,则读取数据库再写缓存 |
先写数据库,再写缓存,数据库写成功,缓存写失败 | 写数据库成功,但写缓存失败,则下次读取(并发读)缓存时,则读不到数据 | 缓存使用时,假如读缓存失败,先读数据库,再回写缓存的方式实现 |
需要缓存异步刷新 | 指数据库操作和写缓存不在一个操作步骤中,比如在分布式场景下,无法做到同时写缓存或需要异步刷新(补救措施)时候 | 确定哪些数据适合此类场景,根据经验值确定合理的数据不一致时间,用户数据刷新的时间间隔 |