自己做的网站如何被百度检索,建设银行江苏省分行网站,小程序免费制作平台用,免费软件恢复微信聊天记录背景
现在我们在面向增删改查开发时#xff0c;数据库数据量大时或者对响应要求较快#xff0c;我们就需要用到Redis来拿取数据。
Redis#xff1a;是一种高性能的内存数据库#xff0c;它将数据以键值对的形式存储在内存中#xff0c;具有读写速度快、支持多种数据类型…背景
现在我们在面向增删改查开发时数据库数据量大时或者对响应要求较快我们就需要用到Redis来拿取数据。
Redis是一种高性能的内存数据库它将数据以键值对的形式存储在内存中具有读写速度快、支持多种数据类型、原子性操作、丰富的特性等优势。
优势
性能极高Redis的读速度可以达到110000次/s写速度可以达到81000次/s这主要得益于它基于内存存储的特点以及其单线程事件驱动架构的设计。丰富的数据类型Redis不仅仅支持简单的key-value类型的数据同时还提供listsetzsethash等数据结构的存储这些数据结构可以满足多种应用场景的需求。原子性操作Redis的所有操作都是原子性的这意味着这些操作要么成功执行要么失败完全不执行。这为Redis在实现事务和并发控制方面提供了极大的便利。丰富的特性Redis还支持发布/订阅、通知、键过期、事务、管道、Lua脚本、集群分片和数据复制等功能。这些特性使得Redis在实现消息队列、缓存系统、分布式系统等方面具有很大的优势。支持持久化Redis支持数据的持久化可以将内存中的数据保存在磁盘中重启的时候可以再次加载进行使用。这使得Redis的数据不会因为重启或者宕机而丢失。支持备份和恢复Redis支持数据的备份和恢复即master-slave模式的数据备份。这为Redis的数据安全提供了保障。丰富的客户端Redis支持各种各样的语言的客户端接入包括Python、Java、C#、PHP等。这使得开发者可以使用自己熟悉的编程语言来操作Redis。
综上所述对Redis有个简单的理解。
常用方式
启动项目时将热点数据放入redis缓存中如果没这样做直接看第二点用户请求过来之后先查缓存有没有数据如果有则直接返回。如果缓存没数据再继续查数据库。如果数据库有数据则将查询出来的数据放入缓存中然后返回该数据。如果数据库也没数据则直接返回空。
此时问题来了假如说我们的热点数据是人员信息此时新增了一条张三的信息你再去缓存拿取的时候是不会有张三这条信息的因为数据只是更新在了数据库并没有更新在缓存中。此时测试人员可能就会有疑问明明新增成功了但是数据呢所以我们需要保证Redis缓存与数据库数据一致的问题。
解决
1 先删缓存再更新数据库
先删除缓存数据库还没有更新成功此时如果读取缓存缓存不存在去数据库中读取到的是旧值缓存不一致发生。
1.1 解决方案延时双删
延时双删的方案的思路是为了避免更新数据库的时候其他线程从缓存中读取不到数据就在更新完数据库之后再 sleep 一段时间然后再次删除缓存。
sleep 的时间要对业务读写缓存的时间做出评估sleep 时间大于读写缓存的时间即可。
流程如下
线程1删除缓存然后去更新数据库线程2来读缓存发现缓存已经被删除所以直接从数据库中读取这时候由于线程1还没有更新完成所以读到的是旧值然后把旧值写入缓存线程1根据估算的时间sleep由于sleep的时间大于线程2读数据写缓存的时间所以缓存被再次删除如果还有其他线程来读取缓存的话就会再次从数据库中读取到最新值。
2 先更新数据库再删除缓存
如果反过来操作先更新数据库再删除缓存呢
这个就更明显的问题了更新数据库成功如果删除缓存失败或者还没有来得及删除那么其他线程从缓存中读取到的就是旧值还是会发生不一致。
2.1 解决方案一借用消息中间件帮助完成
先更新数据库成功后往消息队列发消息消费到消息后再删除缓存借助消息队列的重试机制来实现达到最终一致性的效果。
问题 引入消息中间件之后问题更复杂了怎么保证消息不丢失怎么样保证消息的有序性等问题随之而来。就算更新数据库和删除缓存都没有发生问题消息的延迟也会带来短暂的不一致性不过这个延迟相对来说还是可以接受的
2.2 设置缓存过期时间
每次放入缓存的时候设置一个过期时间比如 5 分钟以后的操作只修改数据库不操作缓存等待缓存超时后从数据库重新读取。
问题
如果数据更新的特别频繁不一致性的问题就很麻烦