1、字符串
相关命令 :set key val ex
ex是设置过期时间get key
redis使用可变长的字节数组来存储字符串类型;当更新数据的时候,如果更新的内容超过了数组的长度,在数据小于一定值(1M)的情况下会成倍的增加比如8k->16k;如果超过1m,每次只会增加1M的容量
2、列表
相关命令 :
入队lpush key val
、rpush key val
出队 lpop key
、rpop key
lrange key 0 -1
遍历列表 -1表示队列的末尾
当列表的大小小于一定值(128k)redis会使用压缩列表来存储队列;当大于一定值redis会使用双向链表来存储列表(因为读取的方向不一定);在redis比较新的版本(v4.0)之后,redis优化了队列的存储方式,它采用快速链表来存储。快速链表是将压缩列表和双向链表结合起来,先将数据存入压缩列表,然后将多个压缩列表通过链表链接起来。
压缩列表的底层也是紧凑的字节数组,通过将值放在连续的地址空间上面,当数据量比较小的时候,删除增加带来的元素迁移是可以接受的。同时可以带来更好的性能和更少的空间占用。
3、集合
sadd key val
获取集合 smembers key
集合相对于列表是可以自动去重的,当我们插入重复的数据,redis会自动帮我们过滤掉已有的重复元素。
集合是通过哈希表存储的 ,只是我们只存储他的key,值置为了空(如果是哈希,就会存储value上对应的数据结构)。
当集合当中都是整数时,redis会使用intset数组来存储。
当大于一定值的时候 ,redis会使用哈希表来存储集合。
4、有序集合
zadd key val
lrange key 0 -1
有序集合相对于集合增加了score这个字段来给集合当中的元素进行排序。当数据比较小的时候,同样也是使用压缩列表来存储,数据大于一定值的时候,会使用哈希表+跳表来存储。
首先正常的value值会存储在哈希表当中,然后redis还会专门为score字段来维护一个跳表的数据结构。
跳表会将所有的score连成一张链表,叫做第一层。然后会在第一层的基础上通过随机的方式在第一层上面随机挑选一些元素在第二层当做链表的索引。层数最好是log^n层。最终实现的效果是通过这几层索引我们可以以二分查找的效率来查找到对应的score;
5、哈希
hset key member val
hget key member
比如:
> hset hash_test test_1 1
1
> hset hash_test test_2 1
1
> hset hash_test test_3 3
1
> hget hash_test test_1
1
> hget hash_test test_2
1
> hget hash_test test_3
3
总结一下