redis
redis作为缓存使用
方案1: 读取前,先去读Redis,如果没有数据,读取数据库,将数据拉入Redis
方案2: 插入数据时,同时写入Redis。
方案一:实施起来简单,但是有两个需要注意的地方: 避免缓存击穿。(数据库没有就需要命中的数据,导致Redis一直没有数据,而一直命中数据库。) 数据的实时性相对会差一点。
方案二:数据实时性强,但是开发时不便于统一处理。 当然,两种方式根据实际情况来适用。如:方案一适用于对于数据实时性要求不是特别高的场景。方案二适用于字典表、数据量不大的数据存储。
使用场景
1. 限时业务的运用
2. 计数器相关问题
3. 分布式锁
这个主要利用redis的setnx命令进行,setnx:"set if not exists"就是如果不存在则成功设置缓存同时返回1,否则返回0
延时操作 比如在订单生产后我们占用了库存,10分钟后去检验用户是够真正购买,如果没有购买将该单据设置无效,同时还原库存。 由于redis自2.8.0之后版本提供Keyspace Notifications功能,允许客户订阅Pub/Sub频道,以便以某种方式接收影响Redis数据集的事件。 所以我们对于上面的需求就可以用以下解决方案,我们在订单生产时,设置一个key,同时设置10分钟后过期, 我们在后台实现一个监听器,监听key的实效,监听到key失效时将后续逻辑加上。 当然我们也可以利用rabbitmq、activemq等消息中间件的延迟队列服务实现该需求。
4. 排行榜相关问题
关系型数据库在排行榜方面查询速度普遍偏慢,所以可以借助redis的SortedSet进行热点数据的排序
5. 点赞、好友等相互关系的存储
String
实战场景
缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。 计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。 session:常见方案spring session + redis实现session共享
List
实战场景
微博TimeLine: 有人发布微博,用lpush加入时间轴,展示新的列表信息。
消息队列
Set
实战场景
标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。
点赞,或点踩,收藏等,可以放到set中实现
hash
实战场景
缓存: 能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。
Zset
排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。
mq场景
是做业务解耦/最终一致性/广播/错峰流控等
redis持久化策略
1)RDB(redis database) 内存快照,核心思路是Copy-on-Write,来保证在进行快照操作的这段时间,需要压缩写入磁盘上的数据在内存中不会发生变化。
增量快照,4.0版本中引入的RDB和AOF的混合方式。
优点 RDB文件是某个时间节点的快照,默认使用LZF算法进行压缩,压缩后的文件体积远远小于内存大小,适用于备份、全量复制等场景; Redis加载RDB文件恢复数据要远远快于AOF方式; 缺点 RDB方式实时性不够,无法做到秒级的持久化; 每次调用bgsave都需要fork子进程,fork子进程属于重量级操作,频繁执行成本较高; RDB文件是二进制的,没有可读性,AOF文件在了解其结构的情况下可以手动修改或者补全; 版本兼容RDB文件问题; 针对RDB不适合实时持久化的问题,Redis提供了AOF持久化方式来解决
2)AOF
AOF重写:
Redis通过创建一个新的AOF文件来替换现有的AOF,新旧两个AOF文件保存的数据相同,但新AOF文件没有了冗余命令。
在fork出子进程时的拷贝,以及在重写时,如果有新数据写入,主线程就会将命令记录到两个aof日志内存缓冲区中。
fork采用操作系统提供的写时复制(copy on write)机制,就是为了避免一次性拷贝大量内存数据给子进程造成阻塞。fork子进程时,子进程时会拷贝父进程的页表,即虚实映射关系(虚拟内存和物理内存的映射索引表),而不会拷贝物理内存。这个拷贝会消耗大量cpu资源,并且拷贝完成前会阻塞主线程,阻塞时间取决于内存中的数据量,数据量越大,则内存页表越大。拷贝完成后,父子进程使用相同的内存地址空间。
MySQL binlog增量订阅消费+消息队列+增量数据更新到redis
1)读Redis:热数据基本都在Redis
2)写MySQL: 增删改都是操作MySQL
3)更新Redis数据:MySQ的数据操作binlog,来更新到Redis

浙公网安备 33010602011771号