Redis五大数据类型及常见命令

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的范围获取元素列表。跳跃表的算法原理如下图所示。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值