Redis五大数据类型及其相关操作
文章目录
常用五大数据类型
- string
- set
- list
- hash
- zset
Redis键(Key)有关操作
- 查看当前库所有的key:
keys *
- 判断某个key是否存在:
exists <key>
- 删除key:
del key
- 根据value选择非阻塞删除:
unlink <key>
,仅将keys从keyspace元数据中删除,真正的删除后续异步删除 - 为给定key设置过期时间,单位秒:
expire <key> <seconds>
- 查看key还有多少秒过期:
ttl <key>
,-1
表示用不过期,-2
表示已经过期 - 查看当前数据库key的数量:
dbsize
库相关操作
Redis默认提供了16个数据库,0-15
,默认为0
- 切换数据库:
select <n>
- 清空当前库:
flushdb
- 通杀全部库:
flushall
字符串(String)
相关知识点
-
String 类型是二进制安全的。意味着String类型可以包含任何数据,比如jpg图片和序列化的对象。
-
Redis中字符串value最多是512M
-
对String的操作都是原子的,得益于Redis是单线程
-
String的数据结构为简单动态字符串,实现上类似于java的ArrayList,采用分配冗余空间的方式,来减少频繁分配空间。内部为当前字符串分配的空间一般是大于当前字符串长度的,当字符串长度小于1M时,为加倍扩容。当大于1M时,每次扩容1M,最大为512M。
常见操作
- 设置key和value:
set <key> <value>
- 获取对应键值:
get <key>
- 将新的value追加到原值的末尾:
append <key> <value>
- 获取value的长度:
strlen <key>
- 只有在key不存在的时候设置key的值:
setnx <key> <value>
- 将key中存的数字增1:
incr <key>
,如果不存在,则set为1 - 将key中的数字减1:
decr <key>
,如果不存在,则set为-1 - 自定义减少/增加步长:
incrby/decrby <key> <步长>
- 同时设置一个或多个key-value对:
mset <key1> <value1> <key2> <value2> ...
- 同时获取一个活多个value:
mget <key1> <key2>
- 当key不存在时,同时设置多个key-value对:
msetnx <key1> <value1> <key2> <value2> ...
- 获取范围中的值:
getrange <key> <start> <end>
- 用给定的value覆写key所存储的支付串,从offset开始(索引从0开始):
setrage <key> <offset> <value>
- 设置key-value的同时设置过期时间,单位秒:
setex <key> <seconds> <value>
- 获取旧值同时设置新值:
getset <key> <value>
列表(List)
相关知识点
- List的数据结构为Quicklist(双向),每个节点为Ziplist(压缩列表,内存连续)。当列表元素较少时,直接为Ziplist,当元素过多时,会转换为Quicklist。这样做的原因是因为普通的双向列表,哪怕一个节点只存一个int值,都要花费额外的空间去存prev和next两个指针,空间利用率太低了,使用Ziplist之后可以大大减少存储prev和next的空间浪费。
常见操作
- 从左边/右边插入一个或多个值:
lpush/rpush <key> <value1> <value2> ...
- 从左边/右边吐出一个值:
lpop/rpop <key>
,当列表为空时,键消失 - 从列表1右边吐出一个值,插入到列2的左边:
rpoplpush <key1> <key2>
- 按照索引下标获得区间元素:
lrange <key> <start> <end>
- 获得所以元素:
lrange <key> 0 -1
- 按照索引下标获得元素:
lindex <key> <index>
- 获得列表长度:
llen <key>
- 在指定value前/后插入值:
linsert <key> before/after <value> <newvalue>
- 从左边依次删除n个value:
lrem <key> <n> <value>
- 将列表index的值替换为value:
lset <key> <index> <value>
集合(Set)
相关知识点
- Set是String类型的无序去重集合,它底层是一个哈希表,因此相关操作复杂的为O(1)
常见操作
- 将一个或多个元素加入到集合中:
sadd <key> <value1> <value2> ...
- 取出集合所有值:
smembers <key>
- 判断集合是否含有某元素:
sismember <key> <value>
- 求集合的元素个数:
scard <key>
- 删除集合一个或多个元素:
srem <key> <value1> <value2> ...
- 随机吐出一个值:
spop <key>
- 随机取集合n个值(不会删除):
srandmember <key> <n>
- 将集合A中的一个值移动到集合B:
smove <source> <destination> value
- 求两个集合的交集:
sinter <key1> <key2>
- 求两个集合的并集:
sunion <key1> <key2>
- 求两个集合的差:
sdiff <key1> <key2>
哈希(Hash)
相关知识点
- Hash对应的数据结构有两种:Ziplist和Hashtable。当元素短且少时用Ziplist,反之使用Hashtable
常用操作
- 给key中的field赋值:
hset <key> <field> <value>
- 取出key中field对应value:
hget <key> <field>
- 批量设置值:
hmset <key> <field1> <value1> <field2> <value2>
- 判断指定field是否存在:
hexists <key> <field>
- 取出所有field:
hkeys <key>
- 取出所有value:
hvals <key>
- 给指定field上增量:
hincrby <key> <field> <increment>
- 当且仅当field不存在时,给field赋值:
hsetnx <key> <field> <value>
有序列表(Zset)
相关知识点
- Zset和Set类似,是一个没有重复元素的集合,但是Zset多了一个score,因此他可以通过score进行排序了,也就是Zset是有序的。
- Zset的底层数据结构为hash和跳跃表。hash的作用是关联value和score,确保value的唯一性;跳跃表的主要作用是给value排序
常用操作
- 给集合添加元素:
zset <key> <score1> <value1> <score2> <value2> ...
- 返回下标在区间中的所有元素:
zrange <key> <start> <end> [withscores]
,当带有withscores时,会返回分数 - 返回score介于min、max之间(包括min、max)的元素,按min-max排序:
zrangebyscore <key> <min> <max> [withscores]
- 返回score介于min、max之间(包括min、max)的元素,按max-min排序:
zrevrangebyscore <key> <max> <min> [withscores]
- 为指定元素的score上增量:
zincrby <key> <increment> <value>
- 删除指定元素:
zrem <key> <value>
- 统计区间元素个数:
zcount <key> <min> <max>
- 返回一个值在集合中的排名,从0开始:
zrank <key> <value>