前言

Redis官方介绍:https://redis.io/topics/data-types-intro
Redis数据类型对应操作命令(中文):https://www.redis.net.cn/order/

字符串(Strings)

字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的,这意味着一个Redis字符串能包含任意类型的数据,例如: 一张JPEG格式的图片或者一个Json序列化的对象。

常用命令

命令描述操作示例
set key value添加key 并设置值image.png
keys *查找keyimage.png
get key获取对应key 的值image.png
setex key seconds value设置过期时间的添加image
ttl key查看key 的过期时间image.png
setnx key value不存在时添加:如果key 不存在则创建一个key并返回1,如果key 存在则创建失败并返回0image.png
mset k1 v1 k2 v2 k3 v3批量设置keyimage.png
mget k1 k2 k3批量获取valueimage.png
msetnx k1 v1 k2 v2 k3 v3同时设置多个value,原子操作,要不全成功,要不全部失败image.png
incr key让当前key以 1 的数量递增,并返回递增后的值image.png
incrby key num让当前key 以指定参数的数量递增,并返回递增后的值image.png
decr key指定key 以 1 的数量递减,并返回递减后的值image.png
decrby key num让当前key 以指定参数的数量递减,并返回递减后的值image.png
append key string向key 的末尾追加 string。如果key 不存在则将该key 的value 设置为 string,返回追加后字符串的总长度。image.png
strlen key获取字符串长度image.png
getrange key index index截去指定索引的字符串image.png
setrange key index string从指定索引开始替换字符串image.png
del key根据key 删除一个或者多个元素image.png
getset key value如果设置的key 不存在则设置value 并且返回nil,如果设置的key 存在则返回该值,并设置新的值,相当于更新image.png

应用场景

  • 上文提到的“Redis字符串能包含任意类型的数据”,Json字符串表示的对象,秒杀商品信息等
  • setex 用户登录状态的有效时间、限时支付等
  • setnx 分布式锁
  • incr 点赞数、浏览量、阅读量

列表(Lists)

Redis列表是简单的字符串列表,按照插入顺序排序。 你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
image.png

常用命令

命令描述示例
lpush key value向链表左侧添加—头插法image.png
lrange key 0 -1获取全部的元素image.png
rpush key value向链表右侧添加–尾插法image.png
lpop key从左边移出一个元素,删除最左边的那个节点image.png
rpop key从右边移出一个元素,删除最右边的那个节点image.png
lrange key start end lrange返回索引从 start 到 stop 之间的所有元素。起始索引为 0。image.png
llen key返回链表中元素的个数 相当于关系型数据库中 select count(*)image.png
lindex key indexnumberindex 命令用来返回指定索引的元素,索引从 0 开始,如果是负数表示从右边开始计算的索引,最右边元素的索引是-1。如果要将列表类型当做数组来用,lindex 命令是必不可少的。image.png
lset key indexnumber value是另一个通过索引操作列表的命令,它会将索引为 index的元素赋值为 value,原来的值会被覆盖。如果该列表不存在就会报错。所以使用这个命令之前先使用exists判断一下。image.png
lrem key count value移除key链表中count个元素的value值,精确匹配,如果链表中可以有多个重复的值,这里的count指的是可以删除多个相同key的值。image.png
ltrim list startIndex endIndex通过下标截取指定的长度,这个时候list已经改变了,只剩下截断的元素。image.png
rpoplpush source destination移除当前的source链表中的最后一个元素,并且将该元素移动到destination链表当中。image.png
linsert key BEFORE|AFTER pivot value在key列表的pivot元素的前/后面插入元素value。image.png

总结

  • 实际上Redis 的list是一个链表,before node after,left ,right都可以插入值;
  • 如果key 不存在,就创建新的列表
  • 如果key 存在就创建新的值
  • 如果移除了所有的值,空链表,也就代表不存在;
  • 符合链表的特性:在两边插入或者改动值,效率最高,中间元素相对来说效率会低一点。

应用场景

  • 消息队列:利用List的push 操作,将任务存在List中,然后工作线程再用pop 操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删除List中某一段的元素。

