redis应用场景及简介

/ 技术 / 0 条评论 / 10浏览

redis简介

想提高系统的性能,尽量减少IO的操作,特别是磁盘IO的操作;使用缓存可以有效的避免这种情况;所以在架构设计过程中,社交到查询数据库的时候,应该考虑一下是不是考虑使用缓存技术来提高系统的性能,并且降低数据库的负载。 登陆应用redis

请求过来,redis里面有没有?有就给用户 没有查询数据库 数据库里面有没有?没有告诉用户没有 有就查询出来,给用户,并且存放到redis

redis缓存会出现什么问题?

redis缓存数据库的数据,有一点就显得特别重要,那就是数据一致性的问题。 单个数据库在多线程操作的时候如果不是数据库锁的限制会出现很多数据不一致的问题,ACID这里我就不多说了。 redis缓存也会有这样的问题,就是数据库的数据更新到redis是会有时间差的,这样的时间差就会导致数据不一致。 比如一件商品价格在数据库里面是500,然后redis也是500,但是突然数据库修改成了600,如果所有用户都是读入数据库的话,数据库会加锁,然后避免用户读出之前那个500,但是redis的更新怎么说都是有时间差的,所以用户就有可能读取到500这个数据。 这就是数据不一致的问题。

redis适合缓存怎么样的数据?

这里的数据分为两块,第一是数据库的数据,第二是页面的一些静态数据。 这里说的是数据库的数据。 页面的一些静态数据不适合存放在缓存中。 然后对于上面提出的数据不一致的问题,所以缓存的数据也有要求。

不要缓存那些对于数据一致性要求很高的数据

如果这个数据存在被修改的可能性,那么最好不要存缓存,要么,就不要放数据库,只放缓存。 那些对于数据一致性不高的数据,都是可以放的。 强调一点是,如果这个数据放了,但是对于这个数据的操作不是修改,而是只有删除的话,也是可以存放缓存的,因为在实际操作中,如果一个删除操作被执行的时候,缓存可以先进行删除,这样就能确保没有用户能够读取到删除之后的数据,然后再对数据库进行删除。

原子性操作 举个例子: A想要从自己的帐户中转1000块钱到B的帐户里。那个从A开始转帐,到转帐结束的这一个过程,称之为一个事务。在这个事务里,要做如下操作:

  1. 从A的帐户中减去1000块钱。如果A的帐户原来有3000块钱,现在就变成2000块钱了。
  2. 在B的帐户里加1000块钱。如果B的帐户如果原来有2000块钱,现在则变成3000块钱了。 如果在A的帐户已经减去了1000块钱的时候,忽然发生了意外,比如停电什么的,导致转帐事务意外终止了,而此时B的帐户里还没有增加1000块钱。那么,我们称这个操作失败了,要进行回滚。回滚就是回到事务开始之前的状态,也就是回到A的帐户还没减1000块的状态,B的帐户的原来的状态。此时A的帐户仍然有3000块,B的帐户仍然有2000块。 我们把这种要么一起成功(A帐户成功减少1000,同时B帐户成功增加1000),要么一起失败(A帐户回到原来状态,B帐户也回到原来状态)的操作叫原子性操作。 如果把一个事务可看作是一个程序,它要么完整的被执行,要么完全不执行。这种特性就叫原子性。

redis集群

redis集群,这边我给出的建议是使用redis的主从复制功能,这个功能和mysql的主从复制是一个道理,都能很好的确保数据的一致性。 具体redis集群的配置以及实验我会在后面新的博客中给出的。