之前我有博客也尝试过使用redis,在实际的项目中确实作用挺大的。至少对于数据的频繁读取来说都起着至关重要的作用。
但是随着技术的学习,慢慢的业务要复杂起来,以后也许会用到redis集群,所以在这边查询了一些资料,做了一些思考和理解。
如果有问题,请提出,虚心接受,认真学习。
一般的redis逻辑
请求过来,redis里面有没有?有就给用户
没有查询数据库
数据库里面有没有?没有告诉用户没有
有就查询出来,给用户,并且存放到redis
redis缓存会出现什么问题?
redis缓存数据库的数据,有一点就显得特别重要,那就是数据一致性的问题。
单个数据库在多线程操作的时候如果不是数据库锁的限制会出现很多数据不一致的问题,ACID这里我就不多说了。
redis缓存也会有这样的问题,就是数据库的数据更新到redis是会有时间差的,这样的时间差就会导致数据不一致。
比如一件商品价格在数据库里面是500,然后redis也是500,但是突然数据库修改成了600,如果所有用户都是读入数据库的话,数据库会加锁,然后避免用户读出之前那个500,但是redis的更新怎么说都是有时间差的,所以用户就有可能读取到500这个数据。
这就是数据不一致的问题。
redis适合缓存怎么样的数据?
这里的数据分为两块,第一是数据库的数据,第二是页面的一些静态数据。
这里说的是数据库的数据。
页面的一些静态数据不适合存放在缓存中。
然后对于上面提出的数据不一致的问题,所以缓存的数据也有要求。
不要缓存那些对于数据一致性要求很高的数据。
如果这个数据存在被修改的可能性,那么最好不要存缓存,要么,就不要放数据库,只放缓存。
那些对于数据一致性不高的数据,都是可以放的。
强调一点是,如果这个数据放了,但是对于这个数据的操作不是修改,而是只有删除的话,也是可以存放缓存的,因为在实际操作中,如果一个删除操作被执行的时候,缓存可以先进行删除,这样就能确保没有用户能够读取到删除之后的数据,然后再对数据库进行删除。
redis集群
redis集群,这边我给出的建议是使用redis的主从复制功能,这个功能和mysql的主从复制是一个道理,都能很好的确保数据的一致性。
具体redis集群的配置以及实验我会在后面新的博客中给出的。
总结一下:具体的使用过程中,使用redis的超时可以对数据进行一些持久化管理,对于一些数据一致性不高的数据进行缓存,使得读取速度提高,使用redis集群时可以是用主从复制功能,Redis集群没有中心节点,并且带有复制和故障转移特性,这可以避免单个节点成为性能瓶颈,或者因为某个节点下线而导致整个集群下线。
本人的经验也不多,希望有经验的师傅们能提供多一些的建议。