哈希(Hashes)

Redis Hashes是字符串字段和字符串值之间的映射,所以它们是完美的表示对象(eg:一个有名,姓,年龄等属性的用户)的数据类型。
image.png

常用命令

命令描述实例
hset key field value为key 的field下设置一个为“value”的值。image.png
hget key field获取key 下 field 对应的值image.png
hmset key field1 value1 …fieldN keyN为key 存储一个或多个键值对image.png
hmget key field1 … fieldN获取key 多个指定的键的值image.png
hexists key field判断key 的字段名是否存在 如果存在返回 1 否则返回 0image.png
hdel key field删除key 的一个或多个字段image.png
hgetall key获取key 的键值对的集合image.png
hvals key只返回key 的字段值image.png
hkeys key只返回key 的字段名image.png
hlen key返回 key 的 hash 的元素个数content3
hincrby key field value指定key 的field 的增量valueimage.png
hsetnx key field value如果key 的field 不存在就创建,如果存在就创建失败。content3

总结

  • Redis 的哈希是键值对的集合。
  • Redis 的哈希值是字符串字段和字符串值之间的映射,因此它们被用来表示对象,还有用户信息之类的,经常变动的信息。
  • Hash更适合用于对象的存储,String更适合字符串存储。

应用场景

  • 主要用于存储部分变更数据,比如存储用户信息等等

集合(Sets)

Redis集合是一个无序的字符串合集。你可以以O(1) 的时间复杂度(无论集合中有多少元素时间复杂度都为常量)完成 添加,删除以及测试元素是否存在的操作。
image.png

常用命令

命令描述实例
sadd key value添加一个 string 元素到,key 对应的 set 集合中, 成功返回 1,如果元素已经在集合中返回 0image.png
smembers key返回 key 对应 set 的所有元素,结果是无序的image.png
scard key返回 set 的元素个数,如果 set 是空或者 key 不存在返回 0image.png
sismember key value判断 value 是否在 set 中,存在返回 1,0 表示不存在或者 key 不存在image.png
srem key value从 key 对应 set 中移除给定元素,成功返回 1,如果 value 在集合中不存在或者 key 不存在返回 0image.png
srandmember key nums从key集合中随机抽取nums个元素。image.png
spop key随机删除一些key集合中的元素。image.png
smove source destination member将原集合source中的member元素移动到destination集合中。image.png
sdiff key1 key2取出key1中与key2集合的不同元素,差集image.png
sinter key1 key2取key1与key2两个集合中相同的元素,交集image.png
sunion key1 key2将key1与key2两个集合中的元素合在一起,并集image.png

总结

  • Redis 的集合是字符串的无序集合。
  • 在Set集合当中,是不允许有重复的。
  • Set是通过hash table实现的,可以进行添加、删除和查找。对集合我们可以取并集,交集,差集。

应用场景

  • 共同关注、共同爱好、二度好友、QQ的好友推荐

有序集合(Sorted sets)

Redis有序集合和Redis集合类似,是不包含 相同字符串的合集。它们的差别是,每个有序集合 的成员都关联着一个评分(score),这个评分用于把有序集 合中的成员按最低分到最高分排列。

常用命令

命令描述实例
zadd key score value将一个或多个 value 及其 socre 加入到 set 中image.png
zrange key start end0 和-1 表示从索引为 0 的元素到最后一个元素(同 LRANGE 命令相似)image.png
zrange key 0 -1 withscores也可以连同 score 一块输出,使用 WITHSCORES 参数image.png
zremrangebyscore key start end可用于范围删除操作image.png
zrangebyscore key min max升序排序操作,将key按最小值到最大值进行输出。image.png
zrevrange salary 0 -1倒序全部输出image.png
zrevrangebyscore key max min降序排序操作,将key按照从大到小排序输出image.png
zrem key value删除指定的元素image.png
zcard key获取有序集合中的个数image.png
zcount key min max获取指定区间的成员数量image.png

应用场景

  • 各种排行榜