一: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(快速链表)
压缩列表结构,压缩列表详细解释可以看我另外的一篇文章
注: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排序),关于跳表这种数据结构
可以看我其他文章。