Redis常用五大数据类型
1. Redis字符串(String)
1.1 介绍
String 是 Redis 最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jdg图片或者序列化的对象。
String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
1.2 常用命令
命令 | 含义 |
---|---|
set key value | 添加键值对 |
setnx key value | 当数据库中key不存在时,可以将key-value添加数据库 |
setxx key value | 当数据库中key存在时,可以将key-value添加数据库,与NX参数互斥 |
setex key seconds value | 设置键的过期时间为 second 秒 |
set key value px value millionsecond | 设置键的过期时间为 millisecond 毫秒 |
get key | 查询对应键值 |
append key value | 将给定的value追加到原值的末尾 |
strlen key | 获得值的长度 |
incr key | 将 key 中储存的数字值增1 只能对数字值操作,如果为空,新增值为1 |
decr key | 将 key 中储存的数字值减1 只能对数字值操作,如果为空,新增值为-1 |
incrby / decrby key 步长 | 将 key 中储存的数字值增减。自定义步长。 |
命令 | 含义 |
---|---|
mset key1 value1 key2 value2… | 同时设置一个或多个 key-value对 |
mget key1 key2 key3 … | 同时获取一个或多个 value |
msetnx key1 value1 key2 value2… | 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在 |
原子性,有一个失败则都失败
命令 | 含义 |
---|---|
getrange < key><起始位置><结束位置> | 获得值的范围,类似java中的substring,前包,后包 |
setrange < key><起始位置>< value> | 用 覆写所储存的字符串值,从<起始位置>开始(索引从0****开始)。 |
命令 | 含义 |
---|---|
setex < key> <过期时间> < value> | 设置键值的同时,设置过期时间,单位秒。 |
getset < key>< value> | 以新换旧,设置了新值同时获得旧值。 |
1.3 数据结构
String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。
是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配.
如图中所示,内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。
当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间。
需要注意的是字符串最大长度为512M。
2. Redis列表(List)
2.1 介绍
单键多值
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
2.2 常用命令
命令 | 含义 |
---|---|
lpush/rpush < key> < value1> < value2> < value3> … | 从左边/右边插入一个或多个值 |
lpop/rpop < key> | 从左边/右边吐出一个值。值在键在,值光键亡 |
rpoplpush < key1>< key2> | 从< key1>列表右边吐出一个值,插到< key2>列表左边 |
lrange < key>< start>< stop> | 按照索引下标获得元素(从左到右) lrange key 0 -1表示获取所有 |
lindex < key>< index> | 按照索引下标获得元素(从左到右) |
llen < key> | 获得列表长度 |
linsert < key> before(after) < value>< newvalue> | 在< value>的前/后面插入< newvalue>插入值 |
lrem < key> < n>< value> | 从左边删除n个value(从左到右) |
lset< key> < index> < value> | 将列表key下标为index的值替换成value |
2.3 数据结构
List的数据结构为快速链表quickList。
首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。
它将所有的元素紧挨着一起存储,分配的是一块连续的内存
当数据量比较多的时候才会改成quicklist
因为普通的链表需要的附加指针空间太大,会比较浪费空间。比如这个列表里存的只是int类型的数据,结构上还需要两个额外的指针prev和next。
Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。