Redis应用小结

   阅读
Redis应用总结

      首先弄清楚Redis是什么?在实际的应用开发中,能帮我们解决什么问题?应用中要注意什么样的问题,避免乱用。

      Redis其实是一个内存数据库-noSql数据库,数据储存就是key-value。你可以简单的把它看成就是一个map结构。Redis是单线程,所以单个命令请求操作是线程安全的,如果想一次执行多个命令并且要求执行过程中不被打断,则使用事物(用multi来开启,exec来提交)。支持的数据结构比memcached多,有string\list\hash\set\zset五种结构。在应用开发中,我们通常会用Redis来做分布式缓存、流量限制、并发访问控制和分布式锁等。用作分布式缓存的话,一般要考虑的因素是什么数据适合缓存,缓存数据要考虑命中率,如果命中率低 ,那边缓存中作用就适得其反。缓存数据要考虑内存的优化,这样能缓存更多的数据(redis提供的内部编码能优化存储,但其他条件是遵循内部编码的原则)。既然是分布式缓存,那么必然要考虑高可用性。在实际的开发中,redis高可用方案有很多,不过redis自身也提供集群解决方案,我更倾向于redis自身的高可用方案,因为其去中心化,缓存数据分片(可以根据key缓存到不同实例的不同slot)。但这里面有些地方需要注意,因为数据被分片,所以使用多key操作或者集合操作命令的时候,不同slot下面的数据是不能操作的,必须保证在多key或者集合运算的数据都在同一个slot下面。那么如何把这些数据放在同一个slot下面?解决方案就是使用hash tag。我们使用redis集群无非是提高系统的高可用、负载均衡。所以在缓存数据的时候结合业务自身的特点,尽量保证数据均匀发布在所有的slot上面。在使用redis的时候,为了建设多次交互,我们尽量使用pipeline(这操作没有原子特性),一次提交多个命令。当然如果使用了redis集群,那得注意你操作的数据是否都在同一个slot里面(说白了你是否使用了hash tag)。有时候我们也会借助lua脚本来协助我们操作redis,为什么要使用lua脚本,因为该脚本能在服务端执行,并保证操作的原子性,但脚本中不适合复杂的业务,业务业务复杂会占用服务器资源时间过长,并发量大的情况下,很容易引起雪崩。

阅读