从五种基本数据类型了解Redis

954 阅读12分钟

这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战

Redis

Redis是使用C语言开发的高性能键值对(key-value),是一种基于内存的非关系型数据库,可以用作数据库、缓存、消息中间件等。

Redis的优点

  • 基于内存操作,性能优秀、读写速度非常快。

  • 支持多种数据类型。包括string、list、set、hash、sortedset五种基本数据类型,还包括geospatal、HyperLogLog、BitMaps三种特殊的数据类型

  • 支持数据持久化。Redis提供了AOF和RDB两种持久化方式,可以将内存中的数据持久化到磁盘中,当Redis重启时会加载之前保存到磁盘的数据到内存中。

  • 可以用作消息中间件,支持发布订阅

  • 主从复制、哨兵、高可用。Redis支持主从复制,允许将一台主Redis服务器中的数据复制到另一台从Redis服务器中,且提供了哨兵模式(即当主节点崩掉后,自动选取新的主节点的机制),保证了Redis集群环境下的高可用

五种基本数据类型

🚨注意:下面讲的数据类型是指Redis值的数据类型,而Redis键的类型总是string

字符串string

字符串string是Redis最基本的数据类型,一个key对应一个value,其中value不仅可以是字符串,也可以是整型数据。

常见操作
  • get key(根据键获取对应的值)
  • set key value(添加一个键值对)
  • del key(根据key删除对应的键值对)
  • mset key1 value1 key2 value2..(一次添加多个键值对)
  • mget key1 key2 ..(根据多个键一次获取多个键值对的值)
  • strlen key(根据键获取对应键值对的值的字符长度)
  • append key value(将指定的字符串追加到键值对中key对应的value上)

✨string在Redis中存储的默认就是一个string类型的数据,当使用incr、decr操作时会将字符串类型的值转换成整形或者浮点型然后再进行计算。🚨注意:如果原始的数据类型不能转换为整形或者浮点型、或者处理的数值超过了redis数值计算的最大值(long的最大值),则会报错。

  • incr key (将key对应的value的值+1)

  • incrby key 数值 (将key对应的value的值加上指定的整数值)

  • incrbyfloat key 数值 (将key对应的value的值加上指定的单浮点数值)

  • decr key(将key对应的value的值-1)

  • decr key 数值(将key对应的value的值减去指定的整数值)

⏰设置键值对的有效时间

  • setex key 秒 value

  • psetex key 毫秒 value

应用场景

如在掘金中对一篇文章进行点赞,增加点赞量、显示文章浏览量.

  1. 初始化
  • set post:id:00001:views 0
  • set post:id:00001:live 0
  1. 增加点赞、增加阅读量、显示阅读量:
  • incr post:id:00001:live

  • incr post:id:00001:views

  • get post:id:00001:views

image.png

哈希hash

hash数据类型是一个存储多个键值(key-value)的集合,可以将其看为key-Map{(field1,value1),(field2,value2)...},由字段field与值value相关联组成的映射,字段和值都是字符串,其中Map里面可以存储2^32-1个field-value键值对,不允许存储重复的key,特别适合存储对象。

image.png

常见操作
  • hset key field value 存储一个field value键值对

  • hmset key field1 value1 field2 value2... 一次存储多个field value

  • hget key field 获取指定的field对应的值

  • hgetall key 获取所有的field和value,效率低

  • hmget key field1 field2 一次获取多个字段值

  • hlen key 获取集合长度

  • hdel key field 根据key、field删除指定的键值对

  • hexists key field 判断hash中的某个key是否存在

  • hkeys key 获取所有的field

  • hvals key 获取所有的value

  • hincrby key field 自增值 将指定的field对应的value自增(指定自增值)

  • hincrbyfloat key field 自增值 将指定的field对应的value自增(指定自增值),为浮点类型

  • hsetnx key field value 如果hash集合中不存在指定的filed则可以添加该键值对

  • hlen key 获取指定hash表的数量

  • hexists key field 判断指定hash中的指定字段filed是否存在(存在时返回1)

  • hkeys key 根据key获取所有的field

  • hvals key 根据key获取所有的field对应的value

应用场景

hash数据类型实现购物车中的基本操作,如选中购物车中的所有商品、移除商品、增加/减少对应商品的购买数量。如下图所示,一用户id作为key,为每位用户创建一个hash存储结构来存储该用户对应的购物车信息,其中涉及以下操作:

  • 添加商品到购物车:hset key(用户id) filed(商品id) value(商品数量)

  • 显示购物车所有商品及每个商品对应数量:hgetall key

  • 增加、减少商品数量:hincrby key(用户id) field(商品id) 1(数量+1)/-1(数量-1)

  • 删除选中的商品: hdel key(用户id) field(商品id)..

  • 获取购物车总量:hlen key(用户id)

