redis常用五大数据类型

  • Post author:
  • Post category:其他



一:String(字符串)


注:String是二进制安全的,意味着可以存储任何数据,包括.jpg图片以及序列化对象,但是redis中中字符串value最大不超过512M。


常用命令


1:set [key] [value];设置键值对


如果用set命令设置了一个重复的key,那么该key的value会覆盖原来的value


setnx [key] [value]


如果存在重复的key命令不会通过(利用其原子性)


mset [key1] [value1] [key2] [value2]……


同时设置多个key,如果存在重复的key就覆盖该key原来的value


msetnx [key1] [value1] [key2] [value2]……


同时设置多个key,如果存在相同的key,则命令不会通过


2:get [key];获取key对应的value


mget [key1] [key2]……同时获取多个key的值


3:getrange [key] start stop 获取值的范围


4:setrange [key] [offset] [value] 用value覆盖从offset位置开始的值


5:append [key] 追加内容


6:setex [key] [seconds] [value] 设置key并且为key设置一个过期时间,单位是s


7:strlen [key] 该key对应得String长度。(这里要注意,会存在扩容问题,所以有时候会对结果造成误解)


8:incr [key] 对key对应的整型value值加1,返回的结果是最终的value值


incrby [key] [increment] 在key对应的整形value的基础上加increment,并且返回最终的value值


9:decr [key] 对key对应的整型value值减1,返回的结果是最终的value值


decrby [key] [increment] 在key对应的整形value的基础上减去increment,并且返回最终的value值


11:getset [key] [value] 返回原来key的value并且将新的value值覆盖原来的value值


10:扩容机制:当字符串小于1M时,内存不够时扩容一倍(加倍扩容)


当字符串长度大于1M时,内存不够会在原本的基础上每次扩容1M,最大为512M


11:String底层数据结构为简单动态字符串


二:List(列表)


1:lpush/rpush <key> <value1> <value2> <value3>…  创建一个列表,并且在里面从左至右添加元素,至少要有一个元素(原因是:键在人在,键亡人亡


2:lpop/rpop  <key> 从列表左边/右边 弹出一个元素 返回结果是该元素值


3:rpoplpush <key1> <key2> 从key1列表右边弹出一个值添加到key2列表左边


4:lrange <key> <start> <stop>按照索引位置获取元素,从左至右


5:lrange <key> 0 -1 获取该列表所有的元素


6:lindex <key> <index> 返回index位置的元素


7:lrem <key> <n> <value> 从左至右删除n个value值


8:llen <key> 返回列表长度


9:linsert <key> before <value> <newvalue>在value的前面插入newvalue值


10:lset <key> <index> <value>设置新的value值覆盖index位置原来的值,返回结果为ok


11:数据结构:在数据量不是很多的情况下使用的是一块连续的内存,即ziplist(压缩列表)


在数据量增多的一个情况下使用的是zipList+链表成为quickList(快速链表)

压缩列表结构,压缩列表详细解释可以看我另外的一篇文章

img



注:Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。本质上是一个双向链表,每一个节点就是一个zipList(一种顺序型数据结构)。



三:set(集合)不存在重复元素



1:sadd <key> <valuee1> <value2> …创建集合并且添加元素



2:smembers <key> 取出集合中的所有值



3:scard <key> 取出集合中元素个数



4:srem <key> <member> 从集合中删除元素



5:spop <key> 从集合中随机弹出一个元素,不过该元素会被删除



6:srandmember <key> <n> 从集合中随机取出n个元素,不过不会被删除



7:smove <source> <destination> <value> 从集合中取出value转移到另外一个集合



8:sinter <key1> <key2> 返回两个集合的交集



9:sunion <key1> <key2> 返回两个集合的并集



10:sdiff <key1> <key2> 返回两个集合的差集 (key1中有的key2没有的)



数据结构:使用了dict字典,字典底层是用哈希表实现的



四:Hash(哈希)一个String’类型的feild和value的映射表



1:hset <key> <filed> <value> 给key集合中的field键赋值value



2:hget <key> <field>从key集合的feild中取出value



3:hmset <key> <field1> <value1> <field2> <value2>



4:hexists <key> <field> 查看集合中是否有field这个给定域



5:hkeys <key> 返回集合中所有的field域



6:hvals <key> 返回集合中所有的value值



7:hincrby <key> increment <filed> 给field域所对应的value值加1



8:hsetnx <key> <filed> <value> 添加元素,不过不允许有重复的field



底层数据结构实现:当field-value长度较短或者元素个数太少时,用zipList,否则用HashTable



五:zset(有序集合)



1:zadd <key> <scope1> <value1> <scope1> <value2> 将一个或者多个元素添加到集合中



2:zrange <key> <start> <stop> [WITHSCORES]  返回集合元素,下标在start和stop之间



3:zrem <key> <value> 删除指定元素



4:zincrby <key> <increment> <value> 在value对应的scope上增加increment



5:zrank <key> <value> 返回集合的排名



6:zcount <key> <min> <max> 返回该区间的集合元素的个数



底层数据结构实现:使用了hash(关联value和scope)和跳表(给value排序),关于跳表这种数据结构



可以看我其他文章。



版权声明:本文为qq_51294553原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。