redis-5种基础数据类型
redis-5种基础数据类型
redis数据结构简介
首先对redis来说,所有的key(键)都是字符串。我们在谈基础数据结构时,讨论的是存储值的数据类型,主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash。
结构类 型 | 结构存储的值 | 结构的读写能力 |
---|---|---|
String字符串 | 可以是字符串、整数或浮点数 | 对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作; |
List列表 | 一个链表,链表上的每个节点都包含一个字符串 | 对链表的两端进行push和pop操作,读取单个或多个元素;根据值查找或删除元素; |
Set集合 | 包含字符串的无序集合 | 字符串的集合,包含基础的方法有看是否存在添加、获取、删除;还包含计算交集、并集、差集等 |
Hash散列 | 包含键值对的无序散列表 | 包含方法有添加、获取、删除单个元素 |
Zset有序集合 | 和散列一样,用于存储键值对 | 字符串成员与浮点数分数之间的有序映射;元素的排列顺序由分数的大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素 |
String
String是redis中最基本的数据类型,一个key对应一个value。
常用命令
set key value
get key
同时设置多个键值
MSET key value [key value ....]
MGET key [key ....]
--实例
redis_qinglaing:0>mset key1 v1 key2 v2
"OK"
redis_qinglaing:0>mget key key2
1) null
2) "v2"
redis_qinglaing:0>mget key1 key2
1) "v1"
2) "v2"
redis_qinglaing:0>
数字增减
- 递增数字
INCR key
- 增加指定数字
INCRBY key increment
- 递减数字
DECR key
- 减少指定数字(整数)
DECRBY key decrement
获取字符串长度
STRLEN key
分布式锁
setnx key value
--示例
redis> EXISTS job # job 不存在
(integer) 0
redis> SETNX job "programmer" # job 设置成功
(integer) 1
redis> SETNX job "code-farmer" # 尝试覆盖 job ,失败
(integer) 0
redis> GET job # 没有被覆盖
"programmer"
set key value [EX seconds] [PX milliseconds] [NX|XX]
redis_qinglaing:0>set lock1 order ex 10 nx
"OK"
redis_qinglaing:0>set lock1 order ex 10 nx
null
redis_qinglaing:0>
- EX:key在多少秒后过期
- PX:key在多少毫秒后过期
- NX:当key不存在的时候,才创建key,效果等同于setnx
- XX:当key存在的时候,覆盖key
应用场景
- 可以当做自增主键
- 解决系统幂等性问题
- 抖音无线点赞、点击喜欢的文章
- 缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。
List
Redis中的List其实就是链表(Redis用双端链表实现List)。
命令使用
命令 | 简述 | 使用 |
---|---|---|
RPUSH | 将给定值推入到列表右端 | RPUSH key value |
LPUSH | 将给定值推入到列表左端 | LPUSH key value |
RPOP | 从列表的右端弹出一个值,并返回被弹出的值 | RPOP key |
LPOP | 从列表的左端弹出一个值,并返回被弹出的值 | LPOP key |
LRANGE | 获取列表在给定范围上的所有值 | LRANGE key 0 -1 |
LINDEX | 通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 | LINEX key index |
使用列表的技巧
lpush+lpop=Stack(栈)
lpush+rpop=Queue(队列)
lpush+ltrim=Capped Collection(有限集合)
lpush+brpop=Message Queue(消息队列)
命令执行
redis_qinglaing:0>LPUSH list01 1
"1"
redis_qinglaing:0>LPUSH list01 2
"2"
redis_qinglaing:0>LPUSH list01 3 4
"4"
redis_qinglaing:0>LRANGE 0 3
"ERR wrong number of arguments for 'lrange' command"
redis_qinglaing:0>LRANGE list01 0 3
1) "4"
2) "3"
3) "2"
4) "1"
redis_qinglaing:0>
使用场景
- 微博TimeLine: 有人发布微博,用lpush加入时间轴,展示新的列表信息。
- 展示产品评论,按时间排序
hash
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
命令使用
命令 | 简述 | 使用 |
---|---|---|
HSET | 添加键值对 | HSET hash-key sub-key1 value1 |
HGET | 获取指定散列键的值 | HGET hash-key key1 |
HGETALL | 获取散列中包含的所有键值对 | HGETALL hash-key |
HDEL | 如果给定键存在于散列中,那么就移除这个键 | HDEL hash-key sub-key1 |
命令执行
redis_qinglaing:0>hset user name liu
"1"
redis_qinglaing:0>hset user name liu
"0"
redis_qinglaing:0>hset user name liu
"0"
redis_qinglaing:0>hset user phone 123
"1"
redis_qinglaing:0>hgetall user
1) "name"
2) "liu"
3) "phone"
4) "123"
redis_qinglaing:0>
实战场景
缓存:能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。
set
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
命令使用
- 命令使用
命令 | 简述 | 使用 |
---|---|---|
SADD | 向集合添加一个或多个成员 | SADD key value |
SREM | 删除元素 | SREM key value |
SCARD | 获取集合的成员数 | SCARD key |
SMEMBERS | 返回集合中的所有成员 | SMEMBERS key member |
SISMEMBER | 判断 member 元素是否是集合 key 的成员 | SISMEMBER key member |
- 命令使用-集合
集合
SDIFF | 集合的差集运算 A-B | SDIFF key [key ...] |
---|---|---|
SINTER | 集合的交集运算 A∩B | SINTER key [key ...] |
SUNION | 集合的并集运算 A ∪ B | SUNION key [key ...] |
命令执行
实战场景
点赞,收藏
社交软件,我关注的人他也关注
qq推送可能认识的人
Zset
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的, 但分数(score)却可以重复。有序集合是通过两种数据结构实现:
- 压缩列表(ziplist): ziplist是为了提高存储效率而设计的一种特殊编码的双向链表。它可以存储字符串或者整数,存储整数时是采用整数的二进制而不是字符串形式存储。它能在O(1)的时间复杂度下完成list两端的push和pop操作。但是因为每次操作都需要重新分配ziplist的内存,所以实际复杂度和ziplist的内存使用量相关
- 跳跃表(zSkiplist): 跳跃表的性能可以保证在查找,删除,添加等操作的时候在对数期望时间内完成,这个性能是可以和平衡树来相比较的,而且在实现方面比平衡树要优雅,这是采用跳跃表的主要原因。跳跃表的复杂度是O(log(n))。
命令使用
命令 | 简述 |
---|---|
ZADD key score member [score member ...] | 向有序集合中加入一个元素和该元素的分数 |
ZRANGE key start stop [WITHSCORES] | 按照元素分数从小到大的顺序,返回索引从start到stop之间的所有元素 |
ZSCORE key member | 获取元素的分数 |
ZREM key member [member ...] | 删除元素 |
命令执行
127.0.0.1:6379> zadd myscoreset 100 hao 90 xiaohao
(integer) 2
127.0.0.1:6379> ZRANGE myscoreset 0 -1
1) "xiaohao"
2) "hao"
127.0.0.1:6379> ZSCORE myscoreset hao
"100"
实战场景
根据商品销售对商品进行排序显示
小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行
参考
https://www.pdai.tech/md/db/nosql-redis/db-redis-data-types.html