redis有5种对象:字符串对象,列表对象,哈希对象,集合对象,有序集合对象。每种对象底层都有2种及2种以上的数据结构实现。使用type命令可查看对象类型,object encoding查看底层数据结构。
字符串对象由整数int,raw字符串(字符串较长),embstr字符串实现(字符串较短)。
列表对象由压缩列表或链表实现。
哈希对象由压缩列表和哈希表实现。
集合对象由整数集合和哈希表实现。
有序集合由压缩列表或(跳表以及哈希表实现)。
压缩列表和整数集合可以理解为redis为了节省内存以及重启redis时的效率而开发,在redis.conf文件中可以配置何时使用哪种数据类型,一般在数据量比较小的时候使用压缩列表和整数集合数据类型,生成环境开发我们可以忽略它们。
1,哈希对象和集合对象的区别
在数据量很大的时候,底层的实现其实都是哈希表,区别在于用法上,哈希对象hset可以设置value,而sadd只设置key就可以,比如在判断用于是否存在的时候可以使用sadd,例如sadd outkey uid1 uid2 .......
2,有序集合的实现
有序集合为了实现精确查找key,以及范围查找score,底层同时使用了两种数据结构:哈希表+跳表。
在使用zadd zscore这类查找key的命令时,使用的就是哈希表,时间复杂度O(1)
在使用zrangebyscore命令,需要按照score范围查找时,使用的就是跳表,时间复杂度O(logN)
这么做主要是处于查找性能的考虑,但同时一份数据,如果使用有序集合存储,其实存储了2份。
redis使用手册:http://doc.redisfans.com/