1. Redis字符串(String)
String是Redis最基本的value类型,一个key对应一个value。
String类型是二进制安全的,所有Redis的String对象可以包含任何数据,如图片或序列化的对象。一个Redis中字符串的value最多可以是512M。
1.1 常用命令
set key value:创建键值对,如果已经存在则会将之前的覆盖。
setnx key value:只有当key不存在时,才会创建键值对。
get key:得到key的值。
append key value:将value添加到key的尾部,仅限string类型操作。
strlen key:获得key的value长度。
incr key 步长:为key的value增加步长,默认增加1,仅当value为int型。incr操作具有原子性,与事务的原子性不同,redis中的原子性指不会被线程调度机制打断操作。
decr key 步长:为key的value减少步长,默认减少1,仅当value为int型。
mset key value ... key value:创建多个键值对,如果已经存在则会将之前的覆盖。
msetnx key value ... key value:创建多个键值对,只有当key都不存在时,才会创建键值对。
getrange key 起始位置 结束位置:获得key的value中一定范围内的值。
setrange key 起始位置 value:从key的值中的起始位置换为value。
getset key value:设置新的值替换旧的值,并且会返回旧的值。
1.2 数据结构
Redis中string的数据结构为简单动态字符串,是可以修改的字符串,内部结构实现类似于java的ArraryList,采用预分配冗余空间的方式来减少内存的频繁分配。当字符串长度大于预分配的空间时,会对现有的空间进行扩容,最大为512M。
2. Redis列表(List)
Redis中list的特点是一键多值,即一个key可以有多个value。Redis的列表是简单的字符串列表,按照插入顺序排序,可以将元素添加到列表的头部或者尾部。
它的底层其实是一个双向链表,对两端的操作性很高,通过索引来操作中间的节点性能很差。
2.1 Redis列表(List)常见命令
lpush/rpush key value1 vlaue2 value3... :从左边/右边插入多个值。
lpop/rpop key:从key的左边/右边吐出第一个值,当值被取光时,key也同时消失。
rpoplpush key1 key2:从key1的右边吐出第一个值插入到key2的左边。
lrange key start stop:按照索引下标获得元素(从左往右),如果将start stop设置为0 -1则可取得key中的所有值。
lindex key index:从左获得key的第index个元素。
llen key:获得key的长度。
linsert key before value value1:以从左的顺序,在key中value之前插入value1。
lrem key num value:以从左的顺序,在key中删除num个value。
lset key index value:以从左的顺序,将key中第index个数据替换为value。
2.2 Redis列表的数据结构
Redis中List的数据结构为快速链表quicklist。当列表元素较少时会使用一块连续的内存存储,这个结构就是ziplist,也就是压缩列表,它将所有的元素挨在一起存储,分配一块连续的内存。当链表的数据较多时,通过双指针将多个压缩列表连接起来组成一个快速链表。
Redis将链表与ziplist结合起来组成quicklist,这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。
3. Redis集合(Set)
Redis中的集合Set是类似于list的列表,不过Set中可以自动去重,且无序。Set中提供了可以判断某个成员是否在集合中的重要接口,这是list所不能提供的。
Redis的set是String类型的无序集合,它的底层是一个value为null的hash表,所以增删查的s复杂度都是O(1)。
3.1 Redis集合(Set)常见命令
sadd key value1 value2...:将一个或多个member成员加入到集合key中,已存在的member元素将被忽略。
smember key:取出key中的所有值。
sismember key value:判断key中是否存在value,若存在则返回1,不存在则返回0。
scard key:返回该集合中的元素数量。
srem key value1 value2...:删除key中的value元素。
spop key:随机从key中弹出一个值,若弹出之后,key为空,则key消失。
srandmember key n:随机从key中取出n个值,但不会删除这些值。
sinter key1 key2....:返回两个或多个集合的交集。
sunion key1 key2....:返回两个或多个集合的并集。
sdiff key1 key2....:返回两个或多个集合的差集,key1中有而其他集合中没有的元素。
3.2 Redis集合的数据结构
Redis中Set集合的数据结构是dict字典,字典是使用哈西表来实现的,所有的value都指向同一个内部值。
4. Redis哈希(Hash)
Redis中hash是一个键值对集合,是String类型的field与value的映射表,hash特别适合存储对象。
通俗来讲,hash使用键值对来存储对象,而其中value是由field与value1组成的另一个键值对。例如,现用hash存储user的信息,user作为key,name与zhangsan这个整体被当做value,以field与value1的形式存储,其中field为name,value1为zhangsan。
4.1 Redis哈希(Hash)常用命令
hset key field value:给key集合中的feild键赋值value。
hget key field value:从key集合的feild中取出value。
hmset key1 field1 value1 key2 field2 value2:创建多个hash。
hexists key field:集合key中是否存在field。
hkeys key:返回集合key中所有的field。
hvals key:返回集合key中所有的value。
hincreby key field num:给集合key中field对应的value增加num。
hsetnx key field value:给key集合中的field置为value,当且仅当field不存在时成功。
4.2 Redis哈希的数据结构
Hash类型对应的数据结构有两种:ziplist(压缩列表)与hashtable(哈希表)。当field与value长度较短时且个数较少时,使用ziplist,否则使用hashtable。
5. Redis有序集合(Zset)
Redis的有序集合Zset(Sorted Set)与普通集合非常相似,是一个没有重复元素的字符串集合。不同之处在于集合中的每一个元素都关联了一个评分(score),使集合可按照这个评分进行从高到低的排序。集合中的成员是唯一的,但是评分可以是不唯一的。
5.1 Redis有序集合(Zset)常用命令
zadd key score1 value1 score2 value2...:创建zset集合,并为相应的key赋值score。
zrange key start end (withscores):返回key集合中下标在start与end之间的value,可通过添加withscores来同时输出value对应的score。
zrangebyscore key score1 score2 (withscores):返回key集合中score在score1 与score2之间的value,默认为升序。
zrevrangebyscore key score1 score2 (withscores):降序返回key集合中score在score1 与score2之间的value。
zincrby key num value:为集合key中value的score增加num。
zrem key value:删除集合key中的value及对应的score。
zcount key score1 score2:统计集合key中score在score1与score2之间的value数量。
zrank key value:返回集合key中value的score按照升序的排名。
5.2 Redis有序集合数据结构
Zset底层使用两种数据结构:
-
Hash表:哈希表的作用就是关联元素value与权重score,保障value的唯一性,可以通过value找到score。
-
跳跃表:跳跃表的作用在于给元素value排序,根据score的范围获取元素列表。跳跃表的算法原理如下图所示。