五种数据类型
string
数据结构
内部结构为字符串数组
最大容量
521MB
实现原理
类似java的ArrayList,采用预分配容量的方式,一般分配的capacity要高于实际字符串的长度len。当字符串小于1MB时,扩容是加倍现有的空间。如果字符串长度超过1MB,扩容时每一次只增加1MB。需要注意的是字符串最大长度为512MB。
命令
- set name ‘xiaobai’
- get name
- mset name1 ‘xiaobai’ name2 ‘xiaohei’
- mget name1 name2
- expire name 5 设置key为name的值 过期时间为5秒
- ttl name 查看剩余过期时间
- setex name 5 xiaobai 设置name为xiaobai并设置5秒过期时间,相当于 set和expire两个命令合并为原子操作
- setnx name xiaobai 当key为name 不存在时才设置值为xiaobai
计数
如果value为一个整数,可以进行自增或自减操作,最大长度为long 64位,它的范围在signed long 的最大值和最小值之间,超过这个范围,redis会报错。
- incr count 自增1
- incrby count 100 自增100
- decr count 自减1
- decrby count 100 自减100
list
数据结构
内部结构为快速链表(quicklist),在元素较少的清空下,会使用一块连续的内存存储,这个结构是ziplist,即压缩列表。它将所有的元素彼此紧挨着一起存储,分配的是一块连续的内存。当数据量比较多的时候才会改成quicklist。因为普通的链表需要的附加指针空间太大,会浪费空间,还会加重内存的碎片化。所以redis将链表和ziplist结合起来组成了quicklist,也就是多个ziplist使用双向指针串起来使用。
实现原理
类似java里的LinkedList,为双向链表,插入和删除操作非常快,时间复杂度为o(1),但是索引定位很慢,时间复杂度为O(n)
命令
- lpush mylist java python c++ //头插法
- lpop mylist
- rpush mylsit java python c++ //尾插法
- rpop mylist
- lindex mylist 0 //类似java链表的 get(int index) 速度会随索引增大而下降
- lrange mylist 0 -1 //全部打印 -1可以代表遍历到倒数第一个
- ltrim mylist 0 1 //保留list中的索引0到1的元素 ltrim mylist 1 0 清空链表
hash(字典)
数据结构
redis字段的值只能是字符串
实现原理
- 相当于java里的HashMap,数组加链表。
- 采用渐进式rehash策略,在rehash的同事,保留新旧两个hash结构,旧hash的内容一点点地迁移到新的hash结构中,当搬迁完成后,就会使用新的hash结构取而代之。
- hash缺点是存储消耗要高于单个字符串。
命令
- hset books java ‘thinking in java’
- hget books java
- hgetall books
- hlen books
- hmset books java ‘thinking in java’ python ‘python book’ //批量
- hincrby user age 100 //自增
set(集合)
数据结构
实现原理
相当于java里的HashSet,它内部的键值对是无序的、唯一的。它的内部实现相当于一个特殊的字典,字典中的所有的value都是一个值NULL。
命令
- sadd myset 1 2 3 4 5 //可以同时添加多个
- smembers myset //遍历所有成员
- sismembers myset 1 //查询1是否存在
- scard myset //获取长度
- spop myset //弹出一个 应该是随机的
zset(有序列表)
数据结构
它的内部实现用的是一种叫做“跳跃列表”的数据结构
实现原理
类似于java的SortedSet和HashMap的结合体,一方面它是一个set,保证内部value的唯一性,另一方面它可以给每个value赋予一个score,代表这个value的排序权重,它的内部实现用的是一种叫做“跳跃列表”的数据结构。
命令
- zadd books 10 java 9 c++ 8 python
- zrange books 0 -1 //按分数升序
- zrevrange books 0 -1 //按分数降序
- zcard books //大小
- zscore books java //查看java的分数
- zrank books java //查看分数升序排名 排名从索引0开始 ,返回 2
- zrevrank books java //查看分数升序排名 ,返回 0
- zrangebyscore books 8 9 //按分数8到9 遍历 可选参数withscores 显示分数
- zrangebyscore books -inf 10 //-inf代表负无穷大 inf代表无穷大