redis是现在非常流行的内存高速缓存数据库,Redis全称为:Remote Dictionary Server(远程数据服务),由一个意大利工程师使用C语言编写的Key-Value存储系统。
使用缓存数据库能够减少对数据库访问的压力,在高并发的时候会显得尤为重要。那么在多种缓存数据库中选择哪一种更适合呢?
和memcache对比
- 如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择;
- 使用简单的key-value存储的话,Memcached的内存利用率更高;
- 由于Redis只使用单核(单线程),而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis;
- Redis跟memcache不同的是,储存在Redis中的数据是持久化的,断电或重启后,数据也不会丢失。
- Memcache做缓存,适合多读少写;Redis在读写效率要求都很高的情况下;
Redis核心对象
Redis核心对象是RedisObject
type代表一个value对象具体是何种数据类型,
encoding是不同数据类型在redis内部的存储方式,比如:type=string代表value存储的是一个普通字符串,那么对应的encoding可以是raw或者是int,如果是int则代表实际redis内部是按数值型类存储和表示这个字符串的,当然前提是这个字符串本身可以用数值表示,比如:”123″ “456”这样的字符串。
只有打开了Redis的虚拟内存功能,vm字段字段才会真正的分配内存,该功能默认是关闭状态的。
Redis支持的数据类型
支持5种数据类型:String List Hash Set ZSet
String
底层实现:String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr、decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。
应用场景:String是最简单的类型,一个key对应一个value。
常用方法:set/get/decr/incr/mget等;
List
底层实现:链表结构,list就是Redis String的列表,按照插入顺序排序。
应用场景:微博中粉丝列表;还可以实现简单消息队列:可以利用List的PUSH操作,将任务存在List中,然后工作线程再用POP操作将任务取出进行执行。
常用方法:lpush/rpush/lpop/rpop/lrange等;
Hash
底层实现:Redis的Hash实际是内部存储的Value为一个HashMap。Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
应用场景:存储比较像关系型数据库的数据。
常用方法:hget/hset/hgetall等
Set
底层实现:set类型是一种无序类型,并且不可重复。set 的内部实现是一个 value永远为null的HashMap
应用场景:微博中将所有关注人都放到一个集合中,所有粉丝放到一个集合中,那通过不同的组合就能够很快返回给用户不同的结果集。共同关注、互相关注等。
常用方法:sadd/spop/smembers/sunion等;
ZSet
底层实现:类似于Set,但是Zset是有序集合。
应用场景:需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构;
常用方法:zadd/zrange/zrem/zcard等;
总结:根据项目的业务要求,选择了Redis作为缓存数据库,它不仅是一个存在于内存中,还可以把数据根据配置持久化保存到磁盘中。并且比Memcache支持更多的数据类型。使得有多种数据类型需求的系统能够更比Memcache高效使用这些。