🚨注意:以上的操作并还没有加快购物车页面的呈现速度,因为我们的hash中field存储的是商品的id,要显示商品对应的信息还需要根据商品id去数据库查询后再返回显示,因此我们可以再定义一个field-value对来存储商品信息,添加商品信息时使用hsetnx key(用户id) field2(商品id) value2(商品信息)

shop.png

列表list

list数据类型是一种简单的有序的字符串列表,保存的数据都是字符串类型,底层采用双向链表存储结构实现。可以实现添加一个元素到列表的左边或者右边,可以从列表的左边或者右边取出元素,可以存储重复的元素,最多可以存储2^32-1个元素。

常见操作
  1. 添加:
  • lpush key value1 value2.. 将元素添加到列表左边(可以一次添加多个),返回值为添加后集合的长度

  • rpush key value 将元素添加到列表右边

  • linsert key before/after "value1" value2 将value2插入到指定的list集合中的value为value1的前面或后面

  1. 获取:
  • lrange key start end 范围获取

  • lindex key index 获取指定位置的元素

  • llen key 获取list集合中元素的数量

  1. 获取并移除数据:
  • lpop key:删除列表最左边元素,并将元素返回

- rpop key:删除列表最右边元素,并将元素返回

  1. 扩展操作
  • blpop key[key ...] timeout 取出集合左边的元素,并设置取出元素对应的存活时间(单位:秒),设置该值后,不会像lpop取出元素后立即移除元素。

  • brpop key[key ...] timeout

  • lrem key count value 删除指定key的集合中指定的value元素,当集合里存储有多个待删除元素,则可以通过count指定删除的数量。

应用场景

例如微信朋友圈点赞,按照点赞顺序显示好友信息。可以以盆友圈文章的id为key,value为点赞好友的信息来实现,涉及以下几个操作:

  • rpush key(文章id) value(好友信息) 点赞

  • lrem key(文章id) count(移除的数量,这里为1) value(好友信息) 取消点赞

  • lrange key(文章id) 0 -1 顺序显示所有点赞信息

wx.png

集合set

set是string类型的无序不允许重复集合,其底层是通过hashtable实现的。

常见操作
  • 存储:sadd key member [member....]

  • 获取set集合中所有元素smembers key

  • 删除set集合中某个元素 srem key value

  • 判断set集合中是否存在指定的元素 sismember key value

  • 查看指定set集合的所有值 smembers key

  • 获取指定set集合中元素的个数 scard key

  • 从指定的set集合中随机获一个元素 srandmember key

  • 从指定的set集合中随机获n个元素 srandmember key n

  • 随机删除指定set集合中某些元素并返回删除的元素 spop key

  • 将一个set集合中指定的值移动到另一个set集合中 smove 源集合的key 目标集合的key 源集合中的所要移动的元素

  • 获取指定两个集合之间的差集 sdiff key1 key2 [key...]

  • 获取指定两个集合之间的交集 sinter key1 key2 [key...]

  • 获取指定两个集合之间的并集 sunion key1 key2 [key...]

  • 获取指定两个集合之间的并集保存到另一个新的set集合中sunionstore 新set集合的key key1 key2 [key...]

应用场景
  • 如微信抽奖,使用sadd key userId 将参与抽奖的用户id保存到set集合中,使用命令smembers key 查看set集合的所有元素,可通过命令spop key 数量 随机抽选出中奖者,使用spop命令后会将已中奖的用户的id从set集合中移除(即可实现已中奖的用户不能再参与下一个奖项的抽奖),而用srandmember key 数量随机抽取中奖者后,不会将已中奖的用户id从set集合中删除。

  • 如获取微博中两个用户对于他们的共同关注🏆,可以将两个用户各自的关注存储到set集合中sadd 用户id 被关注者信息,然后通过sinter 用户1Id 用户2Id求他们两个用户各自关注的大V的交集,就是他们的共同关注。

  • 网站访问量统计。

    1. PV(网站被访问次数,刷新访问量会+1),使用string类型即可实现,调用incr key增加访问量、通过get key获取总访问量。
    2. UV(网站被用户访问的次数,根据用户id来统计),利用set集合的数据去重功能,使用一个set集合来存储访问网站的用户的id,访问网站时调用sadd userId,当同一个用户多次访问时,当第一次访问后再添加不会成功,从而实现UV统计。
    3. IP(网站被不同IP访问的次数,IP不变,用户变,IP访问数不变),统计使用set集合的去重,将访问Ip保存到set集合中。

