Redis 常用数据类型
一、String字符串
(一)、简介
1.String是Redis最基本的类型,可以理解成与Memcached(另一个NOSQL)一模一样的类型,一个key对应一个value。
2.String类型是二进制安全的。意味着Redis的String可以包含任何数据。比如jpg图片或者序列化的对象等。
3.String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M。
(二)、String字符串常用命令
1.set <key> <value> : 添加键值对(当你设置的key存在于数据库中,执行本命令后会覆盖指定 key 的 value )
2.get <key> : 查询对应键值
3.append <key> <value> : 将给定的 value 追加到原值的末尾,返回字符串的长度。(若 key 不存在,则创建)
4.strlen <key> : 获得 key 的长度
5.setnx <key> <value> : 只有在 key 不存在时才能设置 key 的值。(区别于set的覆盖操作)
6.incr <key> : 将 key 中储存的数字值增1 只能对数字值操作,如果为空,新增值为1
7.decr <key> : 将 key 中储存的数字值减1 只能对数字值操作,如果为空,新增值为-1
8.incrby/decrby <key> <步长> : 将 key 中储存的数字值增减。自定义步长(步长就是一个数字,你设置几它就加/减几)。
9.mset <key1> <value1> <key2> <value2> ..... : 同时设置一个或多个 key-value 键值对
10.mget <key1> <key2> <key3> ..... : 同时获取一个或多个 value
11.msetnx <key1> <value1> <key2> <value2> ..... : 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
注:此命令遵循原子性,有一个失败则都失败
12.getrange <key> <起始位置> <结束位置> : 获得值的范围,类似java中的substring(包前包后)
13.setrange <key> <起始位置> <value> : 用 value 覆写 key 所储存的字符串值,从<起始位置>开始(索引从0开始)。
14.setex <key> <过期时间> <value> : 设置键值的同时设置<过期时间(单位秒)>。
15.getset <key> <value> : 以新换旧,设置了新值同时获得旧值。
*详细操作
1.添加键值对(当你设置的key存在于数据库中,执行本命令后会覆盖指定 key 的 value )
set <key> <value>
(对应若已有指定 key 则覆盖)
2.查询对应键值
get <key>
3.将给定的 value 追加到原值的末尾,返回字符串的长度。(若 key 不存在,则创建)
append <key> <value>
(对应 key 不存在,则创建)
4. 获得 key 的长度
strlen <key>
5. 只有在 key 不存在时才能设置 key 的值。(区别于set的覆盖操作)
setnx <key> <value>
(对应setnx无法设置已存在的key的value值)
6. 将 key 中储存的数字值增1 只能对数字值操作,如果为空,新增值为1
incr <key>
(对应若key不存在则新建为1)
7. 将 key 中储存的数字值减1 只能对数字值操作,如果为空,新增值为-1
decr <key>
(对应若 key 为空则新建为负一)
8. 将 key 中储存的数字值增减。自定义步长(步长就是一个数字,你设置几它就加/减几)。
incrby/decrby <key> <步长>
9.同时设置一个或多个 key-value 键值对(若库中已存在 key 则覆盖此 key 的value)
mset <key1> <value1> <key2> <value2> .....
10. 同时获取一个或多个 value(若获取库中不存在的key 返回值为nil)
mget <key1> <key2> <key3> .....
11.同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
msetnx <key1> <value1> <key2> <value2> .....
注:此命令遵循原子性,有一个失败则都失败
(当有一个 key 已存在则添加失败)
12. 获得值的范围(索引都是0开始),类似java中的substring(包前包后)
getrange <key> <起始位置> <结束位置>
13. 用 value 覆写 key 所储存的字符串值,从<起始位置>开始(索引从0开始)。
setrange <key> <起始位置> <value>
因为是覆写,当你的value长度小于要覆写的key的起始位置到结束位置的长度时,他只会覆写value长度的值,而后边的值则不做修改;若长度大于则完全修改。
14. 设置键值的同时设置<过期时间(单位秒)>。
setex <key> <过期时间> <value>
key 过期后就没了,再去查询它的时候就是nil
15.以新换旧,设置了新值同时返回旧值。
getset <key> <value>
(三)、String的数据结构
String的数据结构为简单动态字符串(Simple Dynameic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。
如图中所示,内部为当前字符串时及分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M,扩容是一次只会多扩容1M的空间。需要注意的是字符串最大长度为512M。
SDS其实就可以理解为动态数组?
二、List列表
(一)、List列表的简介
1.单键多值:一个 key 对应多个 value。
2.是一个简单的字符串列表,按照插入的顺序排序。可以通过命令添加一个元素到列表的头部或尾部。
3.底层实际是一个双向链表(通过头找它的下一个元素,可以找到列表的尾部,反之也可以找到头部),对两端的操作性能很高,通过索引下标,操作中间的节点性能会较差。
(二)、List列表常用命令
1.lpush/rpush <key><value1><value2><value3> .... 从左边/右边插入一个或多个值。
2.lpop/rpop <key> 从左边/右边吐出一个值。值在键在,值光键亡。
3.rpoplpush <key1> <key2> 从<key1>列表右边吐出一个值,插到<key2>列表左边。
4.lrange <key> <start> <stop> 按照索引下标获得元素(从左到右) 当start stop为0 -1时表示获取所有(0左边第一个,-1右边第一个)
5.lindex <key><index> 按照索引下标获得元素(从左到右)
6.llen <key> 获得列表长度
7.linsert <key> before <value> <newvalue> 在<value>的前面插入<newvalue>插入值
8.linsert <key> after <value> <newvalue> 在<value>的后面插入<newvalue>插入值
9.lrem <key><n><value> 从左边删除n个value(从左到右)
10.lset<key><index><value> 将列表key下标为index的值替换成value
*详细操作
1.从左边/右边插入一个或多个值。
lpush/rpush <key> <value1> <value2> <value3> ....
左边插入三个值因为使用的是头插法所以查询出来的结果是 w3 w2 w1
右边同理
2.从左边/右边吐出一个值。值在键在,值光键亡。
lpop/rpop <key>
lpop
rpop
当吐完所有值后(值在键在,值光键亡)
3.从 key1 列表右边吐出一个值,插到 key2 列表左边。
rpoplpush <key1> <key2>
操作前,结构为
操作命令
操作后
4.按照索引下标获得元素(从左到右) 当 start stop为0 -1时表示获取所有(0左边第一个,-1右边第一个)
lrange <key> <start> <stop>
5.按照索引下标获得元素(从左到右)
lindex <key> <index>
6.获得列表长度
llen <key>
7.在 value 的前面插入 newvalue 插入值
linsert <key> before <value> <newvalue>
8.在 value 的后面插入 newvalue 插入值
linsert <key> after <value> <newvalue>
9.从左边删除n个value(从左到右)
lrem <key> <n> <value>
10.将列表key下标为 index 的值替换成 value
lset <key> <index> <value>
(三)、List的数据结构
List的数据结构为快速链表quickList
首先,当列表内的元素较少的情况下会使用一块连续的内存存储元素,这个结构叫ziplist,也就是压缩列表。
ziplist:将所有元素紧挨着一起存储,分配的是一块连续的内存
当数据量比较多的时候就会使用quicklist。
quicklist:将多个ziplist通过链表组合起来,也就是把多个ziplist使用双向指针串起来使用,这样既满足了快速插入删除性能,又不会出现太大的空间冗余。