只有打开了Redis的虚拟内存功能,vm字段字段才会真正的分配内存,该功能默认是关闭状态的 。1)String常用命令:set/get/decr/incr/mget等;应用场景:String是最常用的一种数据类型,普通的key/value存储都可以归为此类;实现方式:String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr、decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int 。
2)Hash常用命令:hget/hset/hgetall等应用场景:我们要存储一个用户信息对象数据,其中包括用户ID、用户姓名、年龄和生日,通过用户ID我们希望获取该用户的姓名或者年龄或者生日;实现方式:Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口 。
如图所示,Key是用户ID, value是一个Map 。这个Map的key是成员的属性名,value是属性值 。这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过 key(用户ID)field(属性标签) 就可以操作对应属性数据 。当前HashMap的实现有两种方式:当HashMap的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,这时对应的value的redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht 。
3)List常用命令:lpush/rpush/lpop/rpop/lrange等;应用场景:Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现;实现方式:Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构 。
4)Set常用命令:sadd/spop/smembers/sunion等;应用场景:Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的;实现方式:set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因 。
5)Sorted Set常用命令:zadd/zrange/zrem/zcard等;应用场景:Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序 。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的 。
实现方式:Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单 。2、内存管理机制不同在Redis中,并不是所有的数据都一直存储在内存中的 。
这是和Memcached相比一个最大的区别 。当物理内存用完时,Redis可以将一些很久没用到的value交换到磁盘 。Redis只会缓存所有的key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作,Redis根据“swappability = age*log(size_in_memory)”计算出哪些key对应的value需要swap到磁盘 。
然后再将这些key对应的value持久化到磁盘中,同时在内存中清除 。这种特性使得Redis可以保持超过其机器本身内存大小的数据 。当然,机器本身的内存必须要能够保持所有的key,毕竟这些数据是不会进行swap操作的 。同时由于Redis将内存中的数据swap到磁盘中的时候,提供服务的主线程和进行swap操作的子线程会共享这部分内存,所以如果更新需要swap的数据,Redis将阻塞这个操作,直到子线程完成swap操作后才可以进行修改 。
推荐阅读
- 买投影仪什么牌子好,无线投影仪什么牌子好
- 魅族手环有几个版本,299元魅族手环正式发布
- 三星s8怎么区别版本,两版本三星S9选谁
- noter4 哪个版本手机好,国行红米Note5将至
- 买固态硬盘和普通硬盘哪个好上1688 金泰克和西数固态硬盘哪个好
- 单反相机佳能和尼康哪个好,佳能和尼康单反相机哪个好
- 哪个牌子的移动电源比较好,41040102
- 16s和17哪个好】魅族17 魅族16s和魅族17参数对比
- 小平板电脑哪个好用,平板小电脑官网
- oppo手机怎么远程定位另一个手机 手机怎么定位对方的手机所在位置
