前言
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 并设置值 | |
keys * | 查找key | |
get key | 获取对应key 的值 | |
setex key seconds value | 设置过期时间的添加 | |
ttl key | 查看key 的过期时间 | |
setnx key value | 不存在时添加:如果key 不存在则创建一个key并返回1,如果key 存在则创建失败并返回0 | |
mset k1 v1 k2 v2 k3 v3 | 批量设置key | |
mget k1 k2 k3 | 批量获取value | |
msetnx k1 v1 k2 v2 k3 v3 | 同时设置多个value,原子操作,要不全成功,要不全部失败 | |
incr key | 让当前key以 1 的数量递增,并返回递增后的值 | |
incrby key num | 让当前key 以指定参数的数量递增,并返回递增后的值 | |
decr key | 指定key 以 1 的数量递减,并返回递减后的值 | |
decrby key num | 让当前key 以指定参数的数量递减,并返回递减后的值 | |
append key string | 向key 的末尾追加 string。如果key 不存在则将该key 的value 设置为 string,返回追加后字符串的总长度。 | |
strlen key | 获取字符串长度 | |
getrange key index index | 截去指定索引的字符串 | |
setrange key index string | 从指定索引开始替换字符串 | |
del key | 根据key 删除一个或者多个元素 | |
getset key value | 如果设置的key 不存在则设置value 并且返回nil,如果设置的key 存在则返回该值,并设置新的值,相当于更新 |
应用场景
- 上文提到的“Redis字符串能包含任意类型的数据”,Json字符串表示的对象,秒杀商品信息等
- setex 用户登录状态的有效时间、限时支付等
- setnx 分布式锁
- incr 点赞数、浏览量、阅读量
列表(Lists)
Redis列表是简单的字符串列表,按照插入顺序排序。 你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
常用命令
命令 | 描述 | 示例 |
---|---|---|
lpush key value | 向链表左侧添加—头插法 | |
lrange key 0 -1 | 获取全部的元素 | |
rpush key value | 向链表右侧添加–尾插法 | |
lpop key | 从左边移出一个元素,删除最左边的那个节点 | |
rpop key | 从右边移出一个元素,删除最右边的那个节点 | |
lrange key start end lrange | 返回索引从 start 到 stop 之间的所有元素。起始索引为 0。 | |
llen key | 返回链表中元素的个数 相当于关系型数据库中 select count(*) | |
lindex key indexnumber | index 命令用来返回指定索引的元素,索引从 0 开始,如果是负数表示从右边开始计算的索引,最右边元素的索引是-1。如果要将列表类型当做数组来用,lindex 命令是必不可少的。 | |
lset key indexnumber value | 是另一个通过索引操作列表的命令,它会将索引为 index的元素赋值为 value,原来的值会被覆盖。如果该列表不存在就会报错。所以使用这个命令之前先使用exists判断一下。 | |
lrem key count value | 移除key链表中count个元素的value值,精确匹配,如果链表中可以有多个重复的值,这里的count指的是可以删除多个相同key的值。 | |
ltrim list startIndex endIndex | 通过下标截取指定的长度,这个时候list已经改变了,只剩下截断的元素。 | |
rpoplpush source destination | 移除当前的source链表中的最后一个元素,并且将该元素移动到destination链表当中。 | |
linsert key BEFORE|AFTER pivot value | 在key列表的pivot元素的前/后面插入元素value。 |
总结
- 实际上Redis 的list是一个链表,before node after,left ,right都可以插入值;
- 如果key 不存在,就创建新的列表
- 如果key 存在就创建新的值
- 如果移除了所有的值,空链表,也就代表不存在;
- 符合链表的特性:在两边插入或者改动值,效率最高,中间元素相对来说效率会低一点。
应用场景
- 消息队列:利用List的push 操作,将任务存在List中,然后工作线程再用pop 操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删除List中某一段的元素。
哈希(Hashes)
Redis Hashes是字符串字段和字符串值之间的映射,所以它们是完美的表示对象(eg:一个有名,姓,年龄等属性的用户)的数据类型。
常用命令
命令 | 描述 | 实例 |
---|---|---|
hset key field value | 为key 的field下设置一个为“value”的值。 | |
hget key field | 获取key 下 field 对应的值 | |
hmset key field1 value1 …fieldN keyN | 为key 存储一个或多个键值对 | |
hmget key field1 … fieldN | 获取key 多个指定的键的值 | |
hexists key field | 判断key 的字段名是否存在 如果存在返回 1 否则返回 0 | |
hdel key field | 删除key 的一个或多个字段 | |
hgetall key | 获取key 的键值对的集合 | |
hvals key | 只返回key 的字段值 | |
hkeys key | 只返回key 的字段名 | |
hlen key | 返回 key 的 hash 的元素个数 | content3 |
hincrby key field value | 指定key 的field 的增量value | |
hsetnx key field value | 如果key 的field 不存在就创建,如果存在就创建失败。 | content3 |
总结
- Redis 的哈希是键值对的集合。
- Redis 的哈希值是字符串字段和字符串值之间的映射,因此它们被用来表示对象,还有用户信息之类的,经常变动的信息。
- Hash更适合用于对象的存储,String更适合字符串存储。
应用场景
- 主要用于存储部分变更数据,比如存储用户信息等等
集合(Sets)
Redis集合是一个无序的字符串合集。你可以以O(1) 的时间复杂度(无论集合中有多少元素时间复杂度都为常量)完成 添加,删除以及测试元素是否存在的操作。
常用命令
命令 | 描述 | 实例 |
---|---|---|
sadd key value | 添加一个 string 元素到,key 对应的 set 集合中, 成功返回 1,如果元素已经在集合中返回 0 | |
smembers key | 返回 key 对应 set 的所有元素,结果是无序的 | |
scard key | 返回 set 的元素个数,如果 set 是空或者 key 不存在返回 0 | |
sismember key value | 判断 value 是否在 set 中,存在返回 1,0 表示不存在或者 key 不存在 | |
srem key value | 从 key 对应 set 中移除给定元素,成功返回 1,如果 value 在集合中不存在或者 key 不存在返回 0 | |
srandmember key nums | 从key集合中随机抽取nums个元素。 | |
spop key | 随机删除一些key集合中的元素。 | |
smove source destination member | 将原集合source中的member元素移动到destination集合中。 | |
sdiff key1 key2 | 取出key1中与key2集合的不同元素,差集 | |
sinter key1 key2 | 取key1与key2两个集合中相同的元素,交集 | |
sunion key1 key2 | 将key1与key2两个集合中的元素合在一起,并集 |
总结
- Redis 的集合是字符串的无序集合。
- 在Set集合当中,是不允许有重复的。
- Set是通过hash table实现的,可以进行添加、删除和查找。对集合我们可以取并集,交集,差集。
应用场景
- 共同关注、共同爱好、二度好友、QQ的好友推荐
有序集合(Sorted sets)
Redis有序集合和Redis集合类似,是不包含 相同字符串的合集。它们的差别是,每个有序集合 的成员都关联着一个评分(score),这个评分用于把有序集 合中的成员按最低分到最高分排列。
常用命令
命令 | 描述 | 实例 |
---|---|---|
zadd key score value | 将一个或多个 value 及其 socre 加入到 set 中 | |
zrange key start end | 0 和-1 表示从索引为 0 的元素到最后一个元素(同 LRANGE 命令相似) | |
zrange key 0 -1 withscores | 也可以连同 score 一块输出,使用 WITHSCORES 参数 | |
zremrangebyscore key start end | 可用于范围删除操作 | |
zrangebyscore key min max | 升序排序操作,将key按最小值到最大值进行输出。 | |
zrevrange salary 0 -1 | 倒序全部输出 | |
zrevrangebyscore key max min | 降序排序操作,将key按照从大到小排序输出 | |
zrem key value | 删除指定的元素 | |
zcard key | 获取有序集合中的个数 | |
zcount key min max | 获取指定区间的成员数量 |
应用场景
- 各种排行榜