有序集合sortedset

有序集合sortedset,也叫Zset,其和set集合一样都是string类型元素的集合,不允许存储重复的元素,与set不同的是Zset可以通过关联一个Double类型权重的参数score,将存入到集合中的元素按照该参数score进行排序,所以Zset是有序的集合。

常见操作
  • 存储 zadd key score[依据这个值来排序] value 🚨注意:如果重复添加相同数据,则score值将被覆盖。如下示例:
127.0.0.1:6379> zadd zkey2 2 test
(integer) 1
127.0.0.1:6379> zadd zkey2 3 test
(integer) 0
127.0.0.1:6379> zscore zkey2 test
"3"
127.0.0.1:6379> 

  • 获取 zrange key start value [withscores]

  • 获取集合中某个区间的元素数量 zcount key min max

  • 根据score获取指定区间的元素 zrangebyscore key min max [withscores]

  • 删除 zrem key value

  • 根据排好序的集合删除指定区间的元素 zremrangebyrank key start stop

  • 根据score删除指定区间的元素 zremrangebyscore key min max

  • 查看指定key的有序集合中元素的个数 zcard key

  • 获取指定区间的成员数量 zcount key start end [withscores]

  • 将zrange排序的结果反转(倒序) zrevrange key start end [withscores]

  • 求两个或多个集合的交集,并将交集保存到一个新的set集合中 zinterstore destination(存储得出的交集) numberkey(进行交集操作的集合个数) key1 key2 [key...]

  • 求两个或多个集合的并集,并将交集保存到一个新的set集合中 zunionstore destination(存储得出的并集) numberkey(进行并集操作的集合个数) key1 key2 [key...]

  • 根据score反转集合中某个区间的元素 zrevrangebyscore key max min [withscores]

  • 根据score排序获取所有元素如果添加了withscores,则会在获取的每一个元素附带score权重 zrangebyscore key -inf +inf [withscores],如下示例:

127.0.0.1:6379> zadd salary 2500 xiaoming (integer) 1 
127.0.0.1:6379> zadd salary 2000 xiaohong (integer) 1 
127.0.0.1:6379> zadd salary 3000 libai (integer) 1 
127.0.0.1:6379> zrangebyscore salary -inf +inf 
1) "xiaohong" 
2) "xiaoming" 
3) "libai" 
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores #获取所有元素并附带score 
1) "xiaohong" 
2) "2000" 
3) "xiaoming" 
4) "2500" 
5)"libai" 
6) "3000"
  • 获取集合中指定元素的索引 zrank key 元素member

  • 获取集合中元素的权重score值 zscore key member(指定元素)

  • 修改集合中指定元素对应的score值 zincrby key increment(增加或减少的值) member(指定元素) ,如下示例

127.0.0.1:6379> zscore zkey1 zvalue2
"3"
127.0.0.1:6379> zincrby zkey1 1 zvalue2
"4"
127.0.0.1:6379> zincrby zkey1 2 zvalue2
"6"
127.0.0.1:6379> zincrby zkey1 -2 zvalue2
"4"
应用场景

如热搜排行版,以文章id为key、搜索量为score进行排序显示

wb无标题.png

key操作

为key设置指定的有效时间

  • expire key seconds 指定key在多少秒后失效

  • pexpire key milliseconds指定key在多少豪秒后失效

  • expireat key timestamp 采用时间戳的形式设置失效时间

  • pexpireat key milliseconds-timestamp采用时间戳+毫秒的的形式设置失效时间

获取key的有效时间

  • ttl key

  • pttl key

将key从时效性转为永久性

  • persist key

key查询操作

  • keys pattern

  • pattern 的匹配模式

    1. keys * 表示查询所有
    2. keys pro* 表示查询所有以pro开头的key
    3. keys am* 表示查询所有以am结尾的key
    4. keys ??pro 表示查询所有前面有任意两个字符且最后以pro结尾的key
    5. keys pro? 表示查询所有以pro开头、最后包含一个任意字符的key
    6. keys no[a|b]pro 表示查询所有以no开头、以pro结尾、中间为a或者b的key

🏁以上就是对Redis简单介绍,如果有错误的地方,还请留言指正,如果觉得本文对你有帮助那就点个赞👍吧😋😻😍

默认标题_动态分割线_2021-07-15-0.gif