Redis中的五大数据类型
- 字符串(String)
- 列表(List)
- 集合(Set)
- 哈希(Hash)
- 有序集合(Zset)
string(字符串)
命令 | 描述 |
---|---|
set key value | 设置值 |
get key | 获取指定值 |
exists key | 判断某个key是否存在 |
type key | 查看你的key是什么类型 |
del key | 删除指定的key数据 |
unlink key | 根据value选择非阻塞删除,仅将key从keyspace元数据中删除,真正的删除会在后续异步操作 |
expire key 10 | 为指定的key设置过期时间,10秒钟 |
ttl key | 查看指定的key还有多少秒过期,-1表示永不过期,-2表示已经过期 |
select | 切换数据库命令 |
dbsize | 查看当前数据库的key的数量 |
flushdb | 清空当前数据库 |
flushall | 清空所有库数据 |
append key value | 将给定的value追加到原值的末尾 |
strlen key | 获取值的长度 |
setnx key value | 只有在key不存在时,才能设置key的值 |
incr key | 将key中存储的数字值增1,只能对数字值操作,如果为空,新增值为1. 是一个原子操作 |
decr key | 将key中存储的数字值减1, 是一个原子操作 |
incrby key n | 将key中存储的数字值增 n,只能对数字值操作 |
decrby key n | 将key中存储的数字值减n |
mset key1 value1 key2 value2 … | 同时设置一个或者多个key - value 对 |
mget key1 key2 … | 同时获取一个或者多个value |
msetnx key1 value1 key2 value2 … | 同时设置一个或者多个key - value 对, 当且仅当所有给定的key都不存在,原子性,有一个失败则都失败 |
getrange key start end | 获取值的范围,类似java中的substring,前包,后包 |
setrange key start value | 用value覆盖key所存储的字符串,从下标start开始 |
getset key value | 以旧换新,设置了新值的同时,获得旧值 |
List(列表)
简介
它的结构为单健多值,列表是简单的字符串列表,按照插入顺序排序,可以选择添加一个元素到列表的头部(左边)或是尾部(右边)。
他的底层实际上是双向列表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
常用命令
lpush
key v1 [value…] : 从左边插入一个或者多个值rpush
key v1 [value…] : 从右边插入一个或者多个值lpop
key [n] : 从左边吐出一个或者n个值,值在健在,值光健亡rpop
key [n] : 从右边吐出一个或者n个值lrange
key start stop : 按照索引下标获取元素(从左到右),如果stop是-1,则代表查询全部rpoplpush
key1 key2 : 从 key1列表的右边吐出一个值,插入到key2 列表的左边lindex
key index : 按照索引下标获得元素(下标是从左到右)llen
key : 获得列表长度linsert
key before value newvalue: 在指定key列表的value的前边插入 newvalue,如果value不存在,返回-1,如果key不存在,返回0linsert
key aftervalue newvalue: 在指定key列表的value的后边插入 newvalue,如果value不存在,返回-1,如果key不存在,返回0
lrem
key n value : 从左边删除n个value(从左到右)
lset
key index value : 将列表key下标为index的值替换成value
List的底层数据结构
List的底层数据结构为快速链表 quickList
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是zipList,也就是压缩列表。
它将所有的元素紧挨着一起存储,分配的是一块连续的内存。
当数据量比较多的时候才会改成quickList
因为普通的链表需要的俯角指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的prev和next.
Redis将链表和zipList结合起来组成了quickList。也就是将多个zipList使用双向指针串起来使用。这样既满足了快速的插入和删除性能,又不会出现太大的空间用于.
Set(集合)
简介
redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供了。
Redis的Set是string类型的 无序集合,它底层其实是一个value为null 的hash表,所以添加,删除,查找的复杂度都是0(1)
一个算法,随着数据的增加,执行事件的长短,如果是O(1),数据增加,查找数据的时间不变
常用命令
sadd
key value1 value2 … : 将一个或多个member元素加入到集合key中,已经存在的元素将被忽略smembers
key :取出指定key集合的所有值sismember
key value :判断指定key集合中是否含有该value值,1:存在,0:不存在scard
key : 返回指定key集合的元素个数srem
key value1 value2… : 删除集合中的某个或者多个元素spop
key :随机从该集合中吐出一个值srandmember
key n : 随机从该集合中取出n个值,但不会从集合中删除smove
source destination value : 把source集合中的value值移动到destination集合中
sinter
key1 key2 返回两个集合的交集元素。
sunion
key1 key2 返回两个集合的并集元素。
sdiff
key1 key2 返回两个集合的差集元素(key1中有,但是key2中没有的元素)。
Set的底层数据结构
Set数据结构是dict字典,字典使用哈希表实现的。
Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向都一个空对象,
Redis的Set结构也是一样,他的内部也是用hash结构,所有的value都指向都一个内部值
Hash(哈希)
简介
edis hash 是一个键值对集合。
Redis hash 是一个string类型的field 和value 的映射表,hash特别使用用于存储对象。
类似Java里面的Map<String,Object>.
常用命令
hset
key field value: 给key集合中的 filed 健赋值valuehget
key field : 从key集合filed取出值hmset
key field1 value1 field2 value2 … : 批量设置hash的值,和hset作用差不多hexiste
key field : 查看hash表key中,指定的field是否存在hkeys
key : 列出指定key的哈希表中的所有field
hvals
key : 列出指定key的哈希表中的所有value值
hincrby
key field increment : 为哈希表key中的域field的值加上增量increment
hsetnx
key field value :将哈希表 key 中的域 field 的值设置为value,并且仅当域field不存在,也就是当插入的field不存在时才会插入,如果存在,则不会插入
数据结构
Hash类型对用的数据结构是两种:zipList(压缩列表),hashTable(哈希表)。当filed-value长度较短且个数较少时,使用zipList,否则使用hashTable
Zset(有序集合)
简介
Redis有序集合zset 与普通集合set非常相似,是一个没有重复元素的字符串集合。
不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是惟一的,但是评分可以是重复的。
因为元素是有序的,所以可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
访问有序集合的中间元素也是非常快的,因此能够使用有序集合作为一个没有重复成员的智能列表。
常用命令
zadd
key score1 value1 score2 value2 … : 将一个或多个member元素及其score(分数值)加入到有序集合key 当中
zrange
key start stop [withscores] : 返回有序集合key中,下标在 start stop 之间的元素,如果加上withscores ,则将分数也返回
zrangebyscore
key minScore maxScore [withscores] :返回有序集合key中,所有score值介于minScore和maxScore之间(包括minScore和maxScore)的成员,有序集合按score值递增(从小到大)依次排列。
zrevrangebyscore
key max min [withscore] :同上,改为从大到小排列
zincrby
key incrment value : 为元素的score加上增量
zrem
key value … : 删除指定集合下的指定value,一个或者多个value
zcount
key min max :统计该集合,分数区间内的元素个数zrank
key value : 返回该值在集合中的排名,从下标0 开始
数据结构
SortedSet(zset)是Redis提供的一个非常特别的数据结构,一方面他等价于Java的数据结构Map<String,Double>,可以给每一个元素value赋值一个权重score,领一方面他又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。
zset底层使用了两种数据结构
- hash, hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值
- 